From fd207637bec9a40592b21880e878afeb17da2093 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" Date: Thu, 20 Jul 2023 20:18:34 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20dfinity/?= =?UTF-8?q?motoko@47fb734bb8ed766f9432c99d77ddda1f2be8ef83=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/niv-updater-rare.yml | 31 + .github/workflows/niv-updater-trial.yml | 36 + .github/workflows/niv-updater.yml | 32 + .github/workflows/release.yml | 99 + .github/workflows/test.yml | 79 + .github/workflows/update-hash.yml | 38 + base-doc/Array.html | 331 + base-doc/AssocList.html | 195 + base-doc/Blob.html | 135 + base-doc/Bool.html | 16 + base-doc/Buffer.html | 1144 + base-doc/CertifiedData.html | 35 + base-doc/Char.html | 21 + base-doc/Debug.html | 34 + base-doc/Deque.html | 126 + base-doc/Error.html | 38 + base-doc/ExperimentalCycles.html | 117 + base-doc/ExperimentalInternetComputer.html | 34 + base-doc/ExperimentalStableMemory.html | 218 + base-doc/Float.html | 458 + base-doc/Func.html | 23 + base-doc/Hash.html | 16 + base-doc/HashMap.html | 206 + base-doc/Heap.html | 103 + base-doc/Int.html | 178 + base-doc/Int16.html | 216 + base-doc/Int32.html | 216 + base-doc/Int64.html | 216 + base-doc/Int8.html | 216 + base-doc/Iter.html | 66 + base-doc/IterType.html | 3 + base-doc/List.html | 429 + base-doc/Nat.html | 183 + base-doc/Nat16.html | 45 + base-doc/Nat32.html | 45 + base-doc/Nat64.html | 45 + base-doc/Nat8.html | 45 + base-doc/None.html | 8 + base-doc/Option.html | 55 + base-doc/Order.html | 8 + base-doc/Prelude.html | 13 + base-doc/Principal.html | 145 + base-doc/RBTree.html | 250 + base-doc/Random.html | 81 + base-doc/Result.html | 49 + base-doc/Stack.html | 46 + base-doc/Text.html | 136 + base-doc/Time.html | 9 + base-doc/Timer.html | 27 + base-doc/Trie.html | 487 + base-doc/TrieMap.html | 209 + base-doc/TrieSet.html | 16 + base-doc/index.html | 497 + base-doc/nix-support/hydra-build-products | 1 + base-doc/styles.css | 162 + coverage/codegen/compile.ml.html | 34258 +++ coverage/codegen/die.ml.html | 1668 + coverage/codegen/instrList.ml.html | 971 + coverage/coverage.css | 500 + coverage/coverage.js | 164 + coverage/exes/deser.ml.html | 1860 + coverage/exes/didc.ml.html | 288 + coverage/exes/mo_ld.ml.html | 268 + coverage/exes/moc.ml.html | 1052 + coverage/highlight.pack.js | 2 + coverage/ic/url.ml.html | 317 + coverage/idllib/arrange_idl.ml.html | 818 + coverage/idllib/compile_js.ml.html | 851 + coverage/idllib/escape.ml.html | 601 + coverage/idllib/exception.ml.html | 41 + coverage/idllib/flags.ml.html | 47 + coverage/idllib/idlHash.ml.html | 59 + coverage/idllib/lexer.ml.html | 9559 + coverage/idllib/parser.ml.html | 17726 ++ coverage/idllib/pipeline.ml.html | 613 + coverage/idllib/resolve_import.ml.html | 139 + coverage/idllib/typing.ml.html | 802 + coverage/index.html | 1016 + coverage/ir_def/arrange_ir.ml.html | 695 + coverage/ir_def/check_ir.ml.html | 3746 + coverage/ir_def/construct.ml.html | 2397 + coverage/ir_def/freevars.ml.html | 497 + coverage/ir_def/ir.ml.html | 1012 + coverage/ir_def/ir_effect.ml.html | 354 + coverage/ir_def/ir_utils.ml.html | 68 + coverage/ir_def/note.ml.html | 83 + coverage/ir_def/rename.ml.html | 582 + coverage/ir_interpreter/interpret_ir.ml.html | 3236 + coverage/ir_passes/async.ml.html | 1625 + coverage/ir_passes/await.ml.html | 1971 + coverage/ir_passes/const.ml.html | 757 + coverage/ir_passes/eq.ml.html | 1024 + coverage/ir_passes/erase_typ_field.ml.html | 712 + coverage/ir_passes/show.ml.html | 1147 + coverage/ir_passes/tailcall.ml.html | 851 + coverage/lang_utils/diag.ml.html | 338 + coverage/lang_utils/dom.ml.html | 93 + coverage/lang_utils/env.ml.html | 145 + coverage/lang_utils/error_codes.ml.html | 626 + coverage/lang_utils/expGraph.ml.html | 710 + coverage/lang_utils/lbool.ml.html | 174 + coverage/lang_utils/nameRel.ml.html | 280 + coverage/lang_utils/scc.ml.html | 311 + coverage/lang_utils/source.ml.html | 126 + coverage/lib/lib.ml.html | 2768 + coverage/linking/linkModule.ml.html | 2781 + coverage/lowering/desugar.ml.html | 3514 + coverage/mo_config/args.ml.html | 150 + coverage/mo_config/flags.ml.html | 182 + coverage/mo_config/internal_error.ml.html | 65 + coverage/mo_def/arrange.ml.html | 1050 + coverage/mo_def/compUnit.ml.html | 420 + coverage/mo_def/syntax.ml.html | 1075 + coverage/mo_def/trivia.ml.html | 350 + coverage/mo_frontend/bi_match.ml.html | 1073 + coverage/mo_frontend/coverage.ml.html | 1193 + coverage/mo_frontend/definedness.ml.html | 769 + coverage/mo_frontend/effect.ml.html | 487 + coverage/mo_frontend/error_reporting.ml.html | 440 + coverage/mo_frontend/lexer.ml.html | 290 + coverage/mo_frontend/lexer_lib.ml.html | 116 + .../menhir_error_reporting.ml.html | 567 + coverage/mo_frontend/parser.ml.html | 97187 +++++++++ coverage/mo_frontend/parser_lib.ml.html | 56 + coverage/mo_frontend/parsing.ml.html | 380 + coverage/mo_frontend/printers.ml.html | 912 + coverage/mo_frontend/source_lexer.ml.html | 21084 ++ coverage/mo_frontend/source_token.ml.html | 1419 + coverage/mo_frontend/stability.ml.html | 260 + coverage/mo_frontend/static.ml.html | 439 + coverage/mo_frontend/traversals.ml.html | 312 + coverage/mo_frontend/typing.ml.html | 8775 + coverage/mo_frontend/variance.ml.html | 284 + coverage/mo_idl/idl_to_mo.ml.html | 444 + coverage/mo_idl/mo_to_idl.ml.html | 714 + coverage/mo_interpreter/interpret.ml.html | 3661 + coverage/mo_types/arrange_type.ml.html | 293 + coverage/mo_types/async_cap.ml.html | 80 + coverage/mo_types/cons.ml.html | 191 + coverage/mo_types/expansive.ml.html | 679 + coverage/mo_types/hash.ml.html | 71 + coverage/mo_types/productive.ml.html | 240 + coverage/mo_types/scope.ml.html | 155 + coverage/mo_types/typ_hash.ml.html | 625 + coverage/mo_types/type.ml.html | 5681 + coverage/mo_values/arrange_ops.ml.html | 170 + coverage/mo_values/call_conv.ml.html | 156 + coverage/mo_values/numerics.ml.html | 1253 + coverage/mo_values/operator.ml.html | 921 + coverage/mo_values/prim.ml.html | 1376 + coverage/mo_values/show.ml.html | 386 + coverage/mo_values/value.ml.html | 867 + coverage/nix-support/hydra-build-products | 1 + coverage/pipeline/pipeline.ml.html | 2342 + coverage/pipeline/resolve_import.ml.html | 878 + coverage/prelude/prelude.ml.html | 59 + coverage/profiler/counters.ml.html | 526 + coverage/profiler/profiler.ml.html | 112 + coverage/profiler/profilerFlags.ml.html | 50 + coverage/rts/rts.ml.html | 113 + coverage/source_id/generated.ml.html | 41 + coverage/source_id/source_id.ml.html | 51 + coverage/viper/pretty.ml.html | 859 + coverage/viper/trans.ml.html | 1629 + coverage/wasm-exts/abbreviation.ml.html | 560 + coverage/wasm-exts/ast.ml.html | 936 + coverage/wasm-exts/customModule.ml.html | 263 + coverage/wasm-exts/customModuleDecode.ml.html | 2961 + coverage/wasm-exts/customModuleEncode.ml.html | 4020 + coverage/wasm-exts/dwarf5.ml.html | 2104 + coverage/wasm-exts/operators.ml.html | 737 + docs/html/about-this-guide.html | 372 + docs/html/actor-classes.html | 277 + docs/html/actors-async.html | 603 + docs/html/advanced-discussion.html | 189 + docs/html/base-intro.html | 220 + docs/html/basic-concepts.html | 789 + docs/html/caller-id.html | 236 + docs/html/compatibility.html | 553 + docs/html/compiler-ref.html | 443 + docs/html/control-flow.html | 490 + docs/html/cycles.html | 369 + docs/html/errors.html | 368 + docs/html/extrastuff.html | 230 + docs/html/heartbeats.html | 200 + docs/html/language-manual.html | 4193 + docs/html/local-objects-classes.html | 557 + docs/html/message-inspection.html | 325 + docs/html/modules-and-imports.html | 350 + docs/html/motoko-grammar.html | 181 + docs/html/motoko-introduction.html | 384 + docs/html/motoko.html | 307 + docs/html/mutable-state.html | 485 + docs/html/overview.html | 1064 + docs/html/pattern-matching.html | 392 + docs/html/pipes.html | 218 + docs/html/sharing.html | 382 + docs/html/stablememory.html | 290 + docs/html/structural-equality.html | 254 + docs/html/style.html | 985 + docs/html/timers.html | 206 + docs/html/upgrades.html | 439 + docs/nix-support/hydra-build-products | 2 + docs/overview-slides.html | 743 + flamegraphs/assetstorage-reverse.svg | 4325 + flamegraphs/assetstorage.svg | 1469 + flamegraphs/dao-reverse.svg | 561 + flamegraphs/dao.svg | 569 + flamegraphs/index.html | 26 + flamegraphs/nix-support/hydra-build-products | 1 + flamegraphs/qr-reverse.svg | 162889 +++++++++++++++ flamegraphs/qr.svg | 16469 ++ flamegraphs/reversi-reverse.svg | 3369 + flamegraphs/reversi.svg | 1425 + flamegraphs/sha256-reverse.svg | 573 + flamegraphs/sha256.svg | 453 + index.html | 49 + 217 files changed, 498724 insertions(+) create mode 100644 .github/workflows/niv-updater-rare.yml create mode 100644 .github/workflows/niv-updater-trial.yml create mode 100644 .github/workflows/niv-updater.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/update-hash.yml create mode 100644 base-doc/Array.html create mode 100644 base-doc/AssocList.html create mode 100644 base-doc/Blob.html create mode 100644 base-doc/Bool.html create mode 100644 base-doc/Buffer.html create mode 100644 base-doc/CertifiedData.html create mode 100644 base-doc/Char.html create mode 100644 base-doc/Debug.html create mode 100644 base-doc/Deque.html create mode 100644 base-doc/Error.html create mode 100644 base-doc/ExperimentalCycles.html create mode 100644 base-doc/ExperimentalInternetComputer.html create mode 100644 base-doc/ExperimentalStableMemory.html create mode 100644 base-doc/Float.html create mode 100644 base-doc/Func.html create mode 100644 base-doc/Hash.html create mode 100644 base-doc/HashMap.html create mode 100644 base-doc/Heap.html create mode 100644 base-doc/Int.html create mode 100644 base-doc/Int16.html create mode 100644 base-doc/Int32.html create mode 100644 base-doc/Int64.html create mode 100644 base-doc/Int8.html create mode 100644 base-doc/Iter.html create mode 100644 base-doc/IterType.html create mode 100644 base-doc/List.html create mode 100644 base-doc/Nat.html create mode 100644 base-doc/Nat16.html create mode 100644 base-doc/Nat32.html create mode 100644 base-doc/Nat64.html create mode 100644 base-doc/Nat8.html create mode 100644 base-doc/None.html create mode 100644 base-doc/Option.html create mode 100644 base-doc/Order.html create mode 100644 base-doc/Prelude.html create mode 100644 base-doc/Principal.html create mode 100644 base-doc/RBTree.html create mode 100644 base-doc/Random.html create mode 100644 base-doc/Result.html create mode 100644 base-doc/Stack.html create mode 100644 base-doc/Text.html create mode 100644 base-doc/Time.html create mode 100644 base-doc/Timer.html create mode 100644 base-doc/Trie.html create mode 100644 base-doc/TrieMap.html create mode 100644 base-doc/TrieSet.html create mode 100644 base-doc/index.html create mode 100644 base-doc/nix-support/hydra-build-products create mode 100644 base-doc/styles.css create mode 100644 coverage/codegen/compile.ml.html create mode 100644 coverage/codegen/die.ml.html create mode 100644 coverage/codegen/instrList.ml.html create mode 100644 coverage/coverage.css create mode 100644 coverage/coverage.js create mode 100644 coverage/exes/deser.ml.html create mode 100644 coverage/exes/didc.ml.html create mode 100644 coverage/exes/mo_ld.ml.html create mode 100644 coverage/exes/moc.ml.html create mode 100644 coverage/highlight.pack.js create mode 100644 coverage/ic/url.ml.html create mode 100644 coverage/idllib/arrange_idl.ml.html create mode 100644 coverage/idllib/compile_js.ml.html create mode 100644 coverage/idllib/escape.ml.html create mode 100644 coverage/idllib/exception.ml.html create mode 100644 coverage/idllib/flags.ml.html create mode 100644 coverage/idllib/idlHash.ml.html create mode 100644 coverage/idllib/lexer.ml.html create mode 100644 coverage/idllib/parser.ml.html create mode 100644 coverage/idllib/pipeline.ml.html create mode 100644 coverage/idllib/resolve_import.ml.html create mode 100644 coverage/idllib/typing.ml.html create mode 100644 coverage/index.html create mode 100644 coverage/ir_def/arrange_ir.ml.html create mode 100644 coverage/ir_def/check_ir.ml.html create mode 100644 coverage/ir_def/construct.ml.html create mode 100644 coverage/ir_def/freevars.ml.html create mode 100644 coverage/ir_def/ir.ml.html create mode 100644 coverage/ir_def/ir_effect.ml.html create mode 100644 coverage/ir_def/ir_utils.ml.html create mode 100644 coverage/ir_def/note.ml.html create mode 100644 coverage/ir_def/rename.ml.html create mode 100644 coverage/ir_interpreter/interpret_ir.ml.html create mode 100644 coverage/ir_passes/async.ml.html create mode 100644 coverage/ir_passes/await.ml.html create mode 100644 coverage/ir_passes/const.ml.html create mode 100644 coverage/ir_passes/eq.ml.html create mode 100644 coverage/ir_passes/erase_typ_field.ml.html create mode 100644 coverage/ir_passes/show.ml.html create mode 100644 coverage/ir_passes/tailcall.ml.html create mode 100644 coverage/lang_utils/diag.ml.html create mode 100644 coverage/lang_utils/dom.ml.html create mode 100644 coverage/lang_utils/env.ml.html create mode 100644 coverage/lang_utils/error_codes.ml.html create mode 100644 coverage/lang_utils/expGraph.ml.html create mode 100644 coverage/lang_utils/lbool.ml.html create mode 100644 coverage/lang_utils/nameRel.ml.html create mode 100644 coverage/lang_utils/scc.ml.html create mode 100644 coverage/lang_utils/source.ml.html create mode 100644 coverage/lib/lib.ml.html create mode 100644 coverage/linking/linkModule.ml.html create mode 100644 coverage/lowering/desugar.ml.html create mode 100644 coverage/mo_config/args.ml.html create mode 100644 coverage/mo_config/flags.ml.html create mode 100644 coverage/mo_config/internal_error.ml.html create mode 100644 coverage/mo_def/arrange.ml.html create mode 100644 coverage/mo_def/compUnit.ml.html create mode 100644 coverage/mo_def/syntax.ml.html create mode 100644 coverage/mo_def/trivia.ml.html create mode 100644 coverage/mo_frontend/bi_match.ml.html create mode 100644 coverage/mo_frontend/coverage.ml.html create mode 100644 coverage/mo_frontend/definedness.ml.html create mode 100644 coverage/mo_frontend/effect.ml.html create mode 100644 coverage/mo_frontend/error_reporting.ml.html create mode 100644 coverage/mo_frontend/lexer.ml.html create mode 100644 coverage/mo_frontend/lexer_lib.ml.html create mode 100644 coverage/mo_frontend/menhir_error_reporting.ml.html create mode 100644 coverage/mo_frontend/parser.ml.html create mode 100644 coverage/mo_frontend/parser_lib.ml.html create mode 100644 coverage/mo_frontend/parsing.ml.html create mode 100644 coverage/mo_frontend/printers.ml.html create mode 100644 coverage/mo_frontend/source_lexer.ml.html create mode 100644 coverage/mo_frontend/source_token.ml.html create mode 100644 coverage/mo_frontend/stability.ml.html create mode 100644 coverage/mo_frontend/static.ml.html create mode 100644 coverage/mo_frontend/traversals.ml.html create mode 100644 coverage/mo_frontend/typing.ml.html create mode 100644 coverage/mo_frontend/variance.ml.html create mode 100644 coverage/mo_idl/idl_to_mo.ml.html create mode 100644 coverage/mo_idl/mo_to_idl.ml.html create mode 100644 coverage/mo_interpreter/interpret.ml.html create mode 100644 coverage/mo_types/arrange_type.ml.html create mode 100644 coverage/mo_types/async_cap.ml.html create mode 100644 coverage/mo_types/cons.ml.html create mode 100644 coverage/mo_types/expansive.ml.html create mode 100644 coverage/mo_types/hash.ml.html create mode 100644 coverage/mo_types/productive.ml.html create mode 100644 coverage/mo_types/scope.ml.html create mode 100644 coverage/mo_types/typ_hash.ml.html create mode 100644 coverage/mo_types/type.ml.html create mode 100644 coverage/mo_values/arrange_ops.ml.html create mode 100644 coverage/mo_values/call_conv.ml.html create mode 100644 coverage/mo_values/numerics.ml.html create mode 100644 coverage/mo_values/operator.ml.html create mode 100644 coverage/mo_values/prim.ml.html create mode 100644 coverage/mo_values/show.ml.html create mode 100644 coverage/mo_values/value.ml.html create mode 100644 coverage/nix-support/hydra-build-products create mode 100644 coverage/pipeline/pipeline.ml.html create mode 100644 coverage/pipeline/resolve_import.ml.html create mode 100644 coverage/prelude/prelude.ml.html create mode 100644 coverage/profiler/counters.ml.html create mode 100644 coverage/profiler/profiler.ml.html create mode 100644 coverage/profiler/profilerFlags.ml.html create mode 100644 coverage/rts/rts.ml.html create mode 100644 coverage/source_id/generated.ml.html create mode 100644 coverage/source_id/source_id.ml.html create mode 100644 coverage/viper/pretty.ml.html create mode 100644 coverage/viper/trans.ml.html create mode 100644 coverage/wasm-exts/abbreviation.ml.html create mode 100644 coverage/wasm-exts/ast.ml.html create mode 100644 coverage/wasm-exts/customModule.ml.html create mode 100644 coverage/wasm-exts/customModuleDecode.ml.html create mode 100644 coverage/wasm-exts/customModuleEncode.ml.html create mode 100644 coverage/wasm-exts/dwarf5.ml.html create mode 100644 coverage/wasm-exts/operators.ml.html create mode 100644 docs/html/about-this-guide.html create mode 100644 docs/html/actor-classes.html create mode 100644 docs/html/actors-async.html create mode 100644 docs/html/advanced-discussion.html create mode 100644 docs/html/base-intro.html create mode 100644 docs/html/basic-concepts.html create mode 100644 docs/html/caller-id.html create mode 100644 docs/html/compatibility.html create mode 100644 docs/html/compiler-ref.html create mode 100644 docs/html/control-flow.html create mode 100644 docs/html/cycles.html create mode 100644 docs/html/errors.html create mode 100644 docs/html/extrastuff.html create mode 100644 docs/html/heartbeats.html create mode 100644 docs/html/language-manual.html create mode 100644 docs/html/local-objects-classes.html create mode 100644 docs/html/message-inspection.html create mode 100644 docs/html/modules-and-imports.html create mode 100644 docs/html/motoko-grammar.html create mode 100644 docs/html/motoko-introduction.html create mode 100644 docs/html/motoko.html create mode 100644 docs/html/mutable-state.html create mode 100644 docs/html/overview.html create mode 100644 docs/html/pattern-matching.html create mode 100644 docs/html/pipes.html create mode 100644 docs/html/sharing.html create mode 100644 docs/html/stablememory.html create mode 100644 docs/html/structural-equality.html create mode 100644 docs/html/style.html create mode 100644 docs/html/timers.html create mode 100644 docs/html/upgrades.html create mode 100644 docs/nix-support/hydra-build-products create mode 100644 docs/overview-slides.html create mode 100644 flamegraphs/assetstorage-reverse.svg create mode 100644 flamegraphs/assetstorage.svg create mode 100644 flamegraphs/dao-reverse.svg create mode 100644 flamegraphs/dao.svg create mode 100644 flamegraphs/index.html create mode 100644 flamegraphs/nix-support/hydra-build-products create mode 100644 flamegraphs/qr-reverse.svg create mode 100644 flamegraphs/qr.svg create mode 100644 flamegraphs/reversi-reverse.svg create mode 100644 flamegraphs/reversi.svg create mode 100644 flamegraphs/sha256-reverse.svg create mode 100644 flamegraphs/sha256.svg create mode 100644 index.html diff --git a/.github/workflows/niv-updater-rare.yml b/.github/workflows/niv-updater-rare.yml new file mode 100644 index 00000000000..4cd35ebfcdb --- /dev/null +++ b/.github/workflows/niv-updater-rare.yml @@ -0,0 +1,31 @@ +name: Update niv dependencies (weekly) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every monday + - cron: '0 0 * * 1' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + # might be too noisy + whitelist: 'ic-ref,musl-wasi' + labels: | + automerge-squash + keep_updating: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/niv-updater-trial.yml b/.github/workflows/niv-updater-trial.yml new file mode 100644 index 00000000000..3c2733a8317 --- /dev/null +++ b/.github/workflows/niv-updater-trial.yml @@ -0,0 +1,36 @@ +# these dependencies are bumped weekly. But to not add churn +# to master (e.g. downloading changed stuff in nix-shell), +# CI/Mergify is instructed to simply close them as soon as CI is green. +# +# This means that we get an open PR only if something breaks, which is all we +# want to know about. +name: Update niv dependencies (trial) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every monday + - cron: '0 0 * * 0' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + whitelist: 'nixpkgs,musl-wasi,ic' + labels: | + autoclose + keep_updating: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/niv-updater.yml b/.github/workflows/niv-updater.yml new file mode 100644 index 00000000000..3c9bbe10fb7 --- /dev/null +++ b/.github/workflows/niv-updater.yml @@ -0,0 +1,32 @@ +name: Update niv dependencies (daily) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every day + - cron: '0 0 * * *' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + # might be too noisy + blacklist: 'nixpkgs,ic-ref,musl-wasi,ic' + labels: | + automerge-squash + keep_updating: true + debug_output: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000000..ff3652fffd0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,99 @@ +name: release + +# We trigger this on all tags and on the `master` branch. The job +# `changelog` will fail for tags that don’t have a +# changelog entry, so that seems good enough. +# For `master` this check is skipped as well as uploads. + +on: + push: + tags: + - '*' + branches: + - 'master' + +jobs: + # first check that the changelog is in good order and extract the changelog + # This will fail for non-release tags. + changelog: + runs-on: 'ubuntu-latest' + steps: + - uses: actions/checkout@v2 + + - name: Get the version + id: get_version + run: echo ::set-output name=version::${{ github.ref_name }} + + - name: Extract changelog + id: read_changelog + if: startsWith(github.ref, 'refs/tags/') + run: | + export VERSION='${{ steps.get_version.outputs.version }}' + perl -0777 -ne '/^# Motoko compiler changelog\n\n## (??{quotemeta($ENV{VERSION})}) \(\d\d\d\d-\d\d-\d\d\)\n\n(.*?)^##/sm or die "Changelog does not look right for this version\n" ; print $1' Changelog.md > changelog-extract.md + cat changelog-extract.md + # need to mangle to use with set-output, see https://github.com/svenstaro/upload-release-action/pull/49/files + r="$(cat changelog-extract.md)" + r="${r//'%'/'%25'}" + r="${r//$'\n'/'%0A'}" + r="${r//$'\r'/'%0D'}" + echo "::set-output name=release_body::$r" + + outputs: + version: ${{ steps.get_version.outputs.version }} + release_body: ${{ steps.read_changelog.outputs.release_body }} + + # Now build the release on both linux and darwin, with the version number set + build: + strategy: + matrix: + os: [ ubuntu-latest, macos-latest ] + needs: changelog + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - uses: cachix/install-nix-action@v16 + with: + extra_nix_config: | + experimental-features = nix-command + - uses: cachix/cachix-action@v10 + if: startsWith(github.ref, 'refs/heads/') + with: + name: ic-hs-test + # NB: No auth token, we don’t want to push new stuff here + - uses: cachix/cachix-action@v10 + if: startsWith(github.ref, 'refs/tags/') + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - run: cachix watch-store ic-hs-test & + - name: "nix-build" + # these are the dependencies listed in release-files. Sorry for the duplication + run: | + nix-build --max-jobs 1 --argstr releaseVersion ${{needs.changelog.outputs.version}} \ + -A moc -A mo-ide -A mo-doc -A js.moc -A js.moc_interpreter + + # Finally do the upload. Hopefully the previous job has uploaded the + # build product to the cachix cache, as we cannot build the darwin products on + # linux + release: + if: startsWith(github.ref, 'refs/tags/') + runs-on: 'ubuntu-latest' + needs: [ changelog, build ] + steps: + - uses: actions/checkout@v2 + - uses: cachix/install-nix-action@v16 + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + # NB: No auth token, we don’t expect to push new stuff here + + - run: nix-build --max-jobs 1 release-files.nix --argstr releaseVersion '${{ needs.changelog.outputs.version }}' + + - name: Upload Release Assets + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} + file: result/* + file_glob: true + body: ${{ needs.changelog.outputs.release_body }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..4ef54758051 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,79 @@ +name: "build" +on: + push: + branches: [ master ] + pull_request: {} +jobs: + tests: + strategy: + matrix: + os: [ ubuntu-latest, macos-latest ] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + # fetch full history so that git merge-base works + fetch-depth: 0 + # fetch PR commit, not predicted merge commit + ref: ${{ github.event.pull_request.head.sha }} + - uses: cachix/install-nix-action@v16 + with: + extra_nix_config: | + experimental-features = nix-command + + - run: nix-env -iA nix-build-uncached -f nix/ + + # We are using the ic-hs-test cachix cache that is also used by + # dfinity/ic-hs. This is partly laziness (on need to set up a separate + # cache), but also to get the ic-ref-test binary without rebuilding + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + # until https://github.com/cachix/cachix-action/issues/86 is fixed: + - run: cachix watch-store ic-hs-test & + + - name: "nix-build" + run: nix-build-uncached --max-jobs 4 -A all-systems-go -build-flags -L + + - name: Calculate performance delta + if: runner.os == 'Linux' && github.event_name == 'pull_request' + run: | + from="$(git merge-base origin/${{ github.base_ref }} HEAD)" + to="${{ github.event.pull_request.head.sha }}" + echo "Comparing changes from $from to $to" + nix-build --max-jobs 4 perf-delta.nix -o perf-delta.txt \ + --argstr ref HEAD \ + --argstr from "$from" \ + --argstr to "$to" + + - name: Read performance delta + if: runner.os == 'Linux' && github.event_name == 'pull_request' + id: perf + uses: juliangruber/read-file-action@v1 + with: + path: ./perf-delta.txt + + - name: Find performance comment + if: runner.os == 'Linux' && github.event_name == 'pull_request' + uses: peter-evans/find-comment@v1 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: '' + + # Forks can't add comments so this job does not run on forks, see + # motoko#2864. + - name: Create or update performance comment + if: runner.os == 'Linux' && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + uses: peter-evans/create-or-update-comment@v1 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + + ${{ steps.perf.outputs.content }} + edit-mode: replace diff --git a/.github/workflows/update-hash.yml b/.github/workflows/update-hash.yml new file mode 100644 index 00000000000..9674d950309 --- /dev/null +++ b/.github/workflows/update-hash.yml @@ -0,0 +1,38 @@ +name: Update nix hashes + +on: + push: + branches-ignore: + - master + - release + tags-ignore: + - '**' + +jobs: + update-hash: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + # This is needed to be able to push and trigger CI with that push + token: ${{ secrets.NIV_UPDATER_TOKEN }} + - uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixos-21.11 + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - name: Update drun cargo hash + run: | + cd nix + nix --extra-experimental-features nix-command shell -f . nix-update -c nix-update --version=skip drun + - name: Commit changes + uses: EndBug/add-and-commit@v7.5.0 + with: + author_name: Nix hash updater + author_email: "" + message: "Updating nix hashes" + # do not pull: if this branch is behind, then we might as well let + # the pushing fail + pull: "NO-PULL" diff --git a/base-doc/Array.html b/base-doc/Array.html new file mode 100644 index 00000000000..7427ed9c0d5 --- /dev/null +++ b/base-doc/Array.html @@ -0,0 +1,331 @@ + +

Array

Provides extended utility functions on Arrays.

+

Note the difference between mutable and non-mutable arrays below.

+

WARNING: If you are looking for a list that can grow and shrink in size, +it is recommended you use either the Buffer class or the List class for +those purposes. Arrays must be created with a fixed size.

+

Import from the base library to use this module.

+
motoko name=import
+import Array "mo:base/Array";

public func init<X>(size : Nat, initValue : X) : [var X]

Create a mutable array with size copies of the initial value.

+
motoko include=import
+let array = Array.init<Nat>(4, 2);
+ +

Runtime: O(size) +Space: O(size)

+

public func tabulate<X>(size : Nat, generator : Nat -> X) : [X]

Create an immutable array of size size. Each element at index i +is created by applying generator to i.

+
motoko include=import
+let array : [Nat] = Array.tabulate<Nat>(4, func i = i * 2);
+ +

Runtime: O(size) +Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) time and space.

+

public func tabulateVar<X>(size : Nat, generator : Nat -> X) : [var X]

Create a mutable array of size size. Each element at index i +is created by applying generator to i.

+
motoko include=import
+let array : [var Nat] = Array.tabulateVar<Nat>(4, func i = i * 2);
+array[2] := 0;
+array
+ +

Runtime: O(size) +Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) time and space.

+

public func freeze<X>(varArray : [var X]) : [X]

Transforms a mutable array into an immutable array.

+
motoko include=import
+
+let varArray = [var 0, 1, 2];
+varArray[2] := 3;
+let array = Array.freeze<Nat>(varArray);
+ +

Runtime: O(size)

+

Space: O(1)

+

public func thaw<A>(array : [A]) : [var A]

Transforms an immutable array into a mutable array.

+
motoko include=import
+
+let array = [0, 1, 2];
+let varArray = Array.thaw<Nat>(array);
+varArray[2] := 3;
+varArray
+ +

Runtime: O(size)

+

Space: O(1)

+

public func equal<X>(
  array1 : [X],
  array2 : [X],
  equal : (X, X) -> Bool
) : Bool

Tests if two arrays contain equal values (i.e. they represent the same +list of elements). Uses equal to compare elements in the arrays.

+
motoko include=import
+// Use the equal function from the Nat module to compare Nats
+import {equal} "mo:base/Nat";
+
+let array1 = [0, 1, 2, 3];
+let array2 = [0, 1, 2, 3];
+Array.equal(array1, array2, equal)
+ +

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func find<X>(array : [X], predicate : X -> Bool) : ?X

Returns the first value in array for which predicate returns true. +If no element satisfies the predicate, returns null.

+
motoko include=import
+let array = [1, 9, 4, 8];
+Array.find<Nat>(array, func x = x > 8)

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func append<X>(array1 : [X], array2 : [X]) : [X]

Create a new array by appending the values of array1 and array2. +@deprecated Array.append copies its arguments and has linear complexity; +when used in a loop, consider using a Buffer, and Buffer.append, instead.

+
motoko include=import
+let array1 = [1, 2, 3];
+let array2 = [4, 5, 6];
+Array.append<Nat>(array1, array2)

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

public func sort<X>(array : [X], compare : (X, X) -> Order.Order) : [X]

Sorts the elements in the array according to compare. +Sort is deterministic and stable.

+
motoko include=import
+import Nat "mo:base/Nat";
+
+let array = [4, 2, 6];
+Array.sort(array, Nat.compare)

Runtime: O(size * log(size))

+

Space: O(size) +*Runtime and space assumes that compare runs in O(1) time and space.

+

public func sortInPlace<X>(array : [var X], compare : (X, X) -> Order.Order)

Sorts the elements in the array, in place, according to compare. +Sort is deterministic, stable, and in-place.

+
motoko include=import
+
+import {compare} "mo:base/Nat";
+
+let array = [var 4, 2, 6];
+Array.sortInPlace(array, compare);
+array

Runtime: O(size * log(size))

+

Space: O(size) +*Runtime and space assumes that compare runs in O(1) time and space.

+

public func reverse<X>(array : [X]) : [X]

Creates a new array by reversing the order of elements in array.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+Array.reverse(array)
+ +

Runtime: O(size)

+

Space: O(1)

+

public func map<X, Y>(array : [X], f : X -> Y) : [Y]

Creates a new array by applying f to each element in array. f "maps" +each element it is applied to of type X to an element of type Y. +Retains original ordering of elements.

+
motoko include=import
+
+let array = [0, 1, 2, 3];
+Array.map<Nat, Nat>(array, func x = x * 3)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func filter<X>(array : [X], predicate : X -> Bool) : [X]

Creates a new array by applying predicate to every element +in array, retaining the elements for which predicate returns true.

+
motoko include=import
+let array = [4, 2, 6, 1, 5];
+let evenElements = Array.filter<Nat>(array, func x = x % 2 == 0);

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func mapEntries<X, Y>(array : [X], f : (X, Nat) -> Y) : [Y]

Creates a new array by applying f to each element in array and its index. +Retains original ordering of elements.

+
motoko include=import
+
+let array = [10, 10, 10, 10];
+Array.mapEntries<Nat, Nat>(array, func (x, i) = i * x)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<X, Y>(array : [X], f : X -> ?Y) : [Y]

Creates a new array by applying f to each element in array, +and keeping all non-null elements. The ordering is retained.

+
motoko include=import
+import {toText} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let newArray =
+  Array.mapFilter<Nat, Text>( // mapping from Nat to Text values
+    array,
+    func x = if (x == 0) { null } else { ?toText(100 / x) } // can't divide by 0, so return null
+  );

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapResult<X, Y, E>(array : [X], f : X -> Result.Result<Y, E>) : Result.Result<[Y], E>

Creates a new array by applying f to each element in array. +If any invocation of f produces an #err, returns an #err. Otherwise +returns an #ok containing the new array.

+
motoko include=import
+let array = [4, 3, 2, 1, 0];
+// divide 100 by every element in the array
+Array.mapResult<Nat, Nat, Text>(array, func x {
+  if (x > 0) {
+    #ok(100 / x)
+  } else {
+    #err "Cannot divide by zero"
+  }
+})
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func chain<X, Y>(array : [X], k : X -> [Y]) : [Y]

Creates a new array by applying k to each element in array, +and concatenating the resulting arrays in order. This operation +is similar to what in other functional languages is known as monadic bind.

+
motoko include=import
+import Nat "mo:base/Nat";
+
+let array = [1, 2, 3, 4];
+Array.chain<Nat, Int>(array, func x = [x, -x])
+
+

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that k runs in O(1) time and space.

+

public func foldLeft<X, A>(
  array : [X],
  base : A,
  combine : (A, X) -> A
) : A

Collapses the elements in array into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+
motoko include=import
+import {add} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let sum =
+  Array.foldLeft<Nat, Nat>(
+    array,
+    0, // start the sum at 0
+    func(sumSoFar, x) = sumSoFar + x // this entire function can be replaced with `add`!
+  );
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<X, A>(
  array : [X],
  base : A,
  combine : (X, A) -> A
) : A

Collapses the elements in array into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+
motoko include=import
+import {toText} "mo:base/Nat";
+
+let array = [1, 9, 4, 8];
+let bookTitle = Array.foldRight<Nat, Text>(array, "", func(x, acc) = toText(x) # acc);
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func flatten<X>(arrays : [[X]]) : [X]

Flattens the array of arrays into a single array. Retains the original +ordering of the elements.

+
motoko include=import
+
+let arrays = [[0, 1, 2], [2, 3], [], [4]];
+Array.flatten<Nat>(arrays)
+ +

Runtime: O(number of elements in array)

+

Space: O(number of elements in array)

+

public func make<X>(element : X) : [X]

Create an array containing a single value.

+
motoko include=import
+Array.make(2)
+ +

Runtime: O(1)

+

Space: O(1)

+

public func vals<X>(array : [X]) : I.Iter<X>

Returns an Iterator (Iter) over the elements of array. +Iterator provides a single method next(), which returns +elements in order, or null when out of elements to iterate over.

+

NOTE: You can also use array.vals() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.vals()) {
+  sum += element;
+};
+sum
+ +

Runtime: O(1)

+

Space: O(1)

+

public func keys<X>(array : [X]) : I.Iter<Nat>

Returns an Iterator (Iter) over the indices of array. +Iterator provides a single method next(), which returns +indices in order, or null when out of index to iterate over.

+

NOTE: You can also use array.keys() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.keys()) {
+  sum += element;
+};
+sum
+ +

Runtime: O(1)

+

Space: O(1)

+

public func size<X>(array : [X]) : Nat

Returns the size of array.

+

NOTE: You can also use array.size() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+let size = Array.size(array);
+ +

Runtime: O(1)

+

Space: O(1)

+

public func subArray<X>(
  array : [X],
  start : Nat,
  length : Nat
) : [X]

Returns a new subarray from the given array provided the start index and length of elements in the subarray

+

Limitations: Traps if the start index + length is greater than the size of the array

+
motoko include=import
+
+let array = [1,2,3,4,5];
+let subArray = Array.subArray<Nat>(array, 2, 3);

Runtime: O(length); +Space: O(length);

+

public func indexOf<X>(
  element : X,
  array : [X],
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the first element in the array.

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.indexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.indexOf<Char>('f', array, Char.equal) == ?2;
+assert Array.indexOf<Char>('g', array, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func nextIndexOf<X>(
  element : X,
  array : [X],
  fromInclusive : Nat,
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the next occurence of element in the array starting from the from index (inclusive).

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.nextIndexOf<Char>('c', array, 0, Char.equal) == ?0;
+assert Array.nextIndexOf<Char>('f', array, 0, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 2, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 3, Char.equal) == ?3;
+assert Array.nextIndexOf<Char>('f', array, 4, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func lastIndexOf<X>(
  element : X,
  array : [X],
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the last element in the array.

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.lastIndexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.lastIndexOf<Char>('f', array, Char.equal) == ?3;
+assert Array.lastIndexOf<Char>('e', array, Char.equal) == ?5;
+assert Array.lastIndexOf<Char>('g', array, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func prevIndexOf<T>(
  element : T,
  array : [T],
  fromExclusive : Nat,
  equal : (T, T) -> Bool
) : ?Nat

Returns the index of the previous occurance of element in the array starting from the from index (exclusive).

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.prevIndexOf<Char>('c', array, array.size(), Char.equal) == ?0;
+assert Array.prevIndexOf<Char>('e', array, array.size(), Char.equal) == ?5;
+assert Array.prevIndexOf<Char>('e', array, 5, Char.equal) == ?4;
+assert Array.prevIndexOf<Char>('e', array, 4, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func slice<X>(
  array : [X],
  fromInclusive : Nat,
  toExclusive : Nat
) : I.Iter<X>

Returns an iterator over a slice of the given array.

+
motoko include=import
+let array = [1, 2, 3, 4, 5];
+let s = Array.slice<Nat>(array, 3, array.size());
+assert s.next() == ?4;
+assert s.next() == ?5;
+assert s.next() == null;
+
+let s = Array.slice<Nat>(array, 0, 0);
+assert s.next() == null;
+ +

Runtime: O(1) +Space: O(1)

+

\ No newline at end of file diff --git a/base-doc/AssocList.html b/base-doc/AssocList.html new file mode 100644 index 00000000000..b5d153275c0 --- /dev/null +++ b/base-doc/AssocList.html @@ -0,0 +1,195 @@ + +

AssocList

Map implemented as a linked-list of key-value pairs ("Associations").

+

NOTE: This map implementation is mainly used as underlying buckets for other map +structures. Thus, other map implementations are easier to use in most cases.

+

type AssocList<K, V> = List.List<(K, V)>

Import from the base library to use this module.

+
motoko name=import
+import AssocList "mo:base/AssocList";
+import List "mo:base/List";
+import Nat "mo:base/Nat";
+
+type AssocList<K, V> = AssocList.AssocList<K, V>;
+ +

Initialize an empty map using an empty list.

+
motoko name=initialize include=import
+var map : AssocList<Nat, Nat> = List.nil(); // Empty list as an empty map
+map := null; // Alternative: null as empty list.
+map

public func find<K, V>(
  map : AssocList<K, V>,
  key : K,
  equal : (K, K) -> Bool
) : ?V

Find the value associated with key key, or null if no such key exists. +Compares keys using the provided function equal.

+

Example:

+
motoko include=import,initialize
+// Create map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// Find value associated with key 1
+AssocList.find(map, 1, Nat.equal)

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func replace<K, V>(
  map : AssocList<K, V>,
  key : K,
  equal : (K, K) -> Bool,
  value : ?V
) : (AssocList<K, V>, ?V)

Maps key to value in map, and overwrites the old entry if the key +was already present. Returns the old value in an option if it existed and +null otherwise, as well as the new map. Compares keys using the provided +function equal.

+

Example:

+
motoko include=import,initialize
+// Add three entries to the map
+// map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+// Override second entry
+map := AssocList.replace(map, 1, Nat.equal, ?21).0;
+
+List.toArray(map)

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func diff<K, V, W>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool
) : AssocList<K, V>

Produces a new map containing all entries from map1 whose keys are not +contained in map2. The "extra" entries in map2 are ignored. Compares +keys using the provided function equal.

+

Example:

+
motoko include=import,initialize
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the difference
+let newMap = AssocList.diff(map1, map2, Nat.equal);
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func mapAppend<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  f : (?V, ?W) -> X
) : AssocList<K, X>

@deprecated

+

public func disjDisjoint<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  f : (?V, ?W) -> X
) : AssocList<K, X>

Produces a new map by mapping entries in map1 and map2 using f and +concatenating the results. Assumes that there are no collisions between +keys in map1 and map2.

+

Example:

+
motoko include=import,initialize
+import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(4, "14"), (3, "13")]
+var map2 : AssocList<Nat, Text> = null;
+map2 := AssocList.replace(map2, 4, Nat.equal, ?"14").0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?"13").0;
+
+// Map and append the two AssocLists
+let newMap =
+  AssocList.disjDisjoint<Nat, Nat, Text, Text>(
+    map1,
+    map2,
+    func((v1, v2) : (?Nat, ?Text)) {
+      switch(v1, v2) {
+        case(?v1, null) {
+          debug_show(v1) // convert values from map1 to Text
+        };
+        case(null, ?v2) {
+          v2 // keep values from map2 as Text
+        };
+        case _ {
+          trap "These cases will never happen in mapAppend"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func disj<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool,
  combine : (?V, ?W) -> X
) : AssocList<K, X>

Creates a new map by merging entries from map1 and map2, and mapping +them using combine. combine is also used to combine the values of colliding keys. +Keys are compared using the given equal function.

+

NOTE: combine will never be applied to (null, null).

+

Example:

+
motoko include=import,initialize
+import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Merge the two maps using `combine`
+let newMap =
+  AssocList.disj<Nat, Nat, Nat, Nat>(
+    map1,
+    map2,
+    Nat.equal,
+    func((v1, v2) : (?Nat, ?Nat)) : Nat {
+      switch(v1, v2) {
+        case(?v1, ?v2) {
+          v1 + v2 // combine values of colliding keys by adding them
+        };
+        case(?v1, null) {
+          v1 // when a key doesn't collide, keep the original value
+        };
+        case(null, ?v2) {
+          v2
+        };
+        case _ {
+          trap "This case will never happen in disj"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and combine runs in O(1) time and space.

+

public func join<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool,
  combine : (V, W) -> X
) : AssocList<K, X>

Takes the intersection of map1 and map2, only keeping colliding keys +and combining values using the combine function. Keys are compared using +the equal function.

+

Example:

+
motoko include=import,initialize
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the intersection of the two maps, combining values by adding them
+let newMap = AssocList.join<Nat, Nat, Nat, Nat>(map1, map2, Nat.equal, Nat.add);
+
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and combine runs in O(1) time and space.

+

public func fold<K, V, X>(
  map : AssocList<K, V>,
  base : X,
  combine : (K, V, X) -> X
) : X

Collapses the elements in map into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=import,initialize
+// Create map = [(0, 10), (1, 11), (2, 12)]
+var map : AssocList<Nat, Nat> = null;
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// (0 * 10) + (1 * 11) + (2 * 12)
+AssocList.fold<Nat, Nat, Nat>(map, 0, func(k, v, sumSoFar) = (k * v) + sumSoFar)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/Blob.html b/base-doc/Blob.html new file mode 100644 index 00000000000..8f7899c516b --- /dev/null +++ b/base-doc/Blob.html @@ -0,0 +1,135 @@ + +

Blob

Module for working with Blobs: immutable sequence of bytes.

+

Blobs represent sequences of bytes. They are immutable, iterable, but not indexable and can be empty.

+

Byte sequences are also often represented as [Nat8], i.e. an array of bytes, but this representation is currently much less compact than Blob, taking 4 physical bytes to represent each logical byte in the sequence. +If you would like to manipulate Blobs, it is recommended that you convert +Blobs to [var Nat8] or Buffer<Nat8>, do the manipulation, then convert back.

+

Import from the base library to use this module.

+
motoko name=import
+import Blob "mo:base/Blob";
+ +

Some built in features not listed in this module:

+
  • You can create a Blob literal from a Text literal, provided the context expects an expression of type Blob.
  • b.size() : Nat returns the number of bytes in the blob b;
  • b.vals() : Iter.Iter<Nat8> returns an iterator to enumerate the bytes of the blob b.
+ +

For example:

+
motoko include=import
+import Debug "mo:base/Debug";
+import Nat8 "mo:base/Nat8";
+
+let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
+let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
+let numBytes = blob.size(); // => 4 (returns the number of bytes in the Blob)
+for (byte : Nat8 in blob.vals()) { // iterator over the Blob
+  Debug.print(Nat8.toText(byte))
+}

type Blob = Prim.Types.Blob

public func fromArray(bytes : [Nat8]) : Blob

Creates a Blob from an array of bytes ([Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let bytes : [Nat8] = [0, 255, 0];
+let blob = Blob.fromArray(bytes); // => "\00\FF\00"

public func fromArrayMut(bytes : [var Nat8]) : Blob

Creates a Blob from a mutable array of bytes ([var Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let bytes : [var Nat8] = [var 0, 255, 0];
+let blob = Blob.fromArrayMut(bytes); // => "\00\FF\00"

public func toArray(blob : Blob) : [Nat8]

Converts a Blob to an array of bytes ([Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArray(blob); // => [0, 255, 0]

public func toArrayMut(blob : Blob) : [var Nat8]

Converts a Blob to a mutable array of bytes ([var Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArrayMut(blob); // => [var 0, 255, 0]

public func hash(blob : Blob) : Nat32

Returns the (non-cryptographic) hash of blob.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+Blob.hash(blob) // => 1_818_567_776

public func compare(b1 : Blob, b2 : Blob) : {#less; #equal; #greater}

General purpose comparison function for Blob by comparing the value of +the bytes. Returns the Order (either #less, #equal, or #greater) +by comparing blob1 with blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\00\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+Blob.compare(blob1, blob2) // => #less

public func equal(blob1 : Blob, blob2 : Blob) : Bool

Equality function for Blob types. +This is equivalent to blob1 == blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\FF\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.equal(blob1, blob2);
+blob1 == blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use == as a +function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Blob>(3);
+let buffer2 = Buffer.Buffer<Blob>(3);
+Buffer.equal(buffer1, buffer2, Blob.equal) // => true

public func notEqual(blob1 : Blob, blob2 : Blob) : Bool

Inequality function for Blob types. +This is equivalent to blob1 != blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.notEqual(blob1, blob2);
+blob1 != blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use != as a +function value at the moment.

+

public func less(blob1 : Blob, blob2 : Blob) : Bool

"Less than" function for Blob types. +This is equivalent to blob1 < blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.less(blob1, blob2);
+blob1 < blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use < as a +function value at the moment.

+

public func lessOrEqual(blob1 : Blob, blob2 : Blob) : Bool

"Less than or equal to" function for Blob types. +This is equivalent to blob1 <= blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.lessOrEqual(blob1, blob2);
+blob1 <= blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use <= as a +function value at the moment.

+

public func greater(blob1 : Blob, blob2 : Blob) : Bool

"Greater than" function for Blob types. +This is equivalent to blob1 > blob2.

+

Example:

+
motoko include=import
+let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greater(blob1, blob2);
+blob1 > blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use > as a +function value at the moment.

+

public func greaterOrEqual(blob1 : Blob, blob2 : Blob) : Bool

"Greater than or equal to" function for Blob types. +This is equivalent to blob1 >= blob2.

+

Example:

+
motoko include=import
+let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greaterOrEqual(blob1, blob2);
+blob1 >= blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use >= as a +function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Bool.html b/base-doc/Bool.html new file mode 100644 index 00000000000..673da10b9dc --- /dev/null +++ b/base-doc/Bool.html @@ -0,0 +1,16 @@ + +

Bool

Boolean type and operations.

+

While boolean operators _ and _ and _ or _ are short-circuiting, +avoiding computation of the right argument when possible, the functions +logand(_, _) and logor(_, _) are strict and will always evaluate both +of their arguments.

+

type Bool = Prim.Types.Bool

Booleans with constants true and false.

+

public func toText(x : Bool) : Text

Conversion.

+

public func logand(x : Bool, y : Bool) : Bool

Returns x and y.

+

public func logor(x : Bool, y : Bool) : Bool

Returns x or y.

+

public func logxor(x : Bool, y : Bool) : Bool

Returns exclusive or of x and y, x != y.

+

public func lognot(x : Bool) : Bool

Returns not x.

+

public func equal(x : Bool, y : Bool) : Bool

Returns x == y.

+

public func notEqual(x : Bool, y : Bool) : Bool

Returns x != y.

+

public func compare(x : Bool, y : Bool) : {#less; #equal; #greater}

Returns the order of x and y, where false < true.

+

\ No newline at end of file diff --git a/base-doc/Buffer.html b/base-doc/Buffer.html new file mode 100644 index 00000000000..e28ddf34d2b --- /dev/null +++ b/base-doc/Buffer.html @@ -0,0 +1,1144 @@ + +

Buffer

Class Buffer<X> provides a mutable list of elements of type X. +The class wraps and resizes an underyling array that holds the elements, +and thus is comparable to ArrayLists or Vectors in other languages.

+

When required, the current state of a buffer object can be converted to a fixed-size array of its elements. +This is recommended for example when storing a buffer to a stable variable.

+

Throughout this documentation, two terms come up that can be confused: size +and capacity. size is the length of the list that the buffer represents. +capacity is the length of the underyling array that backs this list. +capacity >= size is an invariant for this class.

+

Like arrays, elements in the buffer are ordered by indices from 0 to size-1.

+

WARNING: Certain operations are amortized O(1) time, such as add, but run +in worst case O(n) time. These worst case runtimes may exceed the cycles limit +per message if the size of the buffer is large enough. Grow these structures +with discretion. All amortized operations below also list the worst case runtime.

+

Constructor: +The argument initCapacity determines the initial capacity of the array. +The underlying array grows by a factor of 1.5 when its current capacity is +exceeded. Further, when the size of the buffer shrinks to be less than 1/4th +of the capacity, the underyling array is shrunk by a factor of 2.

+

Example:

+
motoko name=initialize
+import Buffer "mo:base/Buffer";
+
+let buffer = Buffer.Buffer<Nat>(3); // Creates a new Buffer
+ +

Runtime: O(initCapacity)

+

Space: O(initCapacity)

+

class Buffer<X>(initCapacity : Nat)

public func size() : Nat

Returns the current number of elements in the buffer.

+

Example:

+
motoko include=initialize
+buffer.size() // => 0
+ +

Runtime: O(1)

+

Space: O(1)

+

public func add(element : X)

Adds a single element to the end of the buffer, doubling +the size of the array if capacity is exceeded.

+

Example:

+
motoko include=initialize
+
+buffer.add(0); // add 0 to buffer
+buffer.add(1);
+buffer.add(2);
+buffer.add(3); // causes underlying array to increase in capacity
+Buffer.toArray(buffer) // => [0, 1, 2, 3]
+ +

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func get(index : Nat) : X

Returns the element at index index. Traps if index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.get(0); // => 10
+ +

Runtime: O(1)

+

Space: O(1)

+

public func getOpt(index : Nat) : ?X

Returns the element at index index as an option. +Returns null when index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+let x = buffer.getOpt(0); // => ?10
+let y = buffer.getOpt(2); // => null
+ +

Runtime: O(1)

+

Space: O(1)

+

public func put(index : Nat, element : X)

Overwrites the current element at index with element. Traps if +index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.put(0, 20); // overwrites 10 at index 0 with 20
+Buffer.toArray(buffer) // => [20]
+ +

Runtime: O(1)

+

Space: O(1)

+

public func removeLast() : ?X

Removes and returns the last item in the buffer or null if +the buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.removeLast(); // => ?11
+ +

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func remove(index : Nat) : X

Removes and returns the element at index from the buffer. +All elements with index > index are shifted one position to the left. +This may cause a downsizing of the array.

+

Traps if index >= size.

+

WARNING: Repeated removal of elements using this method is ineffecient +and might be a sign that you should consider a different data-structure +for your use case.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+let x = buffer.remove(1); // evaluates to 11. 11 no longer in list.
+Buffer.toArray(buffer) // => [10, 12]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func clear()

Resets the buffer. Capacity is set to 8.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.clear(); // buffer is now empty
+Buffer.toArray(buffer) // => []
+ +

Runtime: O(1)

+

Space: O(1)

+

public func filterEntries(predicate : (Nat, X) -> Bool)

Removes all elements from the buffer for which the predicate returns false. +The predicate is given both the index of the element and the element itself. +This may cause a downsizing of the array.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.filterEntries(func(_, x) = x % 2 == 0); // only keep even elements
+Buffer.toArray(buffer) // => [10, 12]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func capacity() : Nat

Returns the capacity of the buffer (the length of the underlying array).

+

Example:

+
motoko include=initialize
+
+let buffer = Buffer.Buffer<Nat>(2); // underlying array has capacity 2
+buffer.add(10);
+let c1 = buffer.capacity(); // => 2
+buffer.add(11);
+buffer.add(12); // causes capacity to increase by factor of 1.5
+let c2 = buffer.capacity(); // => 3
+ +

Runtime: O(1)

+

Space: O(1)

+

public func reserve(capacity : Nat)

Changes the capacity to capacity. Traps if capacity < size.

+
motoko include=initialize
+
+buffer.reserve(4);
+buffer.add(10);
+buffer.add(11);
+buffer.capacity(); // => 4
+ +

Runtime: O(capacity)

+

Space: O(capacity)

+

public func append(buffer2 : Buffer<X>)

Adds all elements in buffer b to this buffer.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.append(buffer2); // adds elements from buffer2 to buffer1
+Buffer.toArray(buffer1) // => [10, 11, 12, 13]
+ +

Amortized Runtime: O(size2), Worst Case Runtime: O(size1 + size2)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

public func insert(index : Nat, element : X)

Inserts element at index, shifts all elements to the right of +index over by one index. Traps if index is greater than size.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer.add(10);
+buffer.add(11);
+buffer.insert(1, 9);
+Buffer.toArray(buffer) // => [10, 9, 11]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func insertBuffer(index : Nat, buffer2 : Buffer<X>)

Inserts buffer2 at index, and shifts all elements to the right of +index over by size2. Traps if index is greater than size.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.insertBuffer(1, buffer2);
+Buffer.toArray(buffer1) // => [10, 12, 13, 11]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

public func sort(compare : (X, X) -> Order.Order)

Sorts the elements in the buffer according to compare. +Sort is deterministic, stable, and in-place.

+
motoko include=initialize
+
+import Nat "mo:base/Nat";
+
+buffer.add(11);
+buffer.add(12);
+buffer.add(10);
+buffer.sort(Nat.compare);
+Buffer.toArray(buffer) // => [10, 11, 12]
+ +

Runtime: O(size * log(size))

+

Space: O(size)

+

public func vals() : { next : () -> ?X }

Returns an Iterator (Iter) over the elements of this buffer. +Iterator provides a single method next(), which returns +elements in order, or null when out of elements to iterate over.

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+
+var sum = 0;
+for (element in buffer.vals()) {
+  sum += element;
+};
+sum // => 33
+ +

Runtime: O(1)

+

Space: O(1)

+

public func clone() : Buffer<X>

@deprecated Use static library function instead.

+

public func toArray() : [X]

@deprecated Use static library function instead.

+

public func toVarArray() : [var X]

@deprecated Use static library function instead.

+

public func isEmpty<X>(buffer : Buffer<X>) : Bool

Returns true if and only if the buffer is empty.

+

Example:

+
motoko include=initialize
+buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.isEmpty(buffer); // => false
+ +
motoko include=initialize
+Buffer.isEmpty(buffer); // => true
+ +

Runtime: O(1)

+

Space: O(1)

+

public func contains<X>(
  buffer : Buffer<X>,
  element : X,
  equal : (X, X) -> Bool
) : Bool

Returns true iff buffer contains element with respect to equality +defined by equal.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.contains<Nat>(buffer, 2, Nat.equal); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func clone<X>(buffer : Buffer<X>) : Buffer<X>

Returns a copy of buffer, with the same capacity.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+
+let clone = Buffer.clone(buffer);
+Buffer.toArray(clone); // => [1]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func max<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X

Finds the greatest element in buffer defined by compare. +Returns null if buffer is empty.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.max(buffer, Nat.compare); // => ?2
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func min<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X

Finds the least element in buffer defined by compare. +Returns null if buffer is empty.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.min(buffer, Nat.compare); // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func equal<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Defines equality for two buffers, using equal to recursively compare elements in the +buffers. Returns true iff the two buffers are of the same size, and equal +evaluates to true for every pair of elements in the two buffers of the same +index.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(5);
+buffer2.add(1);
+buffer2.add(2);
+
+Buffer.equal(buffer1, buffer2, Nat.equal); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func compare<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  compare : (X, X) -> Order.Order
) : Order.Order

Defines comparison for two buffers, using compare to recursively compare elements in the +buffers. Comparison is defined lexicographically.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(3);
+buffer2.add(3);
+buffer2.add(4);
+
+Buffer.compare<Nat>(buffer1, buffer2, Nat.compare); // => #less
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func toText<X>(buffer : Buffer<X>, toText : X -> Text) : Text

Creates a textual representation of buffer, using toText to recursively +convert the elements into Text.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.toText(buffer, Nat.toText); // => "[1, 2, 3, 4]"
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that toText runs in O(1) time and space.

+

public func hash<X>(buffer : Buffer<X>, hash : X -> Nat32) : Nat32

Hashes buffer using hash to hash the underlying elements. +The deterministic hash function is a function of the elements in the Buffer, as well +as their ordering.

+

Example:

+
motoko include=initialize
+import Hash "mo:base/Hash";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1000);
+
+Buffer.hash<Nat>(buffer, Hash.hash); // => 2_872_640_342
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that hash runs in O(1) time and space.

+

public func indexOf<X>(
  element : X,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Finds the first index of element in buffer using equality of elements defined +by equal. Returns null if element is not found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.indexOf<Nat>(3, buffer, Nat.equal); // => ?2
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func lastIndexOf<X>(
  element : X,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Finds the last index of element in buffer using equality of elements defined +by equal. Returns null if element is not found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(2);
+buffer.add(2);
+
+Buffer.lastIndexOf<Nat>(2, buffer, Nat.equal); // => ?5
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func indexOfBuffer<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Searches for subBuffer in buffer, and returns the starting index if it is found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(4);
+sub.add(5);
+sub.add(6);
+
+Buffer.indexOfBuffer<Nat>(sub, buffer, Nat.equal); // => ?3
+ +

Runtime: O(size of buffer + size of subBuffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func binarySearch<X>(
  element : X,
  buffer : Buffer<X>,
  compare : (X, X) -> Order.Order
) : ?Nat

Similar to indexOf, but runs in logarithmic time. Assumes that buffer is sorted. +Behavior is undefined if buffer is not sorted. Uses compare to +perform the search. Returns an index of element if it is found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+Buffer.binarySearch<Nat>(5, buffer, Nat.compare); // => ?2
+ +

Runtime: O(log(size))

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func subBuffer<X>(
  buffer : Buffer<X>,
  start : Nat,
  length : Nat
) : Buffer<X>

Returns the sub-buffer of buffer starting at index start +of length length. Traps if start is out of bounds, or start + length +is greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.subBuffer(buffer, 3, 2);
+Buffer.toText(sub, Nat.toText); // => [4, 5]
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isSubBufferOf<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if subBuffer is a sub-Buffer of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isSubBufferOf(sub, buffer, Nat.equal); // => true
+ +

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictSubBufferOf<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if subBuffer is a strict subBuffer of buffer, i.e. subBuffer must be +strictly contained inside both the first and last indices of buffer. +Uses equal to compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isStrictSubBufferOf(sub, buffer, Nat.equal); // => true
+ +

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func prefix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>

Returns the prefix of buffer of length length. Traps if length +is greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.prefix(buffer, 3); // => [1, 2, 3]
+Buffer.toText(pre, Nat.toText);
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isPrefixOf<X>(
  prefix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if prefix is a prefix of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(2);
+pre.add(1);
+pre.add(2);
+Buffer.isPrefixOf(pre, buffer, Nat.equal); // => true
+ +

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictPrefixOf<X>(
  prefix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if prefix is a strict prefix of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(3);
+pre.add(1);
+pre.add(2);
+pre.add(3);
+Buffer.isStrictPrefixOf(pre, buffer, Nat.equal); // => true
+ +

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func suffix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>

Returns the suffix of buffer of length length. +Traps if lengthis greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.suffix(buffer, 3); // => [2, 3, 4]
+Buffer.toText(suf, Nat.toText);
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isSuffixOf<X>(
  suffix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if suffix is a suffix of buffer. Uses equal to compare +elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isSuffixOf(suf, buffer, Nat.equal); // => true
+ +

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictSuffixOf<X>(
  suffix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if suffix is a strict suffix of buffer. Uses equal to compare +elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isStrictSuffixOf(suf, buffer, Nat.equal); // => true
+ +

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func forAll<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff every element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forAll<Nat>(buffer, func x { x > 1 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func forSome<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff some element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forSome<Nat>(buffer, func x { x > 3 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func forNone<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff no element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forNone<Nat>(buffer, func x { x == 0 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func toArray<X>(buffer : Buffer<X>) : [X]

Creates an array containing elements from buffer.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toArray<Nat>(buffer); // => [1, 2, 3]
+
+
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toVarArray<X>(buffer : Buffer<X>) : [var X]

Creates a mutable array containing elements from buffer.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toVarArray<Nat>(buffer); // => [1, 2, 3]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromArray<X>(array : [X]) : Buffer<X>

Creates a buffer containing elements from array.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [2, 3];
+
+let buf = Buffer.fromArray<Nat>(array); // => [2, 3]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromVarArray<X>(array : [var X]) : Buffer<X>

Creates a buffer containing elements from array.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [var 1, 2, 3];
+
+let buf = Buffer.fromVarArray<Nat>(array); // => [1, 2, 3]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromIter<X>(iter : { next : () -> ?X }) : Buffer<X>

Creates a buffer containing elements from iter.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [1, 1, 1];
+let iter = array.vals();
+
+let buf = Buffer.fromIter<Nat>(iter); // => [1, 1, 1]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func trimToSize<X>(buffer : Buffer<X>)

Reallocates the array underlying buffer such that capacity == size.

+

Example:

+
motoko include=initialize
+
+let buffer = Buffer.Buffer<Nat>(10);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.trimToSize<Nat>(buffer);
+buffer.capacity(); // => 3
+ +

Runtime: O(size)

+

Space: O(size)

+

public func map<X, Y>(buffer : Buffer<X>, f : X -> Y) : Buffer<Y>

Creates a new buffer by applying f to each element in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.map<Nat, Nat>(buffer, func (x) { x + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func iterate<X>(buffer : Buffer<X>, f : X -> ())

Applies f to each element in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.iterate<Nat>(buffer, func (x) {
+  Debug.print(Nat.toText(x)); // prints each element in buffer
+});
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapEntries<X, Y>(buffer : Buffer<X>, f : (Nat, X) -> Y) : Buffer<Y>

Applies f to each element in buffer and its index.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapEntries<Nat, Nat>(buffer, func (x, i) { x + i + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 4, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<X, Y>(buffer : Buffer<X>, f : X -> ?Y) : Buffer<Y>

Creates a new buffer by applying f to each element in buffer, +and keeping all non-null elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapFilter<Nat, Nat>(buffer, func (x) {
+  if (x > 1) {
+    ?(x * 2);
+  } else {
+    null;
+  }
+});
+Buffer.toText(newBuf, Nat.toText); // => [4, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapResult<X, Y, E>(buffer : Buffer<X>, f : X -> Result.Result<Y, E>) : Result.Result<Buffer<Y>, E>

Creates a new buffer by applying f to each element in buffer. +If any invocation of f produces an #err, returns an #err. Otherwise +Returns an #ok containing the new buffer.

+

Example:

+
motoko include=initialize
+import Result "mo:base/Result";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let result = Buffer.mapResult<Nat, Nat, Text>(buffer, func (k) {
+  if (k > 0) {
+    #ok(k);
+  } else {
+    #err("One or more elements are zero.");
+  }
+});
+
+Result.mapOk<Buffer.Buffer<Nat>, [Nat], Text>(result, func buffer = Buffer.toArray(buffer)) // => #ok([1, 2, 3])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func chain<X, Y>(buffer : Buffer<X>, k : X -> Buffer<Y>) : Buffer<Y>

Creates a new buffer by applying k to each element in buffer, +and concatenating the resulting buffers in order. This operation +is similar to what in other functional languages is known as monadic bind.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let chain = Buffer.chain<Nat, Nat>(buffer, func (x) {
+  let b = Buffer.Buffer<Nat>(2);
+  b.add(x);
+  b.add(x * 2);
+  return b;
+});
+Buffer.toText(chain, Nat.toText); // => [1, 2, 2, 4, 3, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that k runs in O(1) time and space.

+

public func foldLeft<A, X>(
  buffer : Buffer<X>,
  base : A,
  combine : (A, X) -> A
) : A

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldLeft<Text, Nat>(buffer, "", func (acc, x) { acc # Nat.toText(x)}); // => "123"
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<X, A>(
  buffer : Buffer<X>,
  base : A,
  combine : (X, A) -> A
) : A

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldRight<Nat, Text>(buffer, "", func (x, acc) { Nat.toText(x) # acc }); // => "123"
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func first<X>(buffer : Buffer<X>) : X

Returns the first element of buffer. Traps if buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.first(buffer); // => 1
+ +

Runtime: O(1)

+

Space: O(1)

+

public func last<X>(buffer : Buffer<X>) : X

Returns the last element of buffer. Traps if buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.last(buffer); // => 3
+ +

Runtime: O(1)

+

Space: O(1)

+

public func make<X>(element : X) : Buffer<X>

Returns a new buffer with capacity and size 1, containing element.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer = Buffer.make<Nat>(1);
+Buffer.toText(buffer, Nat.toText); // => [1]
+ +

Runtime: O(1)

+

Space: O(1)

+

public func reverse<X>(buffer : Buffer<X>)

Reverses the order of elements in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.reverse(buffer);
+Buffer.toText(buffer, Nat.toText); // => [3, 2, 1]
+ +

Runtime: O(size)

+

Space: O(1)

+

public func merge<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  compare : (X, X) -> Order
) : Buffer<X>

Merges two sorted buffers into a single sorted buffer, using compare to define +the ordering. The final ordering is stable. Behavior is undefined if either +buffer1 or buffer2 is not sorted.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(4);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(2);
+buffer2.add(4);
+buffer2.add(6);
+
+let merged = Buffer.merge<Nat>(buffer1, buffer2, Nat.compare);
+Buffer.toText(merged, Nat.toText); // => [1, 2, 2, 4, 4, 6]
+ +

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func removeDuplicates<X>(buffer : Buffer<X>, compare : (X, X) -> Order)

Eliminates all duplicate elements in buffer as defined by compare. +Elimination is stable with respect to the original ordering of the elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.removeDuplicates<Nat>(buffer, Nat.compare);
+Buffer.toText(buffer, Nat.toText); // => [1, 2, 3]
+ +

Runtime: O(size * log(size))

+

Space: O(size)

+

public func partition<X>(buffer : Buffer<X>, predicate : X -> Bool) : (Buffer<X>, Buffer<X>)

Splits buffer into a pair of buffers where all elements in the left +buffer satisfy predicate and all elements in the right buffer do not.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let partitions = Buffer.partition<Nat>(buffer, func (x) { x % 2 == 0 });
+(Buffer.toArray(partitions.0), Buffer.toArray(partitions.1)) // => ([2, 4, 6], [1, 3, 5])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func split<X>(buffer : Buffer<X>, index : Nat) : (Buffer<X>, Buffer<X>)

Splits the buffer into two buffers at index, where the left buffer contains +all elements with indices less than index, and the right buffer contains all +elements with indices greater than or equal to index. Traps if index is out +of bounds.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let split = Buffer.split<Nat>(buffer, 3);
+(Buffer.toArray(split.0), Buffer.toArray(split.1)) // => ([1, 2, 3], [4, 5, 6])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func chunk<X>(buffer : Buffer<X>, size : Nat) : Buffer<Buffer<X>>

Breaks up buffer into buffers of size size. The last chunk may +have less than size elements if the number of elements is not divisible +by the chunk size.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let chunks = Buffer.chunk<Nat>(buffer, 3);
+Buffer.toText<Buffer.Buffer<Nat>>(chunks, func buf = Buffer.toText(buf, Nat.toText)); // => [[1, 2, 3], [4, 5, 6]]
+ +

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

public func groupBy<X>(buffer : Buffer<X>, equal : (X, X) -> Bool) : Buffer<Buffer<X>>

Groups equal and adjacent elements in the list into sub lists.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(2);
+buffer.add(4);
+buffer.add(5);
+buffer.add(5);
+
+let grouped = Buffer.groupBy<Nat>(buffer, func (x, y) { x == y });
+Buffer.toText<Buffer.Buffer<Nat>>(grouped, func buf = Buffer.toText(buf, Nat.toText)); // => [[1], [2, 2], [4], [5, 5]]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func flatten<X>(buffer : Buffer<Buffer<X>>) : Buffer<X>

Flattens the buffer of buffers into a single buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer = Buffer.Buffer<Buffer.Buffer<Nat>>(1);
+
+let inner1 = Buffer.Buffer<Nat>(2);
+inner1.add(1);
+inner1.add(2);
+
+let inner2 = Buffer.Buffer<Nat>(2);
+inner2.add(3);
+inner2.add(4);
+
+buffer.add(inner1);
+buffer.add(inner2);
+// buffer = [[1, 2], [3, 4]]
+
+let flat = Buffer.flatten<Nat>(buffer);
+Buffer.toText<Nat>(flat, Nat.toText); // => [1, 2, 3, 4]
+ +

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

public func zip<X, Y>(buffer1 : Buffer<X>, buffer2 : Buffer<Y>) : Buffer<(X, Y)>

Combines the two buffers into a single buffer of pairs, pairing together +elements with the same index. If one buffer is longer than the other, the +remaining elements from the longer buffer are not included.

+

Example:

+
motoko include=initialize
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+
+let zipped = Buffer.zip(buffer1, buffer2);
+Buffer.toArray(zipped); // => [(1, 4), (2, 5)]
+ +

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

public func zipWith<X, Y, Z>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<Y>,
  zip : (X, Y) -> Z
) : Buffer<Z>

Combines the two buffers into a single buffer, pairing together +elements with the same index and combining them using zip. If +one buffer is longer than the other, the remaining elements from +the longer buffer are not included.

+

Example:

+
motoko include=initialize
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+buffer2.add(6);
+
+let zipped = Buffer.zipWith<Nat, Nat, Nat>(buffer1, buffer2, func (x, y) { x + y });
+Buffer.toArray(zipped) // => [5, 7, 9]
+ +

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

*Runtime and space assumes that zip runs in O(1) time and space.

+

public func takeWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>

Creates a new buffer taking elements in order from buffer until predicate +returns false.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.takeWhile<Nat>(buffer, func (x) { x < 3 });
+Buffer.toText(newBuf, Nat.toText); // => [1, 2]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func dropWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>

Creates a new buffer excluding elements in order from buffer until predicate +returns false.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.dropWhile<Nat>(buffer, func x { x < 3 }); // => [3]
+Buffer.toText(newBuf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/CertifiedData.html b/base-doc/CertifiedData.html new file mode 100644 index 00000000000..ec9f9185fa0 --- /dev/null +++ b/base-doc/CertifiedData.html @@ -0,0 +1,35 @@ + +

CertifiedData

Certified data.

+

The Internet Computer allows canister smart contracts to store a small amount of data during +update method processing so that during query call processing, the canister can obtain +a certificate about that data.

+

This module provides a low-level interface to this API, aimed at advanced +users and library implementors. See the Internet Computer Functional +Specification and corresponding documentation for how to use this to make query +calls to your canister tamperproof.

+

public let set : (data : Blob) -> ()

Set the certified data.

+

Must be called from an update method, else traps. +Must be passed a blob of at most 32 bytes, else traps.

+

Example:

+
motoko no-repl
+import CertifiedData "mo:base/CertifiedData";
+import Blob "mo:base/Blob";
+
+// Must be in an update call
+
+let array : [Nat8] = [1, 2, 3];
+let blob = Blob.fromArray(array);
+CertifiedData.set(blob);
+ +

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+

public let getCertificate : () -> ?Blob

Gets a certificate

+

Returns null if no certificate is available, e.g. when processing an +update call or inter-canister call. This returns a non-null value only +when processing a query call.

+

Example:

+
motoko no-repl
+import CertifiedData "mo:base/CertifiedData";
+// Must be in a query call
+
+CertifiedData.getCertificate();

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+

\ No newline at end of file diff --git a/base-doc/Char.html b/base-doc/Char.html new file mode 100644 index 00000000000..dc24beebb20 --- /dev/null +++ b/base-doc/Char.html @@ -0,0 +1,21 @@ + +

Char

Characters

+

type Char = Prim.Types.Char

Characters represented as Unicode code points.

+

public let toNat32 : (c : Char) -> Nat32

Convert character c to a word containing its Unicode scalar value.

+

public let fromNat32 : (w : Nat32) -> Char

Convert w to a character. +Traps if w is not a valid Unicode scalar value. +Value w is valid if, and only if, w < 0xD800 or (0xE000 <= w and w <= 0x10FFFF).

+

public let toText : (c : Char) -> Text

Convert character c to single character text.

+

public func isDigit(c : Char) : Bool

Returns true when c is a decimal digit between 0 and 9, otherwise false.

+

public let isWhitespace : (c : Char) -> Bool

Returns the Unicode White_Space property of c.

+

public let isLowercase : (c : Char) -> Bool

Returns the Unicode Lowercase property of c.

+

public let isUppercase : (c : Char) -> Bool

Returns the Unicode Uppercase property of c.

+

public let isAlphabetic : (c : Char) -> Bool

Returns the Unicode Alphabetic property of c.

+

public func equal(x : Char, y : Char) : Bool

Returns x == y.

+

public func notEqual(x : Char, y : Char) : Bool

Returns x != y.

+

public func less(x : Char, y : Char) : Bool

Returns x < y.

+

public func lessOrEqual(x : Char, y : Char) : Bool

Returns x <= y.

+

public func greater(x : Char, y : Char) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Char, y : Char) : Bool

Returns x >= y.

+

public func compare(x : Char, y : Char) : {#less; #equal; #greater}

Returns the order of x and y.

+

\ No newline at end of file diff --git a/base-doc/Debug.html b/base-doc/Debug.html new file mode 100644 index 00000000000..e74078d6fa4 --- /dev/null +++ b/base-doc/Debug.html @@ -0,0 +1,34 @@ + +

Debug

Utility functions for debugging.

+

Import from the base library to use this module.

+
motoko name=import
+import Debug "mo:base/Debug";

public func print(text : Text)

Prints text to output stream.

+

NOTE: The output is placed in the replica log. When running on mainnet, +this function has no effect.

+
motoko include=import
+Debug.print "Hello New World!";
+Debug.print(debug_show(4)) // Often used with `debug_show` to convert values to Text

public func trap(errorMessage : Text) : None

trap(t) traps execution with a user-provided diagnostic message.

+

The caller of a future whose execution called trap(t) will +observe the trap as an Error value, thrown at await, with code +#canister_error and message m. Here m is a more descriptive Text +message derived from the provided t. See example for more details.

+

NOTE: Other execution environments that cannot handle traps may only +propagate the trap and terminate execution, with or without some +descriptive message.

+
import Debug "mo:base/Debug";
+import Error "mo:base/Error";
+
+actor {
+  func fail() : async () {
+    Debug.trap("user provided error message");
+  };
+
+  public func foo() : async () {
+    try {
+      await fail();
+    } catch e {
+      let code = Error.code(e); // evaluates to #canister_error
+      let message = Error.message(e); // contains user provided error message
+    }
+  };
+}

\ No newline at end of file diff --git a/base-doc/Deque.html b/base-doc/Deque.html new file mode 100644 index 00000000000..714d77a4be1 --- /dev/null +++ b/base-doc/Deque.html @@ -0,0 +1,126 @@ + +

Deque

Double-ended queue (deque) of a generic element type T.

+

The interface to deques is purely functional, not imperative, and deques are immutable values. +In particular, deque operations such as push and pop do not update their input deque but, instead, return the +value of the modified deque, alongside any other data. +The input deque is left unchanged.

+

Examples of use-cases: +Queue (FIFO) by using pushBack() and popFront(). +Stack (LIFO) by using pushFront() and popFront().

+

A deque is internally implemented as two lists, a head access list and a (reversed) tail access list, +that are dynamically size-balanced by splitting.

+

Construction: Create a new deque with the empty<T>() function.

+

Note on the costs of push and pop functions:

+
  • Runtime: O(1) amortized costs, O(n)` worst case cost per single call.
  • Space: O(1) amortized costs, O(n)` worst case cost per single call.
+ +

n denotes the number of elements stored in the deque.

+

type Deque<T> = (List<T>, List<T>)

Double-ended queue (deque) data type.

+

public func empty<T>() : Deque<T>

Create a new empty deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.empty<Nat>()
+ +

Runtime: O(1).

+

Space: O(1).

+

public func isEmpty<T>(deque : Deque<T>) : Bool

Determine whether a deque is empty. +Returns true if deque is empty, otherwise false.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.empty<Nat>();
+Deque.isEmpty(deque) // => true
+ +

Runtime: O(1).

+

Space: O(1).

+

public func pushFront<T>(deque : Deque<T>, element : T) : Deque<T>

Insert a new element on the front end of a deque. +Returns the new deque with element in the front followed by the elements of deque.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1) // deque with elements [1, 2]
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func peekFront<T>(deque : Deque<T>) : ?T

Inspect the optional element on the front end of a deque. +Returns null if deque is empty. Otherwise, the front element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+Deque.peekFront(deque) // => ?1
+ +

Runtime: O(1).

+

Space: O(1).

+

public func popFront<T>(deque : Deque<T>) : ?(T, Deque<T>)

Remove the element on the front end of a deque. +Returns null if deque is empty. Otherwise, it returns a pair of +the first element and a new deque that contains all the remaining elements of deque.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+let initial = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+// initial deque with elements [1, 2]
+let reduced = Deque.popFront(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let removedElement = result.0; // 1
+    let reducedDeque = result.1; // deque with element [2].
+  }
+}
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func pushBack<T>(deque : Deque<T>, element : T) : Deque<T>

Insert a new element on the back end of a deque. +Returns the new deque with all the elements of deque, followed by element on the back.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2) // deque with elements [1, 2]
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func peekBack<T>(deque : Deque<T>) : ?T

Inspect the optional element on the back end of a deque. +Returns null if deque is empty. Otherwise, the back element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+Deque.peekBack(deque) // => ?2
+ +

Runtime: O(1).

+

Space: O(1).

+

public func popBack<T>(deque : Deque<T>) : ?(Deque<T>, T)

Remove the element on the back end of a deque. +Returns null if deque is empty. Otherwise, it returns a pair of +a new deque that contains the remaining elements of deque +and, as the second pair item, the removed back element.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+
+let initial = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+// initial deque with elements [1, 2]
+let reduced = Deque.popBack(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let reducedDeque = result.0; // deque with element [1].
+    let removedElement = result.1; // 2
+  }
+}
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

\ No newline at end of file diff --git a/base-doc/Error.html b/base-doc/Error.html new file mode 100644 index 00000000000..c4a3f876397 --- /dev/null +++ b/base-doc/Error.html @@ -0,0 +1,38 @@ + +

Error

Error values and inspection.

+

The Error type is the argument to throw, parameter of catch. +The Error type is opaque.

+

type Error = Prim.Types.Error

Error value resulting from async computations

+

type ErrorCode = Prim.ErrorCode

Error code to classify different kinds of user and system errors:

+
type ErrorCode = {
+  // Fatal error.
+  #system_fatal;
+  // Transient error.
+  #system_transient;
+  // Destination invalid.
+  #destination_invalid;
+  // Explicit reject by canister code.
+  #canister_reject;
+  // Canister trapped.
+  #canister_error;
+  // Future error code (with unrecognized numeric code).
+  #future : Nat32;
+  // Error issuing inter-canister call
+  // (indicating destination queue full or freezing threshold crossed).
+  #call_error : { err_code :  Nat32 }
+};

public let reject : (message : Text) -> Error

Create an error from the message with the code #canister_reject.

+

Example:

+
import Error "mo:base/Error";
+
+Error.reject("Example error") // can be used as throw argument

public let code : (error : Error) -> ErrorCode

Returns the code of an error.

+

Example:

+
import Error "mo:base/Error";
+
+let error = Error.reject("Example error");
+Error.code(error) // #canister_reject

public let message : (error : Error) -> Text

Returns the message of an error.

+

Example:

+
import Error "mo:base/Error";
+import Debug "mo:base/Debug";
+
+let error = Error.reject("Example error");
+Error.message(error) // "Example error"

\ No newline at end of file diff --git a/base-doc/ExperimentalCycles.html b/base-doc/ExperimentalCycles.html new file mode 100644 index 00000000000..23be3b3ada8 --- /dev/null +++ b/base-doc/ExperimentalCycles.html @@ -0,0 +1,117 @@ + +

ExperimentalCycles

Managing cycles within actors on the Internet Computer (IC).

+

The usage of the Internet Computer is measured, and paid for, in cycles. +This library provides imperative operations for observing cycles, transferring cycles, and +observing refunds of cycles.

+

WARNING: This low-level API is experimental and likely to change or even disappear. +Dedicated syntactic support for manipulating cycles may be added to the language in future, obsoleting this library.

+

NOTE: Since cycles measure computational resources, the value of balance() can change from one call to the next.

+

Example for use on IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Debug.print("Main balance: " # debug_show(Cycles.balance()));
+    Cycles.add(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Main refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+    Debug.print("Main balance: " # debug_show(Cycles.balance())); // decreased by around 10_000_000
+  };
+
+  func operation() : async() {
+    Debug.print("Operation balance: " # debug_show(Cycles.balance()));
+    Debug.print("Operation available: " # debug_show(Cycles.available()));
+    let obtained = Cycles.accept(10_000_000);
+    Debug.print("Operation obtained: " # debug_show(obtained)); // => 10_000_000
+    Debug.print("Operation balance: " # debug_show(Cycles.balance())); // increased by 10_000_000
+    Debug.print("Operation available: " # debug_show(Cycles.available())); // decreased by 10_000_000
+  }
+}

public let balance : () -> (amount : Nat)

Returns the actor's current balance of cycles as amount.

+

Example for use on the IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let balance = Cycles.balance();
+    Debug.print("Balance: " # debug_show(balance));
+  }
+}

public let available : () -> (amount : Nat)

Returns the currently available amount of cycles. +The amount available is the amount received in the current call, +minus the cumulative amount accepted by this call. +On exit from the current shared function or async expression via return or throw, +any remaining available amount is automatically refunded to the caller/context.

+

Example for use on the IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let available = Cycles.available();
+    Debug.print("Available: " # debug_show(available));
+  }
+}

public let accept : (amount : Nat) -> (accepted : Nat)

Transfers up to amount from available() to balance(). +Returns the amount actually transferred, which may be less than +requested, for example, if less is available, or if canister balance limits are reached.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Cycles.add(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+  };
+
+  func operation() : async() {
+    let obtained = Cycles.accept(10_000_000);
+    Debug.print("Obtained: " # debug_show(obtained)); // => 10_000_000
+  }
+}

public let add : (amount : Nat) -> ()

Indicates additional amount of cycles to be transferred in +the next call, that is, evaluation of a shared function call or +async expression. +Traps if the current total would exceed 2 ** 128 cycles. +Upon the call, but not before, the total amount of cycles added since +the last call is deducted from balance(). +If this total exceeds balance(), the caller traps, aborting the call.

+

Note: The implicit register of added amounts is reset to zero on entry to +a shared function and after each shared function call or resume from an await.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add(15_000_000);
+    await operation();
+  }
+}

public let refunded : () -> (amount : Nat)

Reports amount of cycles refunded in the last await of the current +context, or zero if no await has occurred yet. +Calling refunded() is solely informational and does not affect balance(). +Instead, refunds are automatically added to the current balance, +whether or not refunded is used to observe them.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+  }
+}

\ No newline at end of file diff --git a/base-doc/ExperimentalInternetComputer.html b/base-doc/ExperimentalInternetComputer.html new file mode 100644 index 00000000000..493602d5e8c --- /dev/null +++ b/base-doc/ExperimentalInternetComputer.html @@ -0,0 +1,34 @@ + +

ExperimentalInternetComputer

Low-level interface to the Internet Computer.

+

WARNING: This low-level API is experimental and likely to change or even disappear.

+

public let call : (canister : Principal, name : Text, data : Blob) -> async (reply : Blob)

Calls canister's update or query function, name, with the binary contents of data as IC argument. +Returns the response to the call, an IC reply or reject, as a Motoko future:

+
  • The message data of an IC reply determines the binary contents of reply.
  • The error code and textual message data of an IC reject determines the future's Error value.
+ +

Note: call is an asynchronous function and can only be applied in an asynchronous context.

+

Example:

+
motoko no-repl
+import IC "mo:base/ExperimentalInternetComputer";
+import Principal "mo:base/Principal";
+
+let ledger = Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai");
+let method = "decimals";
+let input = ();
+type OutputType = { decimals : Nat32 };
+
+let rawReply = await IC.call(ledger, method, to_candid(input)); // serialized Candid
+let output : ?OutputType = from_candid(rawReply); // { decimals = 8 }
+ +

Learn more about Candid serialization

+

public func countInstructions(comp : () -> ()) : Nat64

Given computation, comp, counts the number of actual and (for IC system calls) notional WebAssembly +instructions performed during the execution of comp().

+

More precisely, returns the difference between the state of the IC instruction counter (performance counter 0) before and after executing comp() +(see Performance Counter).

+

NB: countInstructions(comp) will not account for any deferred garbage collection costs incurred by comp().

+

Example:

+
motoko no-repl
+import IC "mo:base/ExperimentalInternetComputer";
+
+let count = IC.countInstructions(func() {
+  // ...
+});

\ No newline at end of file diff --git a/base-doc/ExperimentalStableMemory.html b/base-doc/ExperimentalStableMemory.html new file mode 100644 index 00000000000..0297881e502 --- /dev/null +++ b/base-doc/ExperimentalStableMemory.html @@ -0,0 +1,218 @@ + +

ExperimentalStableMemory

Byte-level access to (virtual) stable memory.

+

WARNING: As its name suggests, this library is experimental, subject to change +and may be replaced by safer alternatives in later versions of Motoko. +Use at your own risk and discretion.

+

This is a lightweight abstraction over IC stable memory and supports persisting +raw binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API.

+

Memory is allocated, using grow(pages), sequentially and on demand, in units of 64KiB pages, starting with 0 allocated pages. +New pages are zero initialized. +Growth is capped by a soft limit on page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

+

Each load operation loads from byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current stable memory size.

+

Each store operation stores to byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current stable memory size.

+

Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

+

The current page allocation and page contents is preserved across upgrades.

+

NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +page size reported by Motoko function size(). +This (and the cap on growth) are to accommodate Motoko's stable variables. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 48Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

+

Usage:

+
motoko no-repl
+import StableMemory "mo:base/ExperimentalStableMemory";

public let size : () -> (pages : Nat64)

Current size of the stable memory, in pages. +Each page is 64KiB (65536 bytes). +Initially 0. +Preserved across upgrades, together with contents of allocated +stable memory.

+

Example:

+
motoko no-repl
+let beforeSize = StableMemory.size();
+ignore StableMemory.grow(10);
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10

public let grow : (newPages : Nat64) -> (oldPages : Nat64)

Grow current size of stable memory by the given number of pages. +Each page is 64KiB (65536 bytes). +Returns the previous size when able to grow. +Returns 0xFFFF_FFFF_FFFF_FFFF if remaining pages insufficient. +Every new page is zero-initialized, containing byte 0x00 at every offset. +Function grow is capped by a soft limit on size controlled by compile-time flag + --max-stable-pages <n> (the default is 65536, or 4GiB).

+

Example:

+
motoko no-repl
+import Error "mo:base/Error";
+
+let beforeSize = StableMemory.grow(10);
+if (beforeSize == 0xFFFF_FFFF_FFFF_FFFF) {
+  throw Error.reject("Out of memory");
+};
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10

public let stableVarQuery : () -> (shared query () -> async { size : Nat64 })

Returns a query that, when called, returns the number of bytes of (real) IC stable memory that would be +occupied by persisting its current stable variables before an upgrade. +This function may be used to monitor or limit real stable memory usage. +The query computes the estimate by running the first half of an upgrade, including any preupgrade system method. +Like any other query, its state changes are discarded so no actual upgrade (or other state change) takes place. +The query can only be called by the enclosing actor and will trap for other callers.

+

Example:

+
motoko no-repl
+actor {
+  stable var state = "";
+  public func example() : async Text {
+    let memoryUsage = StableMemory.stableVarQuery();
+    let beforeSize = (await memoryUsage()).size;
+    state #= "abcdefghijklmnopqrstuvwxyz";
+    let afterSize = (await memoryUsage()).size;
+    debug_show (afterSize - beforeSize)
+  };
+};

public let loadNat32 : (offset : Nat64) -> Nat32

Loads a Nat32 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123

public let storeNat32 : (offset : Nat64, value : Nat32) -> ()

Stores a Nat32 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123

public let loadNat8 : (offset : Nat64) -> Nat8

Loads a Nat8 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123

public let storeNat8 : (offset : Nat64, value : Nat8) -> ()

Stores a Nat8 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123

public let loadNat16 : (offset : Nat64) -> Nat16

Loads a Nat16 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123

public let storeNat16 : (offset : Nat64, value : Nat16) -> ()

Stores a Nat16 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123

public let loadNat64 : (offset : Nat64) -> Nat64

Loads a Nat64 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123

public let storeNat64 : (offset : Nat64, value : Nat64) -> ()

Stores a Nat64 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123

public let loadInt32 : (offset : Nat64) -> Int32

Loads an Int32 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123

public let storeInt32 : (offset : Nat64, value : Int32) -> ()

Stores an Int32 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123

public let loadInt8 : (offset : Nat64) -> Int8

Loads an Int8 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123

public let storeInt8 : (offset : Nat64, value : Int8) -> ()

Stores an Int8 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123

public let loadInt16 : (offset : Nat64) -> Int16

Loads an Int16 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123

public let storeInt16 : (offset : Nat64, value : Int16) -> ()

Stores an Int16 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123

public let loadInt64 : (offset : Nat64) -> Int64

Loads an Int64 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123

public let storeInt64 : (offset : Nat64, value : Int64) -> ()

Stores an Int64 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123

public let loadFloat : (offset : Nat64) -> Float

Loads a Float value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25

public let storeFloat : (offset : Nat64, value : Float) -> ()

Stores a Float value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25

public let loadBlob : (offset : Nat64, size : Nat) -> Blob

Load size bytes starting from offset as a Blob. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]

public let storeBlob : (offset : Nat64, value : Blob) -> ()

Write bytes of blob beginning at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]

\ No newline at end of file diff --git a/base-doc/Float.html b/base-doc/Float.html new file mode 100644 index 00000000000..8bef913d1a1 --- /dev/null +++ b/base-doc/Float.html @@ -0,0 +1,458 @@ + +

Float

Double precision (64-bit) floating-point numbers in IEEE 754 representation.

+

This module contains common floating-point constants and utility functions.

+

Notation for special values in the documentation below: ++inf: Positive infinity +-inf: Negative infinity +NaN: "not a number" (can have different sign bit values, but NaN != NaN regardless of the sign).

+

Note: +Floating point numbers have limited precision and operations may inherently result in numerical errors.

+

Examples of numerical errors:

+
  0.1 + 0.1 + 0.1 == 0.3 // => false
+  
+ +
 1e16 + 1.0 != 1e16 // => false
+  
+ +

(and many more cases)

+

Advice:

+
  • Floating point number comparisons by == or != are discouraged. Instead, it is better to compare + floating-point numbers with a numerical tolerance, called epsilon.
+ +

Example:

+
  import Float "mo:base/Float";
+  let x = 0.1 + 0.1 + 0.1;
+  let y = 0.3;
+
+  let epsilon = 1e-6; // This depends on the application case (needs a numerical error analysis).
+  Float.equalWithin(x, y, epsilon) // => true
+  
+ +
  • For absolute precision, it is recommened to encode the fraction number as a pair of a Nat for the base + and a Nat for the exponent (decimal point).

type Float = Prim.Types.Float

64-bit floating point number type.

+

public let pi : Float

Ratio of the circumference of a circle to its diameter. +Note: Limited precision.

+

public let e : Float

Base of the natural logarithm. +Note: Limited precision.

+

public func isNaN(number : Float) : Bool

Determines whether the number is a NaN ("not a number" in the floating point representation). +Notes:

+
  • Equality test of NaN with itself or another number is always false.
  • There exist many internal NaN value representations, such as positive and negative NaN, + signalling and quiet nans, each with many different bit representations.
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.isNaN(0.0/0.0) // => true

public let abs : (x : Float) -> Float

Returns the absolute value of x.

+

Special cases:

+
abs(+inf) => +inf
+abs(-inf) => +inf
+abs(NaN)  => NaN
+abs(-0.0) => 0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.abs(-1.2) // => 1.2

public let sqrt : (x : Float) -> Float

Returns the square root of x.

+

Special cases:

+
sqrt(+inf) => +inf
+sqrt(-0.0) => -0.0
+sqrt(x)    => NaN if x < 0.0
+sqrt(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sqrt(6.25) // => 2.5

public let ceil : (x : Float) -> Float

Returns the smallest integral float greater than or equal to x.

+

Special cases:

+
ceil(+inf) => +inf
+ceil(-inf) => -inf
+ceil(NaN)  => NaN
+ceil(0.0)  => 0.0
+ceil(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.ceil(1.2) // => 2.0

public let floor : (x : Float) -> Float

Returns the largest integral float less than or equal to x.

+

Special cases:

+
floor(+inf) => +inf
+floor(-inf) => -inf
+floor(NaN)  => NaN
+floor(0.0)  => 0.0
+floor(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.floor(1.2) // => 1.0

public let trunc : (x : Float) -> Float

Returns the nearest integral float not greater in magnitude than x. +This is equilvent to returning x with truncating its decimal places.

+

Special cases:

+
trunc(+inf) => +inf
+trunc(-inf) => -inf
+trunc(NaN)  => NaN
+trunc(0.0)  => 0.0
+trunc(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.trunc(2.75) // => 2.0

public let nearest : (x : Float) -> Float

Returns the nearest integral float to x. +A decimal place of exactly .5 is rounded up for x > 0 +and rounded down for x < 0

+

Special cases:

+
nearest(+inf) => +inf
+nearest(-inf) => -inf
+nearest(NaN)  => NaN
+nearest(0.0)  => 0.0
+nearest(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.nearest(2.75) // => 3.0

public let copySign : (x : Float, y : Float) -> Float

Returns x if x and y have same sign, otherwise x with negated sign.

+

The sign bit of zero, infinity, and NaN is considered.

+

Example:

+
import Float "mo:base/Float";
+
+Float.copySign(1.2, -2.3) // => -1.2

public let min : (x : Float, y : Float) -> Float

Returns the smaller value of x and y.

+

Special cases:

+
min(NaN, y) => NaN for any Float y
+min(x, NaN) => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.min(1.2, -2.3) // => -2.3 (with numerical imprecision)

public let max : (x : Float, y : Float) -> Float

Returns the larger value of x and y.

+

Special cases:

+
max(NaN, y) => NaN for any Float y
+max(x, NaN) => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.max(1.2, -2.3) // => 1.2

public let sin : (x : Float) -> Float

Returns the sine of the radian angle x.

+

Special cases:

+
sin(+inf) => NaN
+sin(-inf) => NaN
+sin(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sin(Float.pi / 2) // => 1.0

public let cos : (x : Float) -> Float

Returns the cosine of the radian angle x.

+

Special cases:

+
cos(+inf) => NaN
+cos(-inf) => NaN
+cos(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.cos(Float.pi / 2) // => 0.0 (with numerical imprecision)

public let tan : (x : Float) -> Float

Returns the tangent of the radian angle x.

+

Special cases:

+
tan(+inf) => NaN
+tan(-inf) => NaN
+tan(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.tan(Float.pi / 4) // => 1.0 (with numerical imprecision)

public let arcsin : (x : Float) -> Float

Returns the arc sine of x in radians.

+

Special cases:

+
arcsin(x)   => NaN if x > 1.0
+arcsin(x)   => NaN if x < -1.0
+arcsin(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arcsin(1.0) // => Float.pi / 2

public let arccos : (x : Float) -> Float

Returns the arc cosine of x in radians.

+

Special cases:

+
arccos(x)  => NaN if x > 1.0
+arccos(x)  => NaN if x < -1.0
+arcos(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arccos(1.0) // => 0.0

public let arctan : (x : Float) -> Float

Returns the arc tangent of x in radians.

+

Special cases:

+
arctan(+inf) => pi / 2
+arctan(-inf) => -pi / 2
+arctan(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arctan(1.0) // => Float.pi / 4

public let arctan2 : (y : Float, x : Float) -> Float

Given (y,x), returns the arc tangent in radians of y/x based on the signs of both values to determine the correct quadrant.

+

Special cases:

+
arctan2(0.0, 0.0)   => 0.0
+arctan2(-0.0, 0.0)  => -0.0
+arctan2(0.0, -0.0)  => pi
+arctan2(-0.0, -0.0) => -pi
+arctan2(+inf, +inf) => pi / 4
+arctan2(+inf, -inf) => 3 * pi / 4
+arctan2(-inf, +inf) => -pi / 4
+arctan2(-inf, -inf) => -3 * pi / 4
+arctan2(NaN, x)     => NaN for any Float x
+arctan2(y, NaN)     => NaN for any Float y
+ +

Example:

+
import Float "mo:base/Float";
+
+let sqrt2over2 = Float.sqrt(2) / 2;
+Float.arctan2(sqrt2over2, sqrt2over2) // => Float.pi / 4

public let exp : (x : Float) -> Float

Returns the value of e raised to the x-th power.

+

Special cases:

+
exp(+inf) => +inf
+exp(-inf) => 0.0
+exp(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.exp(1.0) // => Float.e

public let log : (x : Float) -> Float

Returns the natural logarithm (base-e) of x.

+

Special cases:

+
log(0.0)  => -inf
+log(-0.0) => -inf
+log(x)    => NaN if x < 0.0
+log(+inf) => +inf
+log(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.log(Float.e) // => 1.0

public func format(fmt : {#fix : Nat8; #exp : Nat8; #gen : Nat8; #hex : Nat8; #exact}, x : Float) : Text

Formatting. format(fmt, x) formats x to Text according to the +formatting directive fmt, which can take one of the following forms:

+
  • #fix prec as fixed-point format with prec digits
  • #exp prec as exponential format with prec digits
  • #gen prec as generic format with prec digits
  • #hex prec as hexadecimal format with prec digits
  • #exact as exact format that can be decoded without loss.
+ +

-0.0 is formatted with negative sign bit. +Positive infinity is formatted as inf. +Negative infinity is formatted as -inf. +NaN is formatted as NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.format(#exp 3, 123.0) // => "1.230e+02"

public let toText : Float -> Text

Conversion to Text. Use format(fmt, x) for more detailed control.

+

-0.0 is formatted with negative sign bit. +Positive infinity is formatted as inf. +Negative infinity is formatted as -inf. +NaN is formatted as NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toText(0.12) // => "0.12"

public let toInt64 : Float -> Int64

Conversion to Int64 by truncating Float, equivalent to toInt64(trunc(f))

+

Traps if the floating point number is larger or smaller than the representable Int64. +Also traps for inf, -inf, and NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt64(-12.3) // => -12

public let fromInt64 : Int64 -> Float

Conversion from Int64.

+

Note: The floating point number may be imprecise for large or small Int64.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt64(-42) // => -42.0

public let toInt : Float -> Int

Conversion to Int.

+

Traps for inf, -inf, and NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt(1.2e6) // => +1_200_000

public let fromInt : Int -> Float

Conversion from Int. May result in Inf.

+

Note: The floating point number may be imprecise for large or small Int values. +Returns inf if the integer is greater than the maximum floating point number. +Returns -inf if the integer is less than the minimum floating point number.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt(-123) // => -123.0

public func equal(x : Float, y : Float) : Bool

Returns x == y. +@deprecated Use Float.equalWithin() as this function does not consider numerical errors.

+

public func notEqual(x : Float, y : Float) : Bool

Returns x != y. +@deprecated Use Float.notEqualWithin() as this function does not consider numerical errors.

+

public func equalWithin(
  x : Float,
  y : Float,
  epsilon : Float
) : Bool

Determines whether x is equal to y within the defined tolerance of epsilon. +The epsilon considers numerical erros, see comment above. +Equivalent to Float.abs(x - y) <= epsilon for a non-negative epsilon.

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
equal(+0.0, -0.0, epsilon) => true for any `epsilon >= 0.0`
+equal(-0.0, +0.0, epsilon) => true for any `epsilon >= 0.0`
+equal(+inf, +inf, epsilon) => true for any `epsilon >= 0.0`
+equal(-inf, -inf, epsilon) => true for any `epsilon >= 0.0`
+equal(x, NaN, epsilon)     => false for any x and `epsilon >= 0.0`
+equal(NaN, y, epsilon)     => false for any y and `epsilon >= 0.0`
+ +

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.equal(-12.3, -1.23e1, epsilon) // => true

public func notEqualWithin(
  x : Float,
  y : Float,
  epsilon : Float
) : Bool

Determines whether x is not equal to y within the defined tolerance of epsilon. +The epsilon considers numerical erros, see comment above. +Equivalent to not equal(x, y, epsilon).

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
notEqual(+0.0, -0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqual(-0.0, +0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqual(+inf, +inf, epsilon) => false for any `epsilon >= 0.0`
+notEqual(-inf, -inf, epsilon) => false for any `epsilon >= 0.0`
+notEqual(x, NaN, epsilon)     => true for any x and `epsilon >= 0.0`
+notEqual(NaN, y, epsilon)     => true for any y and `epsilon >= 0.0`
+ +

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.notEqual(-12.3, -1.23e1, epsilon) // => false

public func less(x : Float, y : Float) : Bool

Returns x < y.

+

Special cases:

+
less(+0.0, -0.0) => false
+less(-0.0, +0.0) => false
+less(NaN, y)     => false for any Float y
+less(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.less(Float.e, Float.pi) // => true

public func lessOrEqual(x : Float, y : Float) : Bool

Returns x <= y.

+

Special cases:

+
lessOrEqual(+0.0, -0.0) => true
+lessOrEqual(-0.0, +0.0) => true
+lessOrEqual(NaN, y)     => false for any Float y
+lessOrEqual(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.lessOrEqual(0.123, 0.1234) // => true

public func greater(x : Float, y : Float) : Bool

Returns x > y.

+

Special cases:

+
greater(+0.0, -0.0) => false
+greater(-0.0, +0.0) => false
+greater(NaN, y)     => false for any Float y
+greater(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.greater(Float.pi, Float.e) // => true

public func greaterOrEqual(x : Float, y : Float) : Bool

Returns x >= y.

+

Special cases:

+
greaterOrEqual(+0.0, -0.0) => true
+greaterOrEqual(-0.0, +0.0) => true
+greaterOrEqual(NaN, y)     => false for any Float y
+greaterOrEqual(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.greaterOrEqual(0.1234, 0.123) // => true

public func compare(x : Float, y : Float) : {#less; #equal; #greater}

Defines a total order of x and y for use in sorting.

+

Note: Using this operation to determine equality or inequality is discouraged for two reasons:

+
  • It does not consider numerical errors, see comment above. Use equal(x, y) or + notEqual(x, y) to test for equality or inequality, respectively.
  • NaN are here considered equal if their sign matches, which is different to the standard equality + by == or when using equal() or notEqual().
+ +

Total order:

+
  • negative NaN (no distinction between signalling and quiet negative NaN)
  • negative infinity
  • negative numbers (including negative subnormal numbers in standard order)
  • negative zero (-0.0)
  • positive zero (+0.0)
  • positive numbers (including positive subnormal numbers in standard order)
  • positive infinity
  • positive NaN (no distinction between signalling and quiet positive NaN)
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.compare(0.123, 0.1234) // => #less

public func neg(x : Float) : Float

Returns the negation of x, -x .

+

Changes the sign bit for infinity. +Issue: Inconsistent behavior for zero and NaN. Probably related to +https://github.com/dfinity/motoko/issues/3646

+

Example:

+
import Float "mo:base/Float";
+
+Float.neg(1.23) // => -1.23

public func add(x : Float, y : Float) : Float

Returns the sum of x and y, x + y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
add(+inf, y)    => +inf if y is any Float except -inf and NaN
+add(-inf, y)    => -inf if y is any Float except +inf and NaN
+add(+inf, -inf) => NaN
+add(NaN, y)     => NaN for any Float y

The same cases apply commutatively, i.e. for add(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.add(1.23, 0.123) // => 1.353

public func sub(x : Float, y : Float) : Float

Returns the difference of x and y, x - y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
sub(+inf, y)    => +inf if y is any Float except +inf or NaN
+sub(-inf, y)    => -inf if y is any Float except -inf and NaN
+sub(x, +inf)    => -inf if x is any Float except +inf and NaN
+sub(x, -inf)    => +inf if x is any Float except -inf and NaN
+sub(+inf, +inf) => NaN
+sub(-inf, -inf) => NaN
+sub(NaN, y)     => NaN for any Float y
+sub(x, NaN)     => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sub(1.23, 0.123) // => 1.107

public func mul(x : Float, y : Float) : Float

Returns the product of x and y, x * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
mul(+inf, y) => +inf if y > 0.0
+mul(-inf, y) => -inf if y > 0.0
+mul(+inf, y) => -inf if y < 0.0
+mul(-inf, y) => +inf if y < 0.0
+mul(+inf, 0.0) => NaN
+mul(-inf, 0.0) => NaN
+mul(NaN, y) => NaN for any Float y

The same cases apply commutatively, i.e. for mul(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.mul(1.23, 1e2) // => 123.0

public func div(x : Float, y : Float) : Float

Returns the division of x by y, x / y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
div(0.0, 0.0) => NaN
+div(x, 0.0)   => +inf for x > 0.0
+div(x, 0.0)   => -inf for x < 0.0
+div(x, +inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(x, -inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(+inf, y)  => +inf if y >= 0.0
+div(+inf, y)  => -inf if y < 0.0
+div(-inf, y)  => -inf if y >= 0.0
+div(-inf, y)  => +inf if y < 0.0
+div(NaN, y)   => NaN for any Float y
+div(x, NaN)   => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.div(1.23, 1e2) // => 0.0123

public func rem(x : Float, y : Float) : Float

Returns the floating point division remainder x % y, +which is defined as x - trunc(x / y) * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
rem(0.0, 0.0) => NaN
+rem(x, y)     => +inf if sign(x) == sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, y)     => -inf if sign(x) != sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, +inf)  => x for any x except +inf, -inf, and NaN
+rem(x, -inf)  => x for any x except +inf, -inf, and NaN
+rem(+inf, y)  => NaN for any Float y
+rem(-inf, y)  => NaN for any Float y
+rem(NaN, y)   => NaN for any Float y
+rem(x, NaN)   => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.rem(7.2, 2.3) // => 0.3 (with numerical imprecision)

public func pow(x : Float, y : Float) : Float

Returns x to the power of y, x ** y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
pow(+inf, y)    => +inf for any y > 0.0 including +inf
+pow(+inf, 0.0)  => 1.0
+pow(+inf, y)    => 0.0 for any y < 0.0 including -inf
+pow(x, +inf)    => +inf if x > 0.0 or x < 0.0
+pow(0.0, +inf)  => 0.0
+pow(x, -inf)    => 0.0 if x > 0.0 or x < 0.0
+pow(0.0, -inf)  => +inf
+pow(x, y)       => NaN if x < 0.0 and y is a non-integral Float
+pow(-inf, y)    => +inf if y > 0.0 and y is a non-integral or an even integral Float
+pow(-inf, y)    => -inf if y > 0.0 and y is an odd integral Float
+pow(-inf, 0.0)  => 1.0
+pow(-inf, y)    => 0.0 if y < 0.0
+pow(-inf, +inf) => +inf
+pow(-inf, -inf) => 1.0
+pow(NaN, y)     => NaN if y != 0.0
+pow(NaN, 0.0)   => 1.0
+pow(x, NaN)     => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.pow(2.5, 2.0) // => 6.25

\ No newline at end of file diff --git a/base-doc/Func.html b/base-doc/Func.html new file mode 100644 index 00000000000..89ded7dcf8b --- /dev/null +++ b/base-doc/Func.html @@ -0,0 +1,23 @@ + +

Func

Functions on functions, creating functions from simpler inputs.

+

(Most commonly used when programming in functional style using higher-order +functions.)

+

public func compose<A, B, C>(f : B -> C, g : A -> B) : A -> C

Import from the base library to use this module.

+
motoko name=import
+import { compose; const; identity } = "mo:base/Func";
+import Text = "mo:base/Text";
+import Char = "mo:base/Char";

The composition of two functions f and g is a function that applies g and then f.

+

Example:

+
motoko include=import
+let textFromNat32 = compose(Text.fromChar, Char.fromNat32);
+assert textFromNat32(65) == "A";

public func identity<A>(x : A) : A

The identity function returns its argument. +Example:

+
motoko include=import
+assert identity(10) == 10;
+assert identity(true) == true;

public func const<A, B>(x : A) : B -> A

The const function is a curried function that accepts an argument x, +and then returns a function that discards its argument and always returns +the x.

+

Example:

+
motoko include=import
+assert const<Nat, Text>(10)("hello") == 10;
+assert const(true)(20) == true;

\ No newline at end of file diff --git a/base-doc/Hash.html b/base-doc/Hash.html new file mode 100644 index 00000000000..0bba57f1138 --- /dev/null +++ b/base-doc/Hash.html @@ -0,0 +1,16 @@ + +

Hash

Hash values

+

type Hash = Nat32

Hash values represent a string of hash bits, packed into a Nat32.

+

public let length : Nat

The hash length, always 31.

+

public func bit(h : Hash, pos : Nat) : Bool

Project a given bit from the bit vector.

+

public func equal(ha : Hash, hb : Hash) : Bool

Test if two hashes are equal

+

public func hash(n : Nat) : Hash

Computes a hash from the least significant 32-bits of n, ignoring other bits. +@deprecated For large Nat values consider using a bespoke hash function that considers all of the argument's bits.

+

public func debugPrintBits(bits : Hash)

@deprecated This function will be removed in future.

+

public func debugPrintBitsRev(bits : Hash)

@deprecated This function will be removed in future.

+

public func hashNat8(key : [Hash]) : Hash

Jenkin's one at a time:

+

https://en.wikipedia.org/wiki/Jenkins_hash_function#one_at_a_time

+

The input type should actually be [Nat8]. +Note: Be sure to explode each Nat8 of a Nat32 into its own Nat32, and to shift into lower 8 bits. +@deprecated This function may be removed or changed in future.

+

\ No newline at end of file diff --git a/base-doc/HashMap.html b/base-doc/HashMap.html new file mode 100644 index 00000000000..266443cea28 --- /dev/null +++ b/base-doc/HashMap.html @@ -0,0 +1,206 @@ + +

HashMap

Class HashMap<K, V> provides a hashmap from keys of type K to values of type V. +The class is parameterized by the key's equality and hash functions, +and an initial capacity. However, the underlying allocation happens only when +the first key-value entry is inserted.

+

Internally, the map is represented as an array of AssocList (buckets). +The growth policy of the underyling array is very simple, for now: double +the current capacity when the expected bucket list size grows beyond a +certain constant.

+

WARNING: Certain operations are amortized O(1) time, such as put, but run +in worst case O(size) time. These worst case runtimes may exceed the cycles limit +per message if the size of the map is large enough. Further, this runtime analysis +assumes that the hash functions uniformly maps keys over the hash space. Grow these structures +with discretion, and with good hash functions. All amortized operations +below also list the worst case runtime.

+

For maps without amortization, see TrieMap.

+

Note on the constructor: +The argument initCapacity determines the initial number of buckets in the +underyling array. Also, the runtime and space anlyses in this documentation +assumes that the equality and hash functions for keys used to construct the +map run in O(1) time and space.

+

Example:

+
motoko name=initialize
+import HashMap "mo:base/HashMap";
+import Text "mo:base/Text";
+
+let map = HashMap.HashMap<Text, Nat>(5, Text.equal, Text.hash);
+ +

Runtime: O(1)

+

Space: O(1)

+

class HashMap<K, V>(
  initCapacity : Nat,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
)

public func size() : Nat

Returns the current number of key-value entries in the map.

+

Example:

+
motoko include=initialize
+map.size() // => 0
+ +

Runtime: O(1)

+

Space: O(1)

+

public func get(key : K) : (value : ?V)

Returns the value assocaited with key key if present and null otherwise.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.get("key") // => ?3
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Space: O(1)

+

public func put(key : K, value : V)

Insert the value value with key key. Overwrites any existing entry with key key.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.get("key") // => ?3
+ +

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will cause +the initial allocation of the underlying array.

+

public func replace(key : K, value : V) : (oldValue : ?V)

Insert the value value with key key. Returns the previous value +associated with key key or null if no such value exists.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+ignore map.replace("key", 2); // => ?3
+map.get("key") // => ?2
+ +

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will cause +the initial allocation of the underlying array.

+

public func delete(key : K)

Deletes the entry with the key key. Has no effect if key is not +present in the map.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.delete("key");
+map.get("key"); // => null
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

public func remove(key : K) : (oldValue : ?V)

Deletes the entry with the key key. Returns the previous value +associated with key key or null if no such value exists.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.remove("key"); // => ?3
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

public func keys() : Iter.Iter<K>

Returns an Iterator (Iter) over the keys of the map. +Iterator provides a single method next(), which returns +keys in no specific order, or null when out of keys to iterate over.

+

Example:

+
motoko include=initialize
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var keys = "";
+for (key in map.keys()) {
+  keys := key # " " # keys
+};
+keys // => "key3 key2 key1 "
+ +

Cost of iteration over all keys:

+

Runtime: O(size)

+

Space: O(1)

+

public func vals() : Iter.Iter<V>

Returns an Iterator (Iter) over the values of the map. +Iterator provides a single method next(), which returns +values in no specific order, or null when out of values to iterate over.

+

Example:

+
motoko include=initialize
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var sum = 0;
+for (value in map.vals()) {
+  sum += value;
+};
+sum // => 6
+ +

Cost of iteration over all values:

+

Runtime: O(size)

+

Space: O(1)

+

public func entries() : Iter.Iter<(K, V)>

Returns an Iterator (Iter) over the key-value pairs in the map. +Iterator provides a single method next(), which returns +pairs in no specific order, or null when out of pairs to iterate over.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var pairs = "";
+for ((key, value) in map.entries()) {
+  pairs := "(" # key # ", " # Nat.toText(value) # ") " # pairs
+};
+pairs // => "(key3, 3) (key2, 2) (key1, 1)"
+ +

Cost of iteration over all pairs:

+

Runtime: O(size)

+

Space: O(1)

+

public func clone<K, V>(
  map : HashMap<K, V>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : HashMap<K, V>

Returns a copy of map, initializing the copy with the provided equality +and hash functions.

+

Example:

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.clone(map, Text.equal, Text.hash);
+map2.get("key1") // => ?1
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

public func fromIter<K, V>(
  iter : Iter.Iter<(K, V)>,
  initCapacity : Nat,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : HashMap<K, V>

Returns a new map, containing all entries given by the iterator iter. +The new map is initialized with the provided initial capacity, equality, +and hash functions.

+

Example:

+
motoko include=initialize
+let entries = [("key3", 3), ("key2", 2), ("key1", 1)];
+let iter = entries.vals();
+
+let map2 = HashMap.fromIter<Text, Nat>(iter, entries.size(), Text.equal, Text.hash);
+map2.get("key1") // => ?1
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

public func map<K, V1, V2>(
  hashMap : HashMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> V2
) : HashMap<K, V2>

Creates a new map by applying f to each entry in hashMap. Each entry +(k, v) in the old map is transformed into a new entry (k, v2), where +the new value v2 is created by applying f to (k, v).

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.map<Text, Nat, Nat>(map, Text.equal, Text.hash, func (k, v) = v * 2);
+map2.get("key2") // => ?4
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<K, V1, V2>(
  hashMap : HashMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> ?V2
) : HashMap<K, V2>

Creates a new map by applying f to each entry in hashMap. For each entry +(k, v) in the old map, if f evaluates to null, the entry is discarded. +Otherwise, the entry is transformed into a new entry (k, v2), where +the new value v2 is the result of applying f to (k, v).

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 =
+  HashMap.mapFilter<Text, Nat, Nat>(
+    map,
+    Text.equal,
+    Text.hash,
+    func (k, v) = if (v == 2) { null } else { ?(v * 2)}
+);
+map2.get("key3") // => ?6
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/Heap.html b/base-doc/Heap.html new file mode 100644 index 00000000000..e17afe371b6 --- /dev/null +++ b/base-doc/Heap.html @@ -0,0 +1,103 @@ + +

Heap

Class Heap<X> provides a priority queue of elements of type X.

+

The class wraps a purely-functional implementation based on a leftist heap.

+

Note on the constructor: +The constructor takes in a comparison function compare that defines the +ordering between elements of type X. Most primitive types have a default +version of this comparison function defined in their modules (e.g. Nat.compare). +The runtime analysis in this documentation assumes that the compare function +runs in O(1) time and space.

+

Example:

+
motoko name=initialize
+import Heap "mo:base/Heap";
+import Text "mo:base/Text";
+
+let heap = Heap.Heap<Text>(Text.compare);
+ +

Runtime: O(1)

+

Space: O(1)

+

type Tree<X> = ?(Int, X, Tree<X>, Tree<X>)

class Heap<X>(compare : (X, X) -> O.Order)

public func put(x : X)

Inserts an element into the heap.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.peekMin() // => ?"apple"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func peekMin() : ?X

Return the minimal element in the heap, or null if the heap is empty.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.peekMin() // => ?"apple"
+ +

Runtime: O(1)

+

Space: O(1)

+

public func deleteMin()

Delete the minimal element in the heap, if it exists.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.deleteMin();
+heap.peekMin(); // => ?"banana"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func removeMin() : (minElement : ?X)

Delete and return the minimal element in the heap, if it exists.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.removeMin(); // => ?"apple"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func share() : Tree<X>

Return a snapshot of the internal functional tree representation as sharable data. +The returned tree representation is not affected by subsequent changes of the Heap instance.

+

Example:

+
motoko include=initialize
+
+heap.put("banana");
+heap.share();
+ +

Useful for storing the heap as a stable variable, pretty-printing, and sharing it across async function calls, +i.e. passing it in async arguments or async results.

+

Runtime: O(1)

+

Space: O(1)

+

public func unsafeUnshare(tree : Tree<X>)

Rewraps a snapshot of a heap (obtained by share()) in a Heap instance. +The wrapping instance must be initialized with the same compare +function that created the snapshot.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+let snapshot = heap.share();
+let heapCopy = Heap.Heap<Text>(Text.compare);
+heapCopy.unsafeUnshare(snapshot);
+heapCopy.peekMin() // => ?"apple"
+ +

Useful for loading a stored heap from a stable variable or accesing a heap +snapshot passed from an async function call.

+

Runtime: O(1).

+

Space: O(1).

+

public func fromIter<X>(iter : I.Iter<X>, compare : (X, X) -> O.Order) : Heap<X>

Returns a new Heap, containing all entries given by the iterator iter. +The new map is initialized with the provided compare function.

+

Example:

+
motoko include=initialize
+let entries = ["banana", "apple", "cantaloupe"];
+let iter = entries.vals();
+
+let newHeap = Heap.fromIter<Text>(iter, Text.compare);
+newHeap.peekMin() // => ?"apple"
+ +

Runtime: O(size)

+

Space: O(size)

+

\ No newline at end of file diff --git a/base-doc/Int.html b/base-doc/Int.html new file mode 100644 index 00000000000..48f3070b709 --- /dev/null +++ b/base-doc/Int.html @@ -0,0 +1,178 @@ + +

Int

Signed integer numbers with infinite precision (also called big integers).

+

Most operations on integer numbers (e.g. addition) are available as built-in operators (e.g. -1 + 1). +This module provides equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
motoko name=import
+import Int "mo:base/Int";

type Int = Prim.Types.Int

Infinite precision signed integers.

+

public func abs(x : Int) : Nat

Returns the absolute value of x.

+

Example:

+
motoko include=import
+Int.abs(-12) // => 12

public func toText(x : Int) : Text

Converts an integer number to its textual representation. Textual +representation do not contain underscores to represent commas.

+

Example:

+
motoko include=import
+Int.toText(-1234) // => "-1234"

public func min(x : Int, y : Int) : Int

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int.min(2, -3) // => -3

public func max(x : Int, y : Int) : Int

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int.max(2, -3) // => 2

public func hash(i : Int) : Hash.Hash

Computes a hash from the least significant 32-bits of i, ignoring other bits. +@deprecated For large Int values consider using a bespoke hash function that considers all of the argument's bits.

+

public func hashAcc(h1 : Hash.Hash, i : Int) : Hash.Hash

Computes an accumulated hash from h1 and the least significant 32-bits of i, ignoring other bits in i. +@deprecated For large Int values consider using a bespoke hash function that considers all of the argument's bits.

+

public func equal(x : Int, y : Int) : Bool

Equality function for Int types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int.equal) // => true

public func notEqual(x : Int, y : Int) : Bool

Inequality function for Int types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int, y : Int) : Bool

"Less than" function for Int types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int, y : Int) : Bool

"Less than or equal" function for Int types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int.lessOrEqual(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int, y : Int) : Bool

"Greater than" function for Int types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int.greater(1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Int, y : Int) : Bool

"Greater than or equal" function for Int types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int.greaterOrEqual(1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Int, y : Int) : {#less; #equal; #greater}

General-purpose comparison function for Int. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3], Int.compare) // => [-3, -2, 1]

public func neg(x : Int) : Int

Returns the negation of x, -x .

+

Example:

+
motoko include=import
+Int.neg(123) // => -123

public func add(x : Int, y : Int) : Int

Returns the sum of x and y, x + y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.add(1, -2); // => -1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.add) // => -4

public func sub(x : Int, y : Int) : Int

Returns the difference of x and y, x - y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.sub(1, 2); // => -1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.sub) // => 4

public func mul(x : Int, y : Int) : Int

Returns the product of x and y, x * y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.mul(-2, 3); // => -6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 1, Int.mul) // => 6

public func div(x : Int, y : Int) : Int

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int.div(6, -2); // => -3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int, y : Int) : Int

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int.rem(6, -4); // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int, y : Int) : Int

Returns x to the power of y, x ** y.

+

Traps when y is negative or y > 2 ** 32 - 1. +No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.pow(-2, 3); // => -8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Int16.html b/base-doc/Int16.html new file mode 100644 index 00000000000..f75fedfd08d --- /dev/null +++ b/base-doc/Int16.html @@ -0,0 +1,216 @@ + +

Int16

16-bit signed integers with checked arithmetic.

+

Common 16-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

+

type Int16 = Prim.Types.Int16

16-bit signed integers.

+

public let minimumValue : Int16

Minimum 16-bit integer value, -2 ** 15.

+

public let maximumValue : Int16

Maximum 16-bit integer value, +2 ** 15 - 1.

+

public let toInt : Int16 -> Int

Converts a 16-bit signed integer to a signed integer with infinite precision.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.toInt(12_345) // => 12_345 : Int

public let fromInt : Int -> Int16

Converts a signed integer with infinite precision to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.fromInt(12_345) // => +12_345 : Int16

public let fromIntWrap : Int -> Int16

Converts a signed integer with infinite precision to a 16-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.fromIntWrap(-12_345) // => -12_345 : Int

public let fromNat16 : Nat16 -> Int16

Converts an unsigned 16-bit integer to a signed 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.fromNat16(12_345) // => +12_345 : Int16

public let toNat16 : Int16 -> Nat16

Converts a signed 16-bit integer to an unsigned 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.toNat16(-1) // => 65_535 : Nat16 // underflow

public func toText(x : Int16) : Text

Returns the Text representation of x. +Formats the integer in decimal representation without underscore separators for thousand figures.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.toText(-12345) // => "-12345"

public func abs(x : Int16) : Int16

Returns the absolute value of x.

+

Traps when x == -2 ** 15 (the minimum Int16 value).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.abs(-12345) // => +12_345

public func min(x : Int16, y : Int16) : Int16

Returns the minimum of x and y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.min(+2, -3) // => -3

public func max(x : Int16, y : Int16) : Int16

Returns the maximum of x and y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.max(+2, -3) // => +2

public func equal(x : Int16, y : Int16) : Bool

Returns x == y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.equal(123, 123) // => true

public func notEqual(x : Int16, y : Int16) : Bool

Returns x != y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.notEqual(123, 123) // => false

public func less(x : Int16, y : Int16) : Bool

Returns x < y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.less(123, 1234) // => true

public func lessOrEqual(x : Int16, y : Int16) : Bool

Returns x <= y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.lessOrEqual(123, 1234) // => true

public func greater(x : Int16, y : Int16) : Bool

Returns x > y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.greater(1234, 123) // => true

public func greaterOrEqual(x : Int16, y : Int16) : Bool

Returns x >= y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.greaterOrEqual(1234, 123) // => true

public func compare(x : Int16, y : Int16) : {#less; #equal; #greater}

Returns the order of x and y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.compare(123, 1234) // => #less

public func neg(x : Int16) : Int16

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 15).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.neg(123) // => -123

public func add(x : Int16, y : Int16) : Int16

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.add(1234, 123) // => +1_357

public func sub(x : Int16, y : Int16) : Int16

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.sub(1234, 123) // => +1_111

public func mul(x : Int16, y : Int16) : Int16

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.mul(123, 100) // => +12_300

public func div(x : Int16, y : Int16) : Int16

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.div(123, 10) // => +12

public func rem(x : Int16, y : Int16) : Int16

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.rem(123, 10) // => +3

public func pow(x : Int16, y : Int16) : Int16

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 16.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.pow(2, 10) // => +1_024

public func bitnot(x : Int16) : Int16

Returns the bitwise negation of x, ^x.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitnot(-256 /* 0xff00 */) // => +255 // 0xff

public func bitand(x : Int16, y : Int16) : Int16

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitand(0x0fff, 0x00f0) // => +240 // 0xf0

public func bitor(x : Int16, y : Int16) : Int16

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitor(0x0f0f, 0x00f0) // => +4_095 // 0x0fff

public func bitxor(x : Int16, y : Int16) : Int16

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitxor(0x0fff, 0x00f0) // => +3_855 // 0x0f0f

public func bitshiftLeft(x : Int16, y : Int16) : Int16

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 16, the semantics is the same as for bitshiftLeft(x, y % 16). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.

public func bitshiftRight(x : Int16, y : Int16) : Int16

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 16, the semantics is the same as for bitshiftRight(x, y % 16). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`

public func bitrotLeft(x : Int16, y : Int16) : Int16

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 16, the semantics is the same as for bitrotLeft(x, y % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitrotLeft(0x2001, 4) // => +18 // 0x12.

public func bitrotRight(x : Int16, y : Int16) : Int16

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 16, the semantics is the same as for bitrotRight(x, y % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitrotRight(0x2010, 8) // => +4_128 // 0x01020.

public func bittest(x : Int16, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 16, the semantics is the same as for bittest(x, p % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bittest(128, 7) // => true

public func bitset(x : Int16, p : Nat) : Int16

Returns the value of setting bit p in x to 1. +If p >= 16, the semantics is the same as for bitset(x, p % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitset(0, 7) // => +128

public func bitclear(x : Int16, p : Nat) : Int16

Returns the value of clearing bit p in x to 0. +If p >= 16, the semantics is the same as for bitclear(x, p % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitclear(-1, 7) // => -129

public func bitflip(x : Int16, p : Nat) : Int16

Returns the value of flipping bit p in x. +If p >= 16, the semantics is the same as for bitclear(x, p % 16).

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int16) -> Int16

Returns the count of non-zero bits in x.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitcountNonZero(0xff) // => +8

public let bitcountLeadingZero : (x : Int16) -> Int16

Returns the count of leading zero bits in x.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitcountLeadingZero(0x80) // => +8

public let bitcountTrailingZero : (x : Int16) -> Int16

Returns the count of trailing zero bits in x.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.bitcountTrailingZero(0x0100) // => +8

public func addWrap(x : Int16, y : Int16) : Int16

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.addWrap(2 ** 14, 2 ** 14) // => -32_768 // overflow

public func subWrap(x : Int16, y : Int16) : Int16

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.subWrap(-2 ** 15, 1) // => +32_767 // underflow

public func mulWrap(x : Int16, y : Int16) : Int16

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.mulWrap(2 ** 8, 2 ** 8) // => 0 // overflow

public func powWrap(x : Int16, y : Int16) : Int16

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 16.

+

Example:

+
import Int16 "mo:base/Int16";
+
+Int16.powWrap(2, 15) // => -32_768 // overflow

\ No newline at end of file diff --git a/base-doc/Int32.html b/base-doc/Int32.html new file mode 100644 index 00000000000..4696d5d9584 --- /dev/null +++ b/base-doc/Int32.html @@ -0,0 +1,216 @@ + +

Int32

32-bit signed integers with checked arithmetic.

+

Common 32-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

+

type Int32 = Prim.Types.Int32

32-bit signed integers.

+

public let minimumValue : Int32

Minimum 32-bit integer value, -2 ** 31.

+

public let maximumValue : Int32

Maximum 32-bit integer value, +2 ** 31 - 1.

+

public let toInt : Int32 -> Int

Converts a 32-bit signed integer to a signed integer with infinite precision.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.toInt(123_456) // => 123_456 : Int

public let fromInt : Int -> Int32

Converts a signed integer with infinite precision to a 32-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.fromInt(123_456) // => +123_456 : Int32

public let fromIntWrap : Int -> Int32

Converts a signed integer with infinite precision to a 32-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.fromIntWrap(-123_456) // => -123_456 : Int

public let fromNat32 : Nat32 -> Int32

Converts an unsigned 32-bit integer to a signed 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.fromNat32(123_456) // => +123_456 : Int32

public let toNat32 : Int32 -> Nat32

Converts a signed 32-bit integer to an unsigned 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.toNat32(-1) // => 4_294_967_295 : Nat32 // underflow

public func toText(x : Int32) : Text

Returns the Text representation of x. +Formats the integer in decimal representation without underscore separators for thousand figures.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.toText(-123456) // => "-123456"

public func abs(x : Int32) : Int32

Returns the absolute value of x.

+

Traps when x == -2 ** 31 (the minimum Int32 value).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.abs(-123456) // => +123_456

public func min(x : Int32, y : Int32) : Int32

Returns the minimum of x and y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.min(+2, -3) // => -3

public func max(x : Int32, y : Int32) : Int32

Returns the maximum of x and y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.max(+2, -3) // => +2

public func equal(x : Int32, y : Int32) : Bool

Returns x == y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.equal(123, 123) // => true

public func notEqual(x : Int32, y : Int32) : Bool

Returns x != y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.notEqual(123, 123) // => false

public func less(x : Int32, y : Int32) : Bool

Returns x < y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.less(123, 1234) // => true

public func lessOrEqual(x : Int32, y : Int32) : Bool

Returns x <= y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.lessOrEqual(123, 1234) // => true

public func greater(x : Int32, y : Int32) : Bool

Returns x > y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.greater(1234, 123) // => true

public func greaterOrEqual(x : Int32, y : Int32) : Bool

Returns x >= y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.greaterOrEqual(1234, 123) // => true

public func compare(x : Int32, y : Int32) : {#less; #equal; #greater}

Returns the order of x and y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.compare(123, 1234) // => #less

public func neg(x : Int32) : Int32

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 31).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.neg(123) // => -123

public func add(x : Int32, y : Int32) : Int32

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.add(1234, 123) // => +1_357

public func sub(x : Int32, y : Int32) : Int32

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.sub(1234, 123) // => +1_111

public func mul(x : Int32, y : Int32) : Int32

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.mul(123, 100) // => +12_300

public func div(x : Int32, y : Int32) : Int32

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.div(123, 10) // => +12

public func rem(x : Int32, y : Int32) : Int32

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.rem(123, 10) // => +3

public func pow(x : Int32, y : Int32) : Int32

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 32.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.pow(2, 10) // => +1_024

public func bitnot(x : Int32) : Int32

Returns the bitwise negation of x, ^x.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitnot(-256 /* 0xffff_ff00 */) // => +255 // 0xff

public func bitand(x : Int32, y : Int32) : Int32

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitand(0xffff, 0x00f0) // => +240 // 0xf0

public func bitor(x : Int32, y : Int32) : Int32

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff

public func bitxor(x : Int32, y : Int32) : Int32

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f

public func bitshiftLeft(x : Int32, y : Int32) : Int32

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 32, the semantics is the same as for bitshiftLeft(x, y % 32). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.

public func bitshiftRight(x : Int32, y : Int32) : Int32

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 32, the semantics is the same as for bitshiftRight(x, y % 32). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`

public func bitrotLeft(x : Int32, y : Int32) : Int32

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 32, the semantics is the same as for bitrotLeft(x, y % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitrotLeft(0x2000_0001, 4) // => +18 // 0x12.

public func bitrotRight(x : Int32, y : Int32) : Int32

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 32, the semantics is the same as for bitrotRight(x, y % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitrotRight(0x0002_0001, 8) // => +16_777_728 // 0x0100_0200.

public func bittest(x : Int32, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 32, the semantics is the same as for bittest(x, p % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bittest(128, 7) // => true

public func bitset(x : Int32, p : Nat) : Int32

Returns the value of setting bit p in x to 1. +If p >= 32, the semantics is the same as for bitset(x, p % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitset(0, 7) // => +128

public func bitclear(x : Int32, p : Nat) : Int32

Returns the value of clearing bit p in x to 0. +If p >= 32, the semantics is the same as for bitclear(x, p % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitclear(-1, 7) // => -129

public func bitflip(x : Int32, p : Nat) : Int32

Returns the value of flipping bit p in x. +If p >= 32, the semantics is the same as for bitclear(x, p % 32).

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int32) -> Int32

Returns the count of non-zero bits in x.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitcountNonZero(0xffff) // => +16

public let bitcountLeadingZero : (x : Int32) -> Int32

Returns the count of leading zero bits in x.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitcountLeadingZero(0x8000) // => +16

public let bitcountTrailingZero : (x : Int32) -> Int32

Returns the count of trailing zero bits in x.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.bitcountTrailingZero(0x0201_0000) // => +16

public func addWrap(x : Int32, y : Int32) : Int32

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.addWrap(2 ** 30, 2 ** 30) // => -2_147_483_648 // overflow

public func subWrap(x : Int32, y : Int32) : Int32

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.subWrap(-2 ** 31, 1) // => +2_147_483_647 // underflow

public func mulWrap(x : Int32, y : Int32) : Int32

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.mulWrap(2 ** 16, 2 ** 16) // => 0 // overflow

public func powWrap(x : Int32, y : Int32) : Int32

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 32.

+

Example:

+
import Int32 "mo:base/Int32";
+
+Int32.powWrap(2, 31) // => -2_147_483_648 // overflow

\ No newline at end of file diff --git a/base-doc/Int64.html b/base-doc/Int64.html new file mode 100644 index 00000000000..f49694a31ca --- /dev/null +++ b/base-doc/Int64.html @@ -0,0 +1,216 @@ + +

Int64

64-bit signed integers with checked arithmetic.

+

Common 64-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

+

type Int64 = Prim.Types.Int64

64-bit signed integers.

+

public let minimumValue : Int64

Minimum 64-bit integer value, -2 ** 63.

+

public let maximumValue : Int64

Maximum 64-bit integer value, +2 ** 63 - 1.

+

public let toInt : Int64 -> Int

Converts a 64-bit signed integer to a signed integer with infinite precision.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.toInt(123_456) // => 123_456 : Int

public let fromInt : Int -> Int64

Converts a signed integer with infinite precision to a 64-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.fromInt(123_456) // => +123_456 : Int64

public let fromIntWrap : Int -> Int64

Converts a signed integer with infinite precision to a 64-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.fromIntWrap(-123_456) // => -123_456 : Int64

public let fromNat64 : Nat64 -> Int64

Converts an unsigned 64-bit integer to a signed 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.fromNat64(123_456) // => +123_456 : Int64

public let toNat64 : Int64 -> Nat64

Converts a signed 64-bit integer to an unsigned 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.toNat64(-1) // => 18_446_744_073_709_551_615 : Nat64 // underflow

public func toText(x : Int64) : Text

Returns the Text representation of x. +Formats the integer in decimal representation without underscore separators for thousand figures.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.toText(-123456) // => "-123456"

public func abs(x : Int64) : Int64

Returns the absolute value of x.

+

Traps when x == -2 ** 63 (the minimum Int64 value).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.abs(-123456) // => +123_456

public func min(x : Int64, y : Int64) : Int64

Returns the minimum of x and y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.min(+2, -3) // => -3

public func max(x : Int64, y : Int64) : Int64

Returns the maximum of x and y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.max(+2, -3) // => +2

public func equal(x : Int64, y : Int64) : Bool

Returns x == y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.equal(123, 123) // => true

public func notEqual(x : Int64, y : Int64) : Bool

Returns x != y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.notEqual(123, 123) // => false

public func less(x : Int64, y : Int64) : Bool

Returns x < y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.less(123, 1234) // => true

public func lessOrEqual(x : Int64, y : Int64) : Bool

Returns x <= y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.lessOrEqual(123, 1234) // => true

public func greater(x : Int64, y : Int64) : Bool

Returns x > y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.greater(1234, 123) // => true

public func greaterOrEqual(x : Int64, y : Int64) : Bool

Returns x >= y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.greaterOrEqual(1234, 123) // => true

public func compare(x : Int64, y : Int64) : {#less; #equal; #greater}

Returns the order of x and y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.compare(123, 1234) // => #less

public func neg(x : Int64) : Int64

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 63).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.neg(123) // => -123

public func add(x : Int64, y : Int64) : Int64

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.add(1234, 123) // => +1_357

public func sub(x : Int64, y : Int64) : Int64

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.sub(1234, 123) // => +1_111

public func mul(x : Int64, y : Int64) : Int64

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.mul(123, 100) // => +12_300

public func div(x : Int64, y : Int64) : Int64

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.div(123, 10) // => +12

public func rem(x : Int64, y : Int64) : Int64

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.rem(123, 10) // => +3

public func pow(x : Int64, y : Int64) : Int64

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 64.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.pow(2, 10) // => +1_024

public func bitnot(x : Int64) : Int64

Returns the bitwise negation of x, ^x.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitnot(-256 /* 0xffff_ffff_ffff_ff00 */) // => +255 // 0xff

public func bitand(x : Int64, y : Int64) : Int64

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitand(0xffff, 0x00f0) // => +240 // 0xf0

public func bitor(x : Int64, y : Int64) : Int64

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff

public func bitxor(x : Int64, y : Int64) : Int64

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f

public func bitshiftLeft(x : Int64, y : Int64) : Int64

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 64, the semantics is the same as for bitshiftLeft(x, y % 64). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.

public func bitshiftRight(x : Int64, y : Int64) : Int64

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 64, the semantics is the same as for bitshiftRight(x, y % 64). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`

public func bitrotLeft(x : Int64, y : Int64) : Int64

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 64, the semantics is the same as for bitrotLeft(x, y % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitrotLeft(0x2000_0000_0000_0001, 4) // => +18 // 0x12.

public func bitrotRight(x : Int64, y : Int64) : Int64

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 64, the semantics is the same as for bitrotRight(x, y % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitrotRight(0x0002_0000_0000_0001, 48) // => +65538 // 0x1_0002.

public func bittest(x : Int64, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 64, the semantics is the same as for bittest(x, p % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bittest(128, 7) // => true

public func bitset(x : Int64, p : Nat) : Int64

Returns the value of setting bit p in x to 1. +If p >= 64, the semantics is the same as for bitset(x, p % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitset(0, 7) // => +128

public func bitclear(x : Int64, p : Nat) : Int64

Returns the value of clearing bit p in x to 0. +If p >= 64, the semantics is the same as for bitclear(x, p % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitclear(-1, 7) // => -129

public func bitflip(x : Int64, p : Nat) : Int64

Returns the value of flipping bit p in x. +If p >= 64, the semantics is the same as for bitclear(x, p % 64).

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int64) -> Int64

Returns the count of non-zero bits in x.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitcountNonZero(0xffff) // => +16

public let bitcountLeadingZero : (x : Int64) -> Int64

Returns the count of leading zero bits in x.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitcountLeadingZero(0x8000_0000) // => +32

public let bitcountTrailingZero : (x : Int64) -> Int64

Returns the count of trailing zero bits in x.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.bitcountTrailingZero(0x0201_0000) // => +16

public func addWrap(x : Int64, y : Int64) : Int64

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.addWrap(2 ** 62, 2 ** 62) // => -9_223_372_036_854_775_808 // overflow

public func subWrap(x : Int64, y : Int64) : Int64

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.subWrap(-2 ** 63, 1) // => +9_223_372_036_854_775_807 // underflow

public func mulWrap(x : Int64, y : Int64) : Int64

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.mulWrap(2 ** 32, 2 ** 32) // => 0 // overflow

public func powWrap(x : Int64, y : Int64) : Int64

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 64.

+

Example:

+
import Int64 "mo:base/Int64";
+
+Int64.powWrap(2, 63) // => -9_223_372_036_854_775_808 // overflow

\ No newline at end of file diff --git a/base-doc/Int8.html b/base-doc/Int8.html new file mode 100644 index 00000000000..3cb7433a39a --- /dev/null +++ b/base-doc/Int8.html @@ -0,0 +1,216 @@ + +

Int8

8-bit signed integers with checked arithmetic.

+

Common 8-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

+

type Int8 = Prim.Types.Int8

8-bit signed integers.

+

public let minimumValue : Int8

Minimum 8-bit integer value, -2 ** 7.

+

public let maximumValue : Int8

Maximum 8-bit integer value, +2 ** 7 - 1.

+

public let toInt : Int8 -> Int

Converts a 8-bit signed integer to a signed integer with infinite precision.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.toInt(123) // => 123 : Int

public let fromInt : Int -> Int8

Converts a signed integer with infinite precision to a 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.fromInt(123) // => +123 : Int8

public let fromIntWrap : Int -> Int8

Converts a signed integer with infinite precision to a 8-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.fromIntWrap(-123) // => -123 : Int

public let fromNat8 : Nat8 -> Int8

Converts an unsigned 8-bit integer to a signed 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.fromNat8(123) // => +123 : Int8

public let toNat8 : Int8 -> Nat8

Converts a signed 8-bit integer to an unsigned 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.toNat8(-1) // => 255 : Nat8 // underflow

public func toText(x : Int8) : Text

Returns the Text representation of x. +Formats the integer in decimal representation.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.toText(-123) // => "-123"

public func abs(x : Int8) : Int8

Returns the absolute value of x.

+

Traps when x == -2 ** 7 (the minimum Int8 value).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.abs(-123) // => +123

public func min(x : Int8, y : Int8) : Int8

Returns the minimum of x and y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.min(+2, -3) // => -3

public func max(x : Int8, y : Int8) : Int8

Returns the maximum of x and y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.max(+2, -3) // => +2

public func equal(x : Int8, y : Int8) : Bool

Returns x == y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.equal(123, 123) // => true

public func notEqual(x : Int8, y : Int8) : Bool

Returns x != y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.notEqual(123, 123) // => false

public func less(x : Int8, y : Int8) : Bool

Returns x < y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.less(123, 124) // => true

public func lessOrEqual(x : Int8, y : Int8) : Bool

Returns x <= y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.lessOrEqual(123, 124) // => true

public func greater(x : Int8, y : Int8) : Bool

Returns x > y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.greater(124, 123) // => true

public func greaterOrEqual(x : Int8, y : Int8) : Bool

Returns x >= y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.greaterOrEqual(124, 123) // => true

public func compare(x : Int8, y : Int8) : {#less; #equal; #greater}

Returns the order of x and y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.compare(123, 124) // => #less

public func neg(x : Int8) : Int8

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 7).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.neg(123) // => -123

public func add(x : Int8, y : Int8) : Int8

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.add(100, 23) // => +123

public func sub(x : Int8, y : Int8) : Int8

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.sub(123, 23) // => +100

public func mul(x : Int8, y : Int8) : Int8

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.mul(12, 10) // => +120

public func div(x : Int8, y : Int8) : Int8

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.div(123, 10) // => +12

public func rem(x : Int8, y : Int8) : Int8

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.rem(123, 10) // => +3

public func pow(x : Int8, y : Int8) : Int8

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 8.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.pow(2, 6) // => +64

public func bitnot(x : Int8) : Int8

Returns the bitwise negation of x, ^x.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitnot(-16 /* 0xf0 */) // => +15 // 0x0f

public func bitand(x : Int8, y : Int8) : Int8

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitand(0x1f, 0x70) // => +16 // 0x10

public func bitor(x : Int8, y : Int8) : Int8

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitor(0x0f, 0x70) // => +127 // 0x7f

public func bitxor(x : Int8, y : Int8) : Int8

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitxor(0x70, 0x7f) // => +15 // 0x0f

public func bitshiftLeft(x : Int8, y : Int8) : Int8

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 8, the semantics is the same as for bitshiftLeft(x, y % 8). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitshiftLeft(1, 4) // => +16 // 0x10 equivalent to `2 ** 4`.

public func bitshiftRight(x : Int8, y : Int8) : Int8

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 8, the semantics is the same as for bitshiftRight(x, y % 8). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitshiftRight(64, 4) // => +4 // equivalent to `64 / (2 ** 4)`

public func bitrotLeft(x : Int8, y : Int8) : Int8

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 8, the semantics is the same as for bitrotLeft(x, y % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitrotLeft(0x11 /* 0b0001_0001 */, 2) // => +68 // 0b0100_0100 == 0x44.

public func bitrotRight(x : Int8, y : Int8) : Int8

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 8, the semantics is the same as for bitrotRight(x, y % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitrotRight(0x11 /* 0b0001_0001 */, 1) // => -120 // 0b1000_1000 == 0x88.

public func bittest(x : Int8, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 8, the semantics is the same as for bittest(x, p % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bittest(64, 6) // => true

public func bitset(x : Int8, p : Nat) : Int8

Returns the value of setting bit p in x to 1. +If p >= 8, the semantics is the same as for bitset(x, p % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitset(0, 6) // => +64

public func bitclear(x : Int8, p : Nat) : Int8

Returns the value of clearing bit p in x to 0. +If p >= 8, the semantics is the same as for bitclear(x, p % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitclear(-1, 6) // => -65

public func bitflip(x : Int8, p : Nat) : Int8

Returns the value of flipping bit p in x. +If p >= 8, the semantics is the same as for bitclear(x, p % 8).

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitflip(127, 6) // => +63

public let bitcountNonZero : (x : Int8) -> Int8

Returns the count of non-zero bits in x.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitcountNonZero(0x0f) // => +4

public let bitcountLeadingZero : (x : Int8) -> Int8

Returns the count of leading zero bits in x.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitcountLeadingZero(0x08) // => +4

public let bitcountTrailingZero : (x : Int8) -> Int8

Returns the count of trailing zero bits in x.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.bitcountTrailingZero(0x10) // => +4

public func addWrap(x : Int8, y : Int8) : Int8

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.addWrap(2 ** 6, 2 ** 6) // => -128 // overflow

public func subWrap(x : Int8, y : Int8) : Int8

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.subWrap(-2 ** 7, 1) // => +127 // underflow

public func mulWrap(x : Int8, y : Int8) : Int8

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.mulWrap(2 ** 4, 2 ** 4) // => 0 // overflow

public func powWrap(x : Int8, y : Int8) : Int8

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 8.

+

Example:

+
import Int8 "mo:base/Int8";
+
+Int8.powWrap(2, 7) // => -128 // overflow

\ No newline at end of file diff --git a/base-doc/Iter.html b/base-doc/Iter.html new file mode 100644 index 00000000000..02b40841f3f --- /dev/null +++ b/base-doc/Iter.html @@ -0,0 +1,66 @@ + +

Iter

Iterators

+

type Iter<T> = { next : () -> ?T }

An iterator that produces values of type T. Calling next returns +null when iteration is finished.

+

Iterators are inherently stateful. Calling next "consumes" a value from +the Iterator that cannot be put back, so keep that in mind when sharing +iterators between consumers.

+

An iterater i can be iterated over using

+
for (x in i) {
+  …do something with x…
+}

class range(x : Nat, y : Int)

public func next() : ?Nat

Creates an iterator that produces all Nats from x to y including +both of the bounds.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());

class revRange(x : Int, y : Int)

public func next() : ?Int

Like range but produces the values in the opposite +order.

+

public func iterate<A>(xs : Iter<A>, f : (A, Nat) -> ())

Calls a function f on every value produced by an iterator and discards +the results. If you're looking to keep these results use map instead.

+
import Iter "mo:base/Iter";
+var sum = 0;
+Iter.iterate<Nat>(Iter.range(1, 3), func(x, _index) {
+  sum += x;
+});
+assert(6 == sum)

public func size<A>(xs : Iter<A>) : Nat

Consumes an iterator and counts how many elements were produced +(discarding them in the process).

+

public func map<A, B>(xs : Iter<A>, f : A -> B) : Iter<B>

Takes a function and an iterator and returns a new iterator that lazily applies +the function to every element produced by the argument iterator.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.map(iter, func (x : Nat) : Nat { x * 2 });
+assert(?2 == mappedIter.next());
+assert(?4 == mappedIter.next());
+assert(?6 == mappedIter.next());
+assert(null == mappedIter.next());

public func filter<A>(xs : Iter<A>, f : A -> Bool) : Iter<A>

Takes a function and an iterator and returns a new iterator that produces +elements from the original iterator if and only if the predicate is true.

+
import Iter "o:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.filter(iter, func (x : Nat) : Bool { x % 2 == 1 });
+assert(?1 == mappedIter.next());
+assert(?3 == mappedIter.next());
+assert(null == mappedIter.next());

public func make<A>(x : A) : Iter<A>

Creates an iterator that produces an infinite sequence of x.

+
import Iter "mo:base/Iter";
+let iter = Iter.make(10);
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+// ...

public func fromArray<A>(xs : [A]) : Iter<A>

Creates an iterator that produces the elements of an Array in ascending index order.

+
import Iter "mo:base/Iter";
+let iter = Iter.fromArray([1, 2, 3]);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());

public func fromArrayMut<A>(xs : [var A]) : Iter<A>

Like fromArray but for Arrays with mutable elements. Captures +the elements of the Array at the time the iterator is created, so +further modifications won't be reflected in the iterator.

+

public let fromList :

Like fromArray but for Lists.

+

public func toArray<A>(xs : Iter<A>) : [A]

Consumes an iterator and collects its produced elements in an Array.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert([1, 2, 3] == Iter.toArray(iter));

public func toArrayMut<A>(xs : Iter<A>) : [var A]

Like toArray but for Arrays with mutable elements.

+

public func toList<A>(xs : Iter<A>) : List.List<A>

Like toArray but for Lists.

+

public func sort<A>(xs : Iter<A>, compare : (A, A) -> Order.Order) : Iter<A>

Sorted iterator. Will iterate over all elements to sort them, necessarily.

+

\ No newline at end of file diff --git a/base-doc/IterType.html b/base-doc/IterType.html new file mode 100644 index 00000000000..bc54574689c --- /dev/null +++ b/base-doc/IterType.html @@ -0,0 +1,3 @@ + +

IterType

The Iterator type

+

type Iter<T> = { next : () -> ?T }

\ No newline at end of file diff --git a/base-doc/List.html b/base-doc/List.html new file mode 100644 index 00000000000..835206ddf49 --- /dev/null +++ b/base-doc/List.html @@ -0,0 +1,429 @@ + +

List

Purely-functional, singly-linked lists. +A list of type List<T> is either null or an optional pair of a value of type T and a tail, itself of type List<T>.

+

To use this library, import it using:

+
motoko name=initialize
+import List "mo:base/List";

type List<T> = ?(T, List<T>)

public func nil<T>() : List<T>

Create an empty list.

+

Example:

+
motoko include=initialize
+List.nil<Nat>() // => null
+ +

Runtime: O(1)

+

Space: O(1)

+

public func isNil<T>(l : List<T>) : Bool

Check whether a list is empty and return true if the list is empty.

+

Example:

+
motoko include=initialize
+List.isNil<Nat>(null) // => true
+ +

Runtime: O(1)

+

Space: O(1)

+

public func push<T>(x : T, l : List<T>) : List<T>

Add x to the head of list, and return the new list.

+

Example:

+
motoko include=initialize
+List.push<Nat>(0, null) // => ?(0, null);
+ +

Runtime: O(1)

+

Space: O(1)

+

public func last<T>(l : List<T>) : ?T

Return the last element of the list, if present. +Example:

+
motoko include=initialize
+List.last<Nat>(?(0, ?(1, null))) // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

public func pop<T>(l : List<T>) : (?T, List<T>)

Remove the head of the list, returning the optioned head and the tail of the list in a pair. +Returns (null, null) if the list is empty.

+

Example:

+
motoko include=initialize
+List.pop<Nat>(?(0, ?(1, null))) // => (?0, ?(1, null))
+ +

Runtime: O(1)

+

Space: O(1)

+

public func size<T>(l : List<T>) : Nat

Return the length of the list.

+

Example:

+
motoko include=initialize
+List.size<Nat>(?(0, ?(1, null))) // => 2
+ +

Runtime: O(size)

+

Space: O(1)

+

public func get<T>(l : List<T>, n : Nat) : ?T

Access any item in a list, zero-based.

+

NOTE: Indexing into a list is a linear operation, and usually an +indication that a list might not be the best data structure +to use.

+

Example:

+
motoko include=initialize
+List.get<Nat>(?(0, ?(1, null)), 1) // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

public func reverse<T>(l : List<T>) : List<T>

Reverses the list.

+

Example:

+
motoko include=initialize
+List.reverse<Nat>(?(0, ?(1, ?(2, null)))) // => ?(2, ?(1, ?(0, null)))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func iterate<T>(l : List<T>, f : T -> ())

Call the given function for its side effect, with each list element in turn.

+

Example:

+
motoko include=initialize
+var sum = 0;
+List.iterate<Nat>(?(0, ?(1, ?(2, null))), func n { sum += n });
+sum // => 3
+ +

Runtime: O(size)

+

Space: O(1)

+

public func map<T, U>(l : List<T>, f : T -> U) : List<U>

Call the given function f on each list element and collect the results +in a new list.

+

Example:

+
motoko include=initialize
+import Nat = "mo:base/Nat"
+List.map<Nat, Text>(?(0, ?(1, ?(2, null))), Nat.toText) // => ?("0", ?("1", ?("2", null))
+ +

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that f runs in O(1) time and space.

+

public func filter<T>(l : List<T>, f : T -> Bool) : List<T>

Create a new list with only those elements of the original list for which +the given function (often called the predicate) returns true.

+

Example:

+
motoko include=initialize
+List.filter<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => ?(0, ?(2, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func partition<T>(l : List<T>, f : T -> Bool) : (List<T>, List<T>)

Create two new lists from the results of a given function (f). +The first list only includes the elements for which the given +function f returns true and the second list only includes +the elements for which the function returns false.

+

Example:

+
motoko include=initialize
+List.partition<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => (?(0, ?(2, null)), ?(1, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func mapFilter<T, U>(l : List<T>, f : T -> ?U) : List<U>

Call the given function on each list element, and collect the non-null results +in a new list.

+

Example:

+
motoko include=initialize
+List.mapFilter<Nat, Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 1) {
+      ?(n * 2);
+    } else {
+      null
+    }
+  }
+) // => ?(4, ?(6, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func mapResult<T, R, E>(xs : List<T>, f : T -> Result.Result<R, E>) : Result.Result<List<R>, E>

Maps a Result-returning function f over a List and returns either +the first error or a list of successful values.

+

Example:

+
motoko include=initialize
+List.mapResult<Nat, Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 0) {
+      #ok(n * 2);
+    } else {
+      #err("Some element is zero")
+    }
+  }
+); // => #ok ?(2, ?(4, ?(6, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func append<T>(l : List<T>, m : List<T>) : List<T>

Append the elements from one list to another list.

+

Example:

+
motoko include=initialize
+List.append<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  ?(3, ?(4, ?(5, null)))
+) // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+ +

Runtime: O(size(l))

+

Space: O(size(l))

+

public func flatten<T>(l : List<List<T>>) : List<T>

Flatten, or concatenate, a list of lists as a list.

+

Example:

+
motoko include=initialize
+List.flatten<Nat>(
+  ?(?(0, ?(1, ?(2, null))),
+    ?(?(3, ?(4, ?(5, null))),
+      null))
+); // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+ +

Runtime: O(size*size)

+

Space: O(size*size)

+

public func take<T>(l : List<T>, n : Nat) : List<T>

Returns the first n elements of the given list. +If the given list has fewer than n elements, this function returns +a copy of the full input list.

+

Example:

+
motoko include=initialize
+List.take<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(0, ?(1, null))
+ +

Runtime: O(n)

+

Space: O(n)

+

public func drop<T>(l : List<T>, n : Nat) : List<T>

Drop the first n elements from the given list.

+

Example:

+
motoko include=initialize
+List.drop<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(2, null)
+ +

Runtime: O(n)

+

Space: O(1)

+

public func foldLeft<T, S>(
  list : List<T>,
  base : S,
  combine : (S, T) -> S
) : S

Collapses the elements in list into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.foldLeft<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (acc, x) { acc # Nat.toText(x)}
+) // => "123"
+ +

Runtime: O(size(list))

+

Space: O(1) heap, O(1) stack

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<T, S>(
  list : List<T>,
  base : S,
  combine : (T, S) -> S
) : S

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.foldRight<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (x, acc) { Nat.toText(x) # acc}
+) // => "123"
+ +

Runtime: O(size(list))

+

Space: O(1) heap, O(size(list)) stack

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func find<T>(l : List<T>, f : T -> Bool) : ?T

Return the first element for which the given predicate f is true, +if such an element exists.

+

Example:

+
motoko include=initialize
+
+List.find<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => ?2
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func some<T>(l : List<T>, f : T -> Bool) : Bool

Return true if there exists a list element for which +the given predicate f is true.

+

Example:

+
motoko include=initialize
+
+List.some<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+) // => true
+ +

Runtime: O(size(list))

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func all<T>(l : List<T>, f : T -> Bool) : Bool

Return true if the given predicate f is true for all list +elements.

+

Example:

+
motoko include=initialize
+
+List.all<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => false
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func merge<T>(
  l1 : List<T>,
  l2 : List<T>,
  lessThanOrEqual : (T, T) -> Bool
) : List<T>

Merge two ordered lists into a single ordered list. +This function requires both list to be ordered as specified +by the given relation lessThanOrEqual.

+

Example:

+
motoko include=initialize
+
+List.merge<Nat>(
+  ?(1, ?(2, ?(4, null))),
+  ?(2, ?(4, ?(6, null))),
+  func (n1, n2) { n1 <= n2 }
+); // => ?(1, ?(2, ?(2, ?(4, ?(4, ?(6, null))))))),
+ +

Runtime: O(size(l1) + size(l2))

+

Space: O(size(l1) + size(l2))

+

*Runtime and space assumes that lessThanOrEqual runs in O(1) time and space.

+

public func compare<T>(
  l1 : List<T>,
  l2 : List<T>,
  compare : (T, T) -> Order.Order
) : Order.Order

Compare two lists using lexicographic ordering specified by argument function compare.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.compare<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.compare
+) // => #less
+ +

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument compare runs in O(1) time and space.

+

public func equal<T>(
  l1 : List<T>,
  l2 : List<T>,
  equal : (T, T) -> Bool
) : Bool

Compare two lists for equality using the argument function equal to determine equality of their elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.equal<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.equal
+); // => false
+ +

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument equal runs in O(1) time and space.

+

public func tabulate<T>(n : Nat, f : Nat -> T) : List<T>

Generate a list based on a length and a function that maps from +a list index to a list element.

+

Example:

+
motoko include=initialize
+List.tabulate<Nat>(
+  3,
+  func n { n * 2 }
+) // => ?(0, ?(2, (?4, null)))
+ +

Runtime: O(n)

+

Space: O(n)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func make<T>(x : T) : List<T>

Create a list with exactly one element.

+

Example:

+
motoko include=initialize
+List.make<Nat>(
+  0
+) // => ?(0, null)
+ +

Runtime: O(1)

+

Space: O(1)

+

public func replicate<T>(n : Nat, x : T) : List<T>

Create a list of the given length with the same value in each position.

+

Example:

+
motoko include=initialize
+List.replicate<Nat>(
+  3,
+  0
+) // => ?(0, ?(0, ?(0, null)))
+ +

Runtime: O(n)

+

Space: O(n)

+

public func zip<T, U>(xs : List<T>, ys : List<U>) : List<(T, U)>

Create a list of pairs from a pair of lists.

+

If the given lists have different lengths, then the created list will have a +length equal to the length of the smaller list.

+

Example:

+
motoko include=initialize
+List.zip<Nat, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?("0", ?("1", null)),
+) // => ?((0, "0"), ?((1, "1"), null))
+ +

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

public func zipWith<T, U, V>(
  xs : List<T>,
  ys : List<U>,
  f : (T, U) -> V
) : List<V>

Create a list in which elements are created by applying function f to each pair (x, y) of elements +occuring at the same position in list xs and list ys.

+

If the given lists have different lengths, then the created list will have a +length equal to the length of the smaller list.

+

Example:

+
motoko include=initialize
+import Nat = "mo:base/Nat";
+import Char = "mo:base/Char";
+
+List.zipWith<Nat, Char, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?('a', ?('b', null)),
+  func (n, c) { Nat.toText(n) # Char.toText(c) }
+) // => ?("0a", ?("1b", null))
+ +

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

*Runtime and space assumes that zip runs in O(1) time and space.

+

public func split<T>(n : Nat, xs : List<T>) : (List<T>, List<T>)

Split the given list at the given zero-based index.

+

Example:

+
motoko include=initialize
+List.split<Nat>(
+  2,
+  ?(0, ?(1, ?(2, null)))
+) // => (?(0, ?(1, null)), ?(2, null))
+ +

Runtime: O(n)

+

Space: O(n)

+

*Runtime and space assumes that zip runs in O(1) time and space.

+

public func chunks<T>(n : Nat, xs : List<T>) : List<List<T>>

Split the given list into chunks of length n. +The last chunk will be shorter if the length of the given list +does not divide by n evenly.

+

Example:

+
motoko include=initialize
+List.chunks<Nat>(
+  2,
+  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+)
+/* => ?(?(0, ?(1, null)),
+        ?(?(2, ?(3, null)),
+          ?(?(4, null),
+            null)))
+*/
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that zip runs in O(1) time and space.

+

public func fromArray<T>(xs : [T]) : List<T>

Convert an array into a list.

+

Example:

+
motoko include=initialize
+List.fromArray<Nat>([ 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromVarArray<T>(xs : [var T]) : List<T>

Convert a mutable array into a list.

+

Example:

+
motoko include=initialize
+List.fromVarArray<Nat>([var 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toArray<T>(xs : List<T>) : [T]

Create an array from a list. +Example:

+
motoko include=initialize
+List.toArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [0, 1, 2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toVarArray<T>(xs : List<T>) : [var T]

Create a mutable array from a list. +Example:

+
motoko include=initialize
+List.toVarArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [var 0, 1, 2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toIter<T>(xs : List<T>) : Iter.Iter<T>

Create an iterator from a list. +Example:

+
motoko include=initialize
+var sum = 0;
+for (n in List.toIter<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))) {
+  sum += n;
+};
+sum
+// => 10
+ +

Runtime: O(1)

+

Space: O(1)

+

\ No newline at end of file diff --git a/base-doc/Nat.html b/base-doc/Nat.html new file mode 100644 index 00000000000..079de030794 --- /dev/null +++ b/base-doc/Nat.html @@ -0,0 +1,183 @@ + +

Nat

Natural numbers with infinite precision.

+

Most operations on natural numbers (e.g. addition) are available as built-in operators (e.g. 1 + 1). +This module provides equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
motoko name=import
+import Nat "mo:base/Nat";

type Nat = Prim.Types.Nat

Infinite precision natural numbers.

+

public func toText(n : Nat) : Text

Converts a natural number to its textual representation. Textual +representation do not contain underscores to represent commas.

+

Example:

+
motoko include=import
+Nat.toText 1234 // => "1234"

public func fromText(text : Text) : ?Nat

Creates a natural number from its textual representation. Returns null +if the input is not a valid natural number.

+

Note: The textual representation must not contain underscores.

+

Example:

+
motoko include=import
+Nat.fromText "1234" // => ?1234

public func min(x : Nat, y : Nat) : Nat

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat.min(1, 2) // => 1

public func max(x : Nat, y : Nat) : Nat

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat.max(1, 2) // => 2

public func equal(x : Nat, y : Nat) : Bool

Equality function for Nat types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat.equal(1, 1); // => true
+1 == 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat>(3);
+let buffer2 = Buffer.Buffer<Nat>(3);
+Buffer.equal(buffer1, buffer2, Nat.equal) // => true

public func notEqual(x : Nat, y : Nat) : Bool

Inequality function for Nat types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat.notEqual(1, 2); // => true
+1 != 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat, y : Nat) : Bool

"Less than" function for Nat types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat.less(1, 2); // => true
+1 < 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat, y : Nat) : Bool

"Less than or equal" function for Nat types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat.lessOrEqual(1, 2); // => true
+1 <= 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat, y : Nat) : Bool

"Greater than" function for Nat types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat.greater(2, 1); // => true
+2 > 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat, y : Nat) : Bool

"Greater than or equal" function for Nat types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat.greaterOrEqual(2, 1); // => true
+2 >= 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat, y : Nat) : {#less; #equal; #greater}

General purpose comparison function for Nat. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1], Nat.compare) // => [1, 2, 3]

public func add(x : Nat, y : Nat) : Nat

Returns the sum of x and y, x + y. This operator will never overflow +because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.add(1, 2); // => 3
+1 + 2 // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 0, Nat.add) // => 6

public func sub(x : Nat, y : Nat) : Nat

Returns the difference of x and y, x - y. +Traps on underflow below 0.

+

Example:

+
motoko include=import
+ignore Nat.sub(2, 1); // => 1
+// Add a type annotation to avoid a warning about the subtraction
+2 - 1 : Nat // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 10, Nat.sub) // => 4

public func mul(x : Nat, y : Nat) : Nat

Returns the product of x and y, x * y. This operator will never +overflow because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.mul(2, 3); // => 6
+2 * 3 // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 1, Nat.mul) // => 6

public func div(x : Nat, y : Nat) : Nat

Returns the unsigned integer division of x by y, x / y. +Traps when y is zero.

+

The quotient is rounded down, which is equivalent to truncating the +decimal places of the quotient.

+

Example:

+
motoko include=import
+ignore Nat.div(6, 2); // => 3
+6 / 2 // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat, y : Nat) : Nat

Returns the remainder of unsigned integer division of x by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat.rem(6, 4); // => 2
+6 % 4 // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat, y : Nat) : Nat

Returns x to the power of y, x ** y. Traps when y > 2^32. This operator +will never overflow because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.pow(2, 3); // => 8
+2 ** 3 // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Nat16.html b/base-doc/Nat16.html new file mode 100644 index 00000000000..a1eb915af8b --- /dev/null +++ b/base-doc/Nat16.html @@ -0,0 +1,45 @@ + +

Nat16

16-bit unsigned integers with checked arithmetic

+

Most operations are available as built-in operators (e.g. 1 + 1).

+

type Nat16 = Prim.Types.Nat16

16-bit natural numbers.

+

public let toNat : Nat16 -> Nat

Conversion.

+

public let fromNat : Nat -> Nat16

Conversion. Traps on overflow/underflow.

+

public let fromIntWrap : Int -> Nat16

Conversion. Wraps on overflow/underflow.

+

public func toText(x : Nat16) : Text

Returns the Text representation of x.

+

public func min(x : Nat16, y : Nat16) : Nat16

Returns the minimum of x and y.

+

public func max(x : Nat16, y : Nat16) : Nat16

Returns the maximum of x and y.

+

public func equal(x : Nat16, y : Nat16) : Bool

Returns x == y.

+

public func notEqual(x : Nat16, y : Nat16) : Bool

Returns x != y.

+

public func less(x : Nat16, y : Nat16) : Bool

Returns x < y.

+

public func lessOrEqual(x : Nat16, y : Nat16) : Bool

Returns x <= y.

+

public func greater(x : Nat16, y : Nat16) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Nat16, y : Nat16) : Bool

Returns x >= y.

+

public func compare(x : Nat16, y : Nat16) : {#less; #equal; #greater}

Returns the order of x and y.

+

public func add(x : Nat16, y : Nat16) : Nat16

Returns the sum of x and y, x + y. Traps on overflow.

+

public func sub(x : Nat16, y : Nat16) : Nat16

Returns the difference of x and y, x - y. Traps on underflow.

+

public func mul(x : Nat16, y : Nat16) : Nat16

Returns the product of x and y, x * y. Traps on overflow.

+

public func div(x : Nat16, y : Nat16) : Nat16

Returns the division of x by y, x / y. +Traps when y is zero.

+

public func rem(x : Nat16, y : Nat16) : Nat16

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

public func pow(x : Nat16, y : Nat16) : Nat16

Returns x to the power of y, x ** y. Traps on overflow.

+

public func bitnot(x : Nat16) : Nat16

Returns the bitwise negation of x, ^x.

+

public func bitand(x : Nat16, y : Nat16) : Nat16

Returns the bitwise and of x and y, x & y.

+

public func bitor(x : Nat16, y : Nat16) : Nat16

Returns the bitwise or of x and y, x \| y.

+

public func bitxor(x : Nat16, y : Nat16) : Nat16

Returns the bitwise exclusive or of x and y, x ^ y.

+

public func bitshiftLeft(x : Nat16, y : Nat16) : Nat16

Returns the bitwise shift left of x by y, x << y.

+

public func bitshiftRight(x : Nat16, y : Nat16) : Nat16

Returns the bitwise shift right of x by y, x >> y.

+

public func bitrotLeft(x : Nat16, y : Nat16) : Nat16

Returns the bitwise rotate left of x by y, x <<> y.

+

public func bitrotRight(x : Nat16, y : Nat16) : Nat16

Returns the bitwise rotate right of x by y, x <>> y.

+

public func bittest(x : Nat16, p : Nat) : Bool

Returns the value of bit p mod 16 in x, (x & 2^(p mod 16)) == 2^(p mod 16).

+

public func bitset(x : Nat16, p : Nat) : Nat16

Returns the value of setting bit p mod 16 in x to 1.

+

public func bitclear(x : Nat16, p : Nat) : Nat16

Returns the value of clearing bit p mod 16 in x to 0.

+

public func bitflip(x : Nat16, p : Nat) : Nat16

Returns the value of flipping bit p mod 16 in x.

+

public let bitcountNonZero : (x : Nat16) -> Nat16

Returns the count of non-zero bits in x.

+

public let bitcountLeadingZero : (x : Nat16) -> Nat16

Returns the count of leading zero bits in x.

+

public let bitcountTrailingZero : (x : Nat16) -> Nat16

Returns the count of trailing zero bits in x.

+

public func addWrap(x : Nat16, y : Nat16) : Nat16

Returns the sum of x and y, x +% y. Wraps on overflow.

+

public func subWrap(x : Nat16, y : Nat16) : Nat16

Returns the difference of x and y, x -% y. Wraps on underflow.

+

public func mulWrap(x : Nat16, y : Nat16) : Nat16

Returns the product of x and y, x *% y. Wraps on overflow.

+

public func powWrap(x : Nat16, y : Nat16) : Nat16

Returns x to the power of y, x **% y. Wraps on overflow.

+

\ No newline at end of file diff --git a/base-doc/Nat32.html b/base-doc/Nat32.html new file mode 100644 index 00000000000..22b71edceb9 --- /dev/null +++ b/base-doc/Nat32.html @@ -0,0 +1,45 @@ + +

Nat32

32-bit unsigned integers with checked arithmetic

+

Most operations are available as built-in operators (e.g. 1 + 1).

+

type Nat32 = Prim.Types.Nat32

32-bit natural numbers.

+

public let toNat : Nat32 -> Nat

Conversion.

+

public let fromNat : Nat -> Nat32

Conversion. Traps on overflow/underflow.

+

public let fromIntWrap : Int -> Nat32

Conversion. Wraps on overflow/underflow.

+

public func toText(x : Nat32) : Text

Returns the Text representation of x.

+

public func min(x : Nat32, y : Nat32) : Nat32

Returns the minimum of x and y.

+

public func max(x : Nat32, y : Nat32) : Nat32

Returns the maximum of x and y.

+

public func equal(x : Nat32, y : Nat32) : Bool

Returns x == y.

+

public func notEqual(x : Nat32, y : Nat32) : Bool

Returns x != y.

+

public func less(x : Nat32, y : Nat32) : Bool

Returns x < y.

+

public func lessOrEqual(x : Nat32, y : Nat32) : Bool

Returns x <= y.

+

public func greater(x : Nat32, y : Nat32) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Nat32, y : Nat32) : Bool

Returns x >= y.

+

public func compare(x : Nat32, y : Nat32) : {#less; #equal; #greater}

Returns the order of x and y.

+

public func add(x : Nat32, y : Nat32) : Nat32

Returns the sum of x and y, x + y. Traps on overflow.

+

public func sub(x : Nat32, y : Nat32) : Nat32

Returns the difference of x and y, x - y. Traps on underflow.

+

public func mul(x : Nat32, y : Nat32) : Nat32

Returns the product of x and y, x * y. Traps on overflow.

+

public func div(x : Nat32, y : Nat32) : Nat32

Returns the division of x by y, x / y. +Traps when y is zero.

+

public func rem(x : Nat32, y : Nat32) : Nat32

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

public func pow(x : Nat32, y : Nat32) : Nat32

Returns x to the power of y, x ** y. Traps on overflow.

+

public func bitnot(x : Nat32) : Nat32

Returns the bitwise negation of x, ^x.

+

public func bitand(x : Nat32, y : Nat32) : Nat32

Returns the bitwise and of x and y, x & y.

+

public func bitor(x : Nat32, y : Nat32) : Nat32

Returns the bitwise or of x and y, x \| y.

+

public func bitxor(x : Nat32, y : Nat32) : Nat32

Returns the bitwise exclusive or of x and y, x ^ y.

+

public func bitshiftLeft(x : Nat32, y : Nat32) : Nat32

Returns the bitwise shift left of x by y, x << y.

+

public func bitshiftRight(x : Nat32, y : Nat32) : Nat32

Returns the bitwise shift right of x by y, x >> y.

+

public func bitrotLeft(x : Nat32, y : Nat32) : Nat32

Returns the bitwise rotate left of x by y, x <<> y.

+

public func bitrotRight(x : Nat32, y : Nat32) : Nat32

Returns the bitwise rotate right of x by y, x <>> y.

+

public func bittest(x : Nat32, p : Nat) : Bool

Returns the value of bit p mod 32 in x, (x & 2^(p mod 32)) == 2^(p mod 32).

+

public func bitset(x : Nat32, p : Nat) : Nat32

Returns the value of setting bit p mod 32 in x to 1.

+

public func bitclear(x : Nat32, p : Nat) : Nat32

Returns the value of clearing bit p mod 32 in x to 0.

+

public func bitflip(x : Nat32, p : Nat) : Nat32

Returns the value of flipping bit p mod 32 in x.

+

public let bitcountNonZero : (x : Nat32) -> Nat32

Returns the count of non-zero bits in x.

+

public let bitcountLeadingZero : (x : Nat32) -> Nat32

Returns the count of leading zero bits in x.

+

public let bitcountTrailingZero : (x : Nat32) -> Nat32

Returns the count of trailing zero bits in x.

+

public func addWrap(x : Nat32, y : Nat32) : Nat32

Returns the sum of x and y, x +% y. Wraps on overflow.

+

public func subWrap(x : Nat32, y : Nat32) : Nat32

Returns the difference of x and y, x -% y. Wraps on underflow.

+

public func mulWrap(x : Nat32, y : Nat32) : Nat32

Returns the product of x and y, x *% y. Wraps on overflow.

+

public func powWrap(x : Nat32, y : Nat32) : Nat32

Returns x to the power of y, x **% y. Wraps on overflow.

+

\ No newline at end of file diff --git a/base-doc/Nat64.html b/base-doc/Nat64.html new file mode 100644 index 00000000000..39908ae9c03 --- /dev/null +++ b/base-doc/Nat64.html @@ -0,0 +1,45 @@ + +

Nat64

64-bit unsigned integers with checked arithmetic

+

Most operations are available as built-in operators (e.g. 1 + 1).

+

type Nat64 = Prim.Types.Nat64

64-bit natural numbers.

+

public let toNat : Nat64 -> Nat

Conversion.

+

public let fromNat : Nat -> Nat64

Conversion. Traps on overflow/underflow.

+

public let fromIntWrap : Int -> Nat64

Conversion. Wraps on overflow/underflow.

+

public func toText(x : Nat64) : Text

Returns the Text representation of x.

+

public func min(x : Nat64, y : Nat64) : Nat64

Returns the minimum of x and y.

+

public func max(x : Nat64, y : Nat64) : Nat64

Returns the maximum of x and y.

+

public func equal(x : Nat64, y : Nat64) : Bool

Returns x == y.

+

public func notEqual(x : Nat64, y : Nat64) : Bool

Returns x != y.

+

public func less(x : Nat64, y : Nat64) : Bool

Returns x < y.

+

public func lessOrEqual(x : Nat64, y : Nat64) : Bool

Returns x <= y.

+

public func greater(x : Nat64, y : Nat64) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Nat64, y : Nat64) : Bool

Returns x >= y.

+

public func compare(x : Nat64, y : Nat64) : {#less; #equal; #greater}

Returns the order of x and y.

+

public func add(x : Nat64, y : Nat64) : Nat64

Returns the sum of x and y, x + y. Traps on overflow.

+

public func sub(x : Nat64, y : Nat64) : Nat64

Returns the difference of x and y, x - y. Traps on underflow.

+

public func mul(x : Nat64, y : Nat64) : Nat64

Returns the product of x and y, x * y. Traps on overflow.

+

public func div(x : Nat64, y : Nat64) : Nat64

Returns the division of x by y, x / y. +Traps when y is zero.

+

public func rem(x : Nat64, y : Nat64) : Nat64

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

public func pow(x : Nat64, y : Nat64) : Nat64

Returns x to the power of y, x ** y. Traps on overflow.

+

public func bitnot(x : Nat64) : Nat64

Returns the bitwise negation of x, ^x.

+

public func bitand(x : Nat64, y : Nat64) : Nat64

Returns the bitwise and of x and y, x & y.

+

public func bitor(x : Nat64, y : Nat64) : Nat64

Returns the bitwise or of x and y, x \| y.

+

public func bitxor(x : Nat64, y : Nat64) : Nat64

Returns the bitwise exclusive or of x and y, x ^ y.

+

public func bitshiftLeft(x : Nat64, y : Nat64) : Nat64

Returns the bitwise shift left of x by y, x << y.

+

public func bitshiftRight(x : Nat64, y : Nat64) : Nat64

Returns the bitwise shift right of x by y, x >> y.

+

public func bitrotLeft(x : Nat64, y : Nat64) : Nat64

Returns the bitwise rotate left of x by y, x <<> y.

+

public func bitrotRight(x : Nat64, y : Nat64) : Nat64

Returns the bitwise rotate right of x by y, x <>> y.

+

public func bittest(x : Nat64, p : Nat) : Bool

Returns the value of bit p mod 64 in x, (x & 2^(p mod 64)) == 2^(p mod 64).

+

public func bitset(x : Nat64, p : Nat) : Nat64

Returns the value of setting bit p mod 64 in x to 1.

+

public func bitclear(x : Nat64, p : Nat) : Nat64

Returns the value of clearing bit p mod 64 in x to 0.

+

public func bitflip(x : Nat64, p : Nat) : Nat64

Returns the value of flipping bit p mod 64 in x.

+

public let bitcountNonZero : (x : Nat64) -> Nat64

Returns the count of non-zero bits in x.

+

public let bitcountLeadingZero : (x : Nat64) -> Nat64

Returns the count of leading zero bits in x.

+

public let bitcountTrailingZero : (x : Nat64) -> Nat64

Returns the count of trailing zero bits in x.

+

public func addWrap(x : Nat64, y : Nat64) : Nat64

Returns the sum of x and y, x +% y. Wraps on overflow.

+

public func subWrap(x : Nat64, y : Nat64) : Nat64

Returns the difference of x and y, x -% y. Wraps on underflow.

+

public func mulWrap(x : Nat64, y : Nat64) : Nat64

Returns the product of x and y, x *% y. Wraps on overflow.

+

public func powWrap(x : Nat64, y : Nat64) : Nat64

Returns x to the power of y, x **% y. Wraps on overflow.

+

\ No newline at end of file diff --git a/base-doc/Nat8.html b/base-doc/Nat8.html new file mode 100644 index 00000000000..0d03664ed1c --- /dev/null +++ b/base-doc/Nat8.html @@ -0,0 +1,45 @@ + +

Nat8

8-bit unsigned integers with checked arithmetic

+

Most operations are available as built-in operators (e.g. 1 + 1).

+

type Nat8 = Prim.Types.Nat8

8-bit natural numbers.

+

public let toNat : Nat8 -> Nat

Conversion.

+

public let fromNat : Nat -> Nat8

Conversion. Traps on overflow/underflow.

+

public let fromIntWrap : Int -> Nat8

Conversion. Wraps on overflow/underflow.

+

public func toText(x : Nat8) : Text

Returns the Text representation of x.

+

public func min(x : Nat8, y : Nat8) : Nat8

Returns the minimum of x and y.

+

public func max(x : Nat8, y : Nat8) : Nat8

Returns the maximum of x and y.

+

public func equal(x : Nat8, y : Nat8) : Bool

Returns x == y.

+

public func notEqual(x : Nat8, y : Nat8) : Bool

Returns x != y.

+

public func less(x : Nat8, y : Nat8) : Bool

Returns x < y.

+

public func lessOrEqual(x : Nat8, y : Nat8) : Bool

Returns x <= y.

+

public func greater(x : Nat8, y : Nat8) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Nat8, y : Nat8) : Bool

Returns x >= y.

+

public func compare(x : Nat8, y : Nat8) : {#less; #equal; #greater}

Returns the order of x and y.

+

public func add(x : Nat8, y : Nat8) : Nat8

Returns the sum of x and y, x + y. Traps on overflow.

+

public func sub(x : Nat8, y : Nat8) : Nat8

Returns the difference of x and y, x - y. Traps on underflow.

+

public func mul(x : Nat8, y : Nat8) : Nat8

Returns the product of x and y, x * y. Traps on overflow.

+

public func div(x : Nat8, y : Nat8) : Nat8

Returns the division of x by y, x / y. +Traps when y is zero.

+

public func rem(x : Nat8, y : Nat8) : Nat8

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

public func pow(x : Nat8, y : Nat8) : Nat8

Returns x to the power of y, x ** y. Traps on overflow.

+

public func bitnot(x : Nat8) : Nat8

Returns the bitwise negation of x, ^x.

+

public func bitand(x : Nat8, y : Nat8) : Nat8

Returns the bitwise and of x and y, x & y.

+

public func bitor(x : Nat8, y : Nat8) : Nat8

Returns the bitwise or of x and y, x \| y.

+

public func bitxor(x : Nat8, y : Nat8) : Nat8

Returns the bitwise exclusive or of x and y, x ^ y.

+

public func bitshiftLeft(x : Nat8, y : Nat8) : Nat8

Returns the bitwise shift left of x by y, x << y.

+

public func bitshiftRight(x : Nat8, y : Nat8) : Nat8

Returns the bitwise shift right of x by y, x >> y.

+

public func bitrotLeft(x : Nat8, y : Nat8) : Nat8

Returns the bitwise rotate left of x by y, x <<> y.

+

public func bitrotRight(x : Nat8, y : Nat8) : Nat8

Returns the bitwise rotate right of x by y, x <>> y.

+

public func bittest(x : Nat8, p : Nat) : Bool

Returns the value of bit p mod 8 in x, (x & 2^(p mod 8)) == 2^(p mod 8).

+

public func bitset(x : Nat8, p : Nat) : Nat8

Returns the value of setting bit p mod 8 in x to 1.

+

public func bitclear(x : Nat8, p : Nat) : Nat8

Returns the value of clearing bit p mod 8 in x to 0.

+

public func bitflip(x : Nat8, p : Nat) : Nat8

Returns the value of flipping bit p mod 8 in x.

+

public let bitcountNonZero : (x : Nat8) -> Nat8

Returns the count of non-zero bits in x.

+

public let bitcountLeadingZero : (x : Nat8) -> Nat8

Returns the count of leading zero bits in x.

+

public let bitcountTrailingZero : (x : Nat8) -> Nat8

Returns the count of trailing zero bits in x.

+

public func addWrap(x : Nat8, y : Nat8) : Nat8

Returns the sum of x and y, x +% y. Wraps on overflow.

+

public func subWrap(x : Nat8, y : Nat8) : Nat8

Returns the difference of x and y, x -% y. Wraps on underflow.

+

public func mulWrap(x : Nat8, y : Nat8) : Nat8

Returns the product of x and y, x *% y. Wraps on overflow.

+

public func powWrap(x : Nat8, y : Nat8) : Nat8

Returns x to the power of y, x **% y. Wraps on overflow.

+

\ No newline at end of file diff --git a/base-doc/None.html b/base-doc/None.html new file mode 100644 index 00000000000..99694e3c71c --- /dev/null +++ b/base-doc/None.html @@ -0,0 +1,8 @@ + +

None

The absent value

+

The None type represents a type with no value.

+

It is often used to type code that fails to return control (e.g. an infinite loop) +or to designate impossible values (e.g. the type ?None only contains null).

+

type None = Prim.Types.None

The empty type. A subtype of all types.

+

public let impossible : <A>None -> A

Turns an absurd value into an arbitrary type.

+

\ No newline at end of file diff --git a/base-doc/Option.html b/base-doc/Option.html new file mode 100644 index 00000000000..dbc3fd1c6e9 --- /dev/null +++ b/base-doc/Option.html @@ -0,0 +1,55 @@ + +

Option

Typesafe nulls

+

Optional values can be seen as a typesafe null. A value of type ?Int can +be constructed with either null or ?42. The simplest way to get at the +contents of an optional is to use pattern matching:

+
let optionalInt1 : ?Int = ?42;
+let optionalInt2 : ?Int = null;
+
+let int1orZero : Int = switch optionalInt1 {
+  case null 0;
+  case (?int) int;
+};
+assert int1orZero == 42;
+
+let int2orZero : Int = switch optionalInt2 {
+  case null 0;
+  case (?int) int;
+};
+assert int2orZero == 0;
+ +

The functions in this module capture some common operations when working +with optionals that can be more succinct than using pattern matching.

+

public func get<T>(x : ?T, default : T) : T

Unwraps an optional value, with a default value, i.e. get(?x, d) = x and +get(null, d) = d.

+

public func getMapped<A, B>(
  x : ?A,
  f : A -> B,
  default : B
) : B

Unwraps an optional value using a function, or returns the default, i.e. +option(?x, f, d) = f x and option(null, f, d) = d.

+

public func map<A, B>(x : ?A, f : A -> B) : ?B

Applies a function to the wrapped value. null's are left untouched.

+
import Option "mo:base/Option";
+assert Option.map<Nat, Nat>(?42, func x = x + 1) == ?43;
+assert Option.map<Nat, Nat>(null, func x = x + 1) == null;

public func iterate<A>(x : ?A, f : A -> ())

Applies a function to the wrapped value, but discards the result. Use +iterate if you're only interested in the side effect f produces.

+
import Option "mo:base/Option";
+var counter : Nat = 0;
+Option.iterate(?5, func (x : Nat) { counter += x });
+assert counter == 5;
+Option.iterate(null, func (x : Nat) { counter += x });
+assert counter == 5;

public func apply<A, B>(x : ?A, f : ?(A -> B)) : ?B

Applies an optional function to an optional value. Returns null if at +least one of the arguments is null.

+

public func chain<A, B>(x : ?A, f : A -> ?B) : ?B

Applies a function to an optional value. Returns null if the argument is +null, or the function returns null.

+

public func flatten<A>(x : ??A) : ?A

Given an optional optional value, removes one layer of optionality.

+
import Option "mo:base/Option";
+assert Option.flatten(?(?(42))) == ?42;
+assert Option.flatten(?(null)) == null;
+assert Option.flatten(null) == null;

public func make<A>(x : A) : ?A

Creates an optional value from a definite value.

+
import Option "mo:base/Option";
+assert Option.make(42) == ?42;

public func isSome(x : ?Any) : Bool

Returns true if the argument is not null, otherwise returns false.

+

public func isNull(x : ?Any) : Bool

Returns true if the argument is null, otherwise returns false.

+

public func assertSome(x : ?Any)

Asserts that the value is not null; fails otherwise. +@deprecated Option.assertSome will be removed soon; use an assert expression instead

+

public func assertNull(x : ?Any)

Asserts that the value is null; fails otherwise. +@deprecated Option.assertNull will be removed soon; use an assert expression instead

+

public func unwrap<T>(x : ?T) : T

Unwraps an optional value, i.e. unwrap(?x) = x.

+

@deprecated Option.unwrap is unsafe and fails if the argument is null; it will be removed soon; use a switch or do? expression instead

+

\ No newline at end of file diff --git a/base-doc/Order.html b/base-doc/Order.html new file mode 100644 index 00000000000..44404a27579 --- /dev/null +++ b/base-doc/Order.html @@ -0,0 +1,8 @@ + +

Order

Order

+

type Order = {#less; #equal; #greater}

A type to represent an order.

+

public func isLess(order : Order) : Bool

Check if an order is #less.

+

public func isEqual(order : Order) : Bool

Check if an order is #equal.

+

public func isGreater(order : Order) : Bool

Check if an order is #greater.

+

public func equal(o1 : Order, o2 : Order) : Bool

Returns true if only if o1 and o2 are the same ordering.

+

\ No newline at end of file diff --git a/base-doc/Prelude.html b/base-doc/Prelude.html new file mode 100644 index 00000000000..dfc32433383 --- /dev/null +++ b/base-doc/Prelude.html @@ -0,0 +1,13 @@ + +

Prelude

General utilities

+

This prelude file proposes standard library features that may +belong in the language (compiler-internal) prelude sometime, after +some further experience and discussion. Until then, they live here.

+

public func nyi() : None

Not yet implemented

+

Mark incomplete code with the nyi and xxx functions.

+

Each have calls are well-typed in all typing contexts, which +trap in all execution contexts.

+

public func xxx() : None

public func unreachable() : None

Mark unreachable code with the unreachable function.

+

Calls are well-typed in all typing contexts, and they +trap in all execution contexts.

+

\ No newline at end of file diff --git a/base-doc/Principal.html b/base-doc/Principal.html new file mode 100644 index 00000000000..15d8a40d16a --- /dev/null +++ b/base-doc/Principal.html @@ -0,0 +1,145 @@ + +

Principal

Module for interacting with Principals (users and canisters).

+

Principals are used to identify entities that can interact with the Internet +Computer. These entities are either users or canisters.

+

Example textual representation of Principals:

+

un4fu-tqaaa-aaaab-qadjq-cai

+

In Motoko, there is a primitive Principal type called Principal. As an example +of where you might see Principals, you can access the Principal of the +caller of your shared function.

+
motoko no-repl
+shared(msg) func foo() {
+  let caller : Principal = msg.caller;
+};
+ +

Then, you can use this module to work with the Principal.

+

Import from the base library to use this module.

+
motoko name=import
+import Principal "mo:base/Principal";

type Principal = Prim.Types.Principal

public func fromActor(a : actor { }) : Principal

Get the Principal identifier of an actor.

+

Example:

+
motoko include=import no-repl
+actor MyCanister {
+  func getPrincipal() : Principal {
+    let principal = Principal.fromActor(MyCanister);
+  }
+}

public func toBlob(p : Principal) : Blob

Convert a Principal to its Blob (bytes) representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let blob = Principal.toBlob(principal); // => \00\00\00\00\00\30\00\D3\01\01

public func fromBlob(b : Blob) : Principal

Converts a Blob (bytes) representation of a Principal to a Principal value.

+

Example:

+
motoko include=import
+let blob = "\00\00\00\00\00\30\00\D3\01\01" : Blob;
+let principal = Principal.fromBlob(blob);
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func toText(p : Principal) : Text

Converts a Principal to its Text representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func fromText(t : Text) : Principal

Converts a Text representation of a Principal to a Principal value.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func isAnonymous(p : Principal) : Bool

Checks if the given principal represents an anonymous user.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isAnonymous(principal) // => false

public func isController(p : Principal) : Bool

Checks if the given principal can control this canister.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isController(principal) // => false

public func hash(principal : Principal) : Hash.Hash

Hashes the given principal by hashing its Blob representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.hash(principal) // => 2_742_573_646

public func compare(principal1 : Principal, principal2 : Principal) : {#less; #equal; #greater}

General purpose comparison function for Principal. Returns the Order ( +either #less, #equal, or #greater) of comparing principal1 with +principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.compare(principal1, principal2) // => #equal

public func equal(principal1 : Principal, principal2 : Principal) : Bool

Equality function for Principal types. +This is equivalent to principal1 == principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.equal(principal1, principal2);
+principal1 == principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Principal>(3);
+let buffer2 = Buffer.Buffer<Principal>(3);
+Buffer.equal(buffer1, buffer2, Principal.equal) // => true

public func notEqual(principal1 : Principal, principal2 : Principal) : Bool

Inequality function for Principal types. +This is equivalent to principal1 != principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.notEqual(principal1, principal2);
+principal1 != principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(principal1 : Principal, principal2 : Principal) : Bool

"Less than" function for Principal types. +This is equivalent to principal1 < principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.less(principal1, principal2);
+principal1 < principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(principal1 : Principal, principal2 : Principal) : Bool

"Less than or equal to" function for Principal types. +This is equivalent to principal1 <= principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.lessOrEqual(principal1, principal2);
+principal1 <= principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(principal1 : Principal, principal2 : Principal) : Bool

"Greater than" function for Principal types. +This is equivalent to principal1 > principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greater(principal1, principal2);
+principal1 > principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(principal1 : Principal, principal2 : Principal) : Bool

"Greater than or equal to" function for Principal types. +This is equivalent to principal1 >= principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greaterOrEqual(principal1, principal2);
+principal1 >= principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/RBTree.html b/base-doc/RBTree.html new file mode 100644 index 00000000000..8b33053b0af --- /dev/null +++ b/base-doc/RBTree.html @@ -0,0 +1,250 @@ + +

RBTree

Key-value map implemented as a red-black tree (RBTree) with nodes storing key-value pairs.

+

A red-black tree is a balanced binary search tree ordered by the keys.

+

The tree data structure internally colors each of its nodes either red or black, +and uses this information to balance the tree during the modifying operations.

+

Creation: +Instantiate class RBTree<K, V> that provides a map from keys of type K to values of type V.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a new red-black tree mapping Nat to Text
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "tree");
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+ +

Performance:

+
  • Runtime: O(log(n)) worst case cost per insertion, removal, and retrieval operation.
  • Space: O(n) for storing the entire tree. +n denotes the number of key-value entries (i.e. nodes) stored in the tree.
+ +

Note:

+
  • Tree operations, such as retrieval, insertion, and removal create O(log(n)) temporary objects that become garbage.
+ +

Credits:

+

The core of this implementation is derived from:

+

type Color = {#R; #B}

Node color: Either red (#R) or black (#B).

+

type Tree<K, V> = {#node : (Color, Tree<K, V>, (K, ?V), Tree<K, V>); #leaf}

Red-black tree of nodes with key-value entries, ordered by the keys. +The keys have the generic type K and the values the generic type V. +Leaves are considered implicitly black.

+

class RBTree<K, V>(compare : (K, K) -> O.Order)

public func share() : Tree<K, V>

Return a snapshot of the internal functional tree representation as sharable data. +The returned tree representation is not affected by subsequent changes of the RBTree instance.

+

Example:

+
motoko include=initialize
+
+tree.put(1, "one");
+let treeSnapshot = tree.share();
+tree.put(2, "second");
+RBTree.size(treeSnapshot) // => 1 (Only the first insertion is part of the snapshot.)
+ +

Useful for storing the state of a tree object as a stable variable, determining its size, pretty-printing, and sharing it across async function calls, +i.e. passing it in async arguments or async results.

+

Runtime: O(1). +Space: O(1).

+

public func unshare(t : Tree<K, V>) : ()

Reset the current state of the tree object from a functional tree representation.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+let snapshot = tree.share(); // save the current state of the tree object in a snapshot
+tree.put(2, "two");
+tree.unshare(snapshot); // restore the tree object from the snapshot
+Iter.toArray(tree.entries()) // => [(1, "one")]
+ +

Useful for restoring the state of a tree object from stable data, saved, for example, in a stable variable.

+

Runtime: O(1). +Space: O(1).

+

public func get(key : K) : ?V

Retrieve the value associated with a given key, if present. Returns null, if the key is absent. +The key is searched according to the compare function defined on the class instantiation.

+

Example:

+
motoko include=initialize
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.get(1) // => ?"one"
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func replace(key : K, value : V) : ?V

Replace the value associated with a given key, if the key is present. +Otherwise, if the key does not yet exist, insert the key-value entry.

+

Returns the previous value of the key, if the key already existed. +Otherwise, null, if the key did not yet exist before.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "old one");
+tree.put(2, "two");
+
+ignore tree.replace(1, "new one");
+Iter.toArray(tree.entries()) // => [(1, "new one"), (2, "two")]
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func put(key : K, value : V)

Insert a key-value entry in the tree. If the key already exists, it overwrites the associated value.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+Iter.toArray(tree.entries()) // now contains three entries
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func delete(key : K)

Delete the entry associated with a given key, if the key exists. +No effect if the key is absent. Same as remove(key) except that it +does not have a return value.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.delete(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func remove(key : K) : ?V

Remove the entry associated with a given key, if the key exists, and return the associated value. +Returns null without any other effect if the key is absent.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+ignore tree.remove(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func entries() : I.Iter<(K, V)>

An iterator for the key-value entries of the map, in ascending key order. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
motoko include=initialize
+import Debug "mo:base/Debug";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=1 value="one"
+// Entry key=2 value="two"
+// Entry key=3 value="three"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

public func entriesRev() : I.Iter<(K, V)>

An iterator for the key-value entries of the map, in descending key order. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
motoko include=initialize
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entriesRev()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

A map from keys of type K to values of type V implemented as a red-black tree. +The entries of key-value pairs are ordered by compare function applied to the keys.

+

The class enables imperative usage in object-oriented-style. +However, internally, the class uses a functional implementation.

+

The compare function should implement a consistent total order among all possible values of K and +for efficiency, only involves O(1) runtime costs without space allocation.

+

Example:

+
motoko name=initialize
+import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a map of `Nat` to `Text` using the `Nat.compare` order
+ +

Costs of instantiation (only empty tree): +Runtime: O(1). +Space: O(1).

+

public func iter<X, Y>(tree : Tree<X, Y>, direction : {#fwd; #bwd}) : I.Iter<(X, Y)>

Get an iterator for the entries of the tree, in ascending (#fwd) or descending (#bwd) order as specified by direction. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in RBTree.iter(tree.share(), #bwd)) { // backward iteration
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

public func size<X, Y>(t : Tree<X, Y>) : Nat

Determine the size of the tree as the number of key-value entries.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+
+RBTree.size(tree.share()) // 3 entries
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

\ No newline at end of file diff --git a/base-doc/Random.html b/base-doc/Random.html new file mode 100644 index 00000000000..3cd5fc85828 --- /dev/null +++ b/base-doc/Random.html @@ -0,0 +1,81 @@ + +

Random

A module for obtaining randomness on the Internet Computer (IC).

+

This module provides the fundamentals for user abstractions to build on.

+

Dealing with randomness on a deterministic computing platform, such +as the IC, is intricate. Some basic rules need to be followed by the +user of this module to obtain (and maintain) the benefits of crypto- +graphic randomness:

+
  • cryptographic entropy (randomness source) is only obtainable + asyncronously in discrete chunks of 256 bits (32-byte sized Blobs)
  • all bets must be closed before entropy is being asked for in + order to decide them
  • this implies that the same entropy (i.e. Blob) - or surplus entropy + not utilised yet - cannot be used for a new round of bets without + losing the cryptographic guarantees.
+ +

Concretely, the below class Finite, as well as the +*From methods risk the carrying-over of state from previous rounds. +These are provided for performance (and convenience) reasons, and need +special care when used. Similar caveats apply for user-defined (pseudo) +random number generators.

+

Usage:

+
motoko no-repl
+import Random "mo:base/Random";

public let blob : shared () -> async Blob

Obtains a full blob (32 bytes) worth of fresh entropy.

+

Example:

+
motoko no-repl
+let random = Random.Finite(await Random.blob());

class Finite(entropy : Blob)

public func byte() : ?Nat8

Uniformly distributes outcomes in the numeric range [0 .. 255]. +Consumes 1 byte of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.byte() // => ?20

public func coin() : ?Bool

Simulates a coin toss. Both outcomes have equal probability. +Consumes 1 bit of entropy (amortised).

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.coin() // => ?false

public func range(p : Nat8) : ?Nat

Uniformly distributes outcomes in the numeric range [0 .. 2^p - 1]. +Consumes ⌈p/8⌉ bytes of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.range(32) // => ?348746249

public func binomial(n : Nat8) : ?Nat8

Counts the number of heads in n fair coin tosses. +Consumes ⌈n/8⌉ bytes of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.binomial(5) // => ?1

Drawing from a finite supply of entropy, Finite provides +methods to obtain random values. When the entropy is used up, +null is returned. Otherwise the outcomes' distributions are +stated for each method. The uniformity of outcomes is +guaranteed only when the supplied entropy is originally obtained +by the blob() call, and is never reused.

+

Example:

+
motoko no-repl
+import Random "mo:base/Random";
+
+let random = Random.Finite(await Random.blob());
+
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let seedRandom = Random.Finite(seed);

public func byteFrom(seed : Blob) : Nat8

Distributes outcomes in the numeric range [0 .. 255]. +Seed blob must contain at least a byte.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.byteFrom(seed) // => 20

public func coinFrom(seed : Blob) : Bool

Simulates a coin toss. +Seed blob must contain at least a byte.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.coinFrom(seed) // => false

public func rangeFrom(p : Nat8, seed : Blob) : Nat

Distributes outcomes in the numeric range [0 .. 2^p - 1]. +Seed blob must contain at least ((p+7) / 8) bytes.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.rangeFrom(32, seed) // => 348746249

public func binomialFrom(n : Nat8, seed : Blob) : Nat8

Counts the number of heads in n coin tosses. +Seed blob must contain at least ((n+7) / 8) bytes.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.binomialFrom(5, seed) // => 1

\ No newline at end of file diff --git a/base-doc/Result.html b/base-doc/Result.html new file mode 100644 index 00000000000..387b278ff95 --- /dev/null +++ b/base-doc/Result.html @@ -0,0 +1,49 @@ + +

Result

Error handling with the Result type.

+

type Result<Ok, Err> = {#ok : Ok; #err : Err}

Result<Ok, Err> is the type used for returning and propagating errors. It +is a type with the variants, #ok(Ok), representing success and containing +a value, and #err(Err), representing error and containing an error value.

+

The simplest way of working with Results is to pattern match on them:

+

For example, given a function createUser(user : User) : Result<Id, String> +where String is an error message we could use it like so:

+
motoko no-repl
+switch(createUser(myUser)) {
+  case (#ok(id)) { Debug.print("Created new user with id: " # id) };
+  case (#err(msg)) { Debug.print("Failed to create user with the error: " # msg) };
+}

public func equal<Ok, Err>(
  eqOk : (Ok, Ok) -> Bool,
  eqErr : (Err, Err) -> Bool,
  r1 : Result<Ok, Err>,
  r2 : Result<Ok, Err>
) : Bool

public func compare<Ok, Err>(
  compareOk : (Ok, Ok) -> Order.Order,
  compareErr : (Err, Err) -> Order.Order,
  r1 : Result<Ok, Err>,
  r2 : Result<Ok, Err>
) : Order.Order

public func chain<R1, R2, Error>(x : Result<R1, Error>, y : R1 -> Result<R2, Error>) : Result<R2, Error>

Allows sequencing of Result values and functions that return +Result's themselves.

+
import Result "mo:base/Result";
+type Result<T,E> = Result.Result<T, E>;
+func largerThan10(x : Nat) : Result<Nat, Text> =
+  if (x > 10) { #ok(x) } else { #err("Not larger than 10.") };
+
+func smallerThan20(x : Nat) : Result<Nat, Text> =
+  if (x < 20) { #ok(x) } else { #err("Not smaller than 20.") };
+
+func between10And20(x : Nat) : Result<Nat, Text> =
+  Result.chain(largerThan10(x), smallerThan20);
+
+assert(between10And20(15) == #ok(15));
+assert(between10And20(9) == #err("Not larger than 10."));
+assert(between10And20(21) == #err("Not smaller than 20."));

public func flatten<Ok, Error>(result : Result<Result<Ok, Error>, Error>) : Result<Ok, Error>

Flattens a nested Result.

+
import Result "mo:base/Result";
+assert(Result.flatten<Nat, Text>(#ok(#ok(10))) == #ok(10));
+assert(Result.flatten<Nat, Text>(#err("Wrong")) == #err("Wrong"));
+assert(Result.flatten<Nat, Text>(#ok(#err("Wrong"))) == #err("Wrong"));

public func mapOk<Ok1, Ok2, Error>(x : Result<Ok1, Error>, f : Ok1 -> Ok2) : Result<Ok2, Error>

Maps the Ok type/value, leaving any Error type/value unchanged.

+

public func mapErr<Ok, Error1, Error2>(x : Result<Ok, Error1>, f : Error1 -> Error2) : Result<Ok, Error2>

Maps the Err type/value, leaving any Ok type/value unchanged.

+

public func fromOption<R, E>(x : ?R, err : E) : Result<R, E>

Create a result from an option, including an error value to handle the null case.

+
import Result "mo:base/Result";
+assert(Result.fromOption(?42, "err") == #ok(42));
+assert(Result.fromOption(null, "err") == #err("err"));

public func toOption<R, E>(r : Result<R, E>) : ?R

Create an option from a result, turning all #err into null.

+
import Result "mo:base/Result";
+assert(Result.toOption(#ok(42)) == ?42);
+assert(Result.toOption(#err("err")) == null);

public func iterate<Ok, Err>(res : Result<Ok, Err>, f : Ok -> ())

Applies a function to a successful value, but discards the result. Use +iterate if you're only interested in the side effect f produces.

+
import Result "mo:base/Result";
+var counter : Nat = 0;
+Result.iterate<Nat, Text>(#ok(5), func (x : Nat) { counter += x });
+assert(counter == 5);
+Result.iterate<Nat, Text>(#err("Wrong"), func (x : Nat) { counter += x });
+assert(counter == 5);

public func isOk(r : Result<Any, Any>) : Bool

public func isErr(r : Result<Any, Any>) : Bool

public func assertOk(r : Result<Any, Any>)

Asserts that its argument is an #ok result, traps otherwise.

+

public func assertErr(r : Result<Any, Any>)

Asserts that its argument is an #err result, traps otherwise.

+

\ No newline at end of file diff --git a/base-doc/Stack.html b/base-doc/Stack.html new file mode 100644 index 00000000000..42eb079e935 --- /dev/null +++ b/base-doc/Stack.html @@ -0,0 +1,46 @@ + +

Stack

Class Stack<X> provides a Minimal LIFO stack of elements of type X.

+

See library Deque for mixed LIFO/FIFO behavior.

+

Example:

+
motoko name=initialize
+import Stack "mo:base/Stack";
+
+let stack = Stack.Stack<Nat>(); // create a stack

Runtime: O(1)

+

Space: O(1)

+

class Stack<T>()

public func push(x : T)

Push an element on the top of the stack.

+

Example:

+
motoko include=initialize
+stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek(); // examine the top most element
+ +

Runtime: O(1)

+

Space: O(1)

+

public func isEmpty() : Bool

True when the stack is empty and false otherwise.

+

Example:

+
motoko include=initialize
+stack.isEmpty();
+ +

Runtime: O(1)

+

Space: O(1)

+

public func peek() : ?T

Return (without removing) the top element, or return null if the stack is empty.

+

Example:

+
motoko include=initialize
+stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek();
+ +

Runtime: O(1)

+

Space: O(1)

+

public func pop() : ?T

Remove and return the top element, or return null if the stack is empty.

+

Example:

+
motoko include=initialize
+stack.push(1);
+ignore stack.pop();
+stack.isEmpty();
+ +

Runtime: O(1)

+

Space: O(1)

+

\ No newline at end of file diff --git a/base-doc/Text.html b/base-doc/Text.html new file mode 100644 index 00000000000..8ee5228db53 --- /dev/null +++ b/base-doc/Text.html @@ -0,0 +1,136 @@ + +

Text

Utility functions for Text values.

+

A Text value represents human-readable text as a sequence of characters of type Char.

+
let text = "Hello!";
+let size = text.size(); // 6
+let iter = text.chars(); // iterator ('H', 'e', 'l', 'l', 'o', '!')
+let concat = text # " 👋"; // "Hello! 👋"
+ +

The "mo:base/Text" module defines additional operations on Text values.

+

Import the module from the base library:

+
motoko name=import
+import Text "mo:base/Text";
+ +

Note: Text values are represented as ropes of UTF-8 character sequences with O(1) concatenation.

+

type Text = Prim.Types.Text

The type corresponding to primitive Text values.

+
let hello = "Hello!";
+let emoji = "👋";
+let concat = hello # " " # emoji; // "Hello! 👋"

public let fromChar : (c : Char) -> Text

Converts the given Char to a Text value.

+
motoko include=import
+let text = Text.fromChar('A'); // "A"

public func toIter(t : Text) : Iter.Iter<Char>

Iterates over each Char value in the given Text.

+

Equivalent to calling the t.chars() method where t is a Text value.

+
motoko include=import
+import { print } "mo:base/Debug";
+
+for (c in Text.toIter("abc")) {
+  print(debug_show c);
+}

public func toArray(t : Text) : [Char]

Creates a new Array containing characters of the given Text.

+

Equivalent to Iter.toArray(t.chars()).

+
motoko include=import
+assert Text.toArray("Café") == ['C', 'a', 'f', 'é'];
+ +

Runtime: O(t.size()) +Space: O(t.size())

+

public func toVarArray(t : Text) : [var Char]

Creates a new mutable Array containing characters of the given Text.

+

Equivalent to Iter.toArrayMut(t.chars()).

+
motoko include=import
+assert Text.toVarArray("Café") == [var 'C', 'a', 'f', 'é'];
+ +

Runtime: O(t.size()) +Space: O(t.size())

+

public func fromIter(cs : Iter.Iter<Char>) : Text

Creates a Text value from a Char iterator.

+
motoko include=import
+let text = Text.fromIter(['a', 'b', 'c'].vals()); // "abc"

public func size(t : Text) : Nat

Returns the number of characters in the given Text.

+

Equivalent to calling t.size() where t is a Text value.

+
motoko include=import
+let size = Text.size("abc"); // 3

public func hash(t : Text) : Hash.Hash

Returns a hash obtained by using the djb2 algorithm (more details).

+
motoko include=import
+let hash = Text.hash("abc");
+ +

Note: this algorithm is intended for use in data structures rather than as a cryptographic hash function.

+

public func concat(t1 : Text, t2 : Text) : Text

Returns t1 # t2, where # is the Text concatenation operator.

+
motoko include=import
+let a = "Hello";
+let b = "There";
+let together = a # b; // "HelloThere"
+let withSpace = a # " " # b; // "Hello There"
+let togetherAgain = Text.concat(a, b); // "HelloThere"

public func equal(t1 : Text, t2 : Text) : Bool

Returns t1 == t2.

+

public func notEqual(t1 : Text, t2 : Text) : Bool

Returns t1 != t2.

+

public func less(t1 : Text, t2 : Text) : Bool

Returns t1 < t2.

+

public func lessOrEqual(t1 : Text, t2 : Text) : Bool

Returns t1 <= t2.

+

public func greater(t1 : Text, t2 : Text) : Bool

Returns t1 > t2.

+

public func greaterOrEqual(t1 : Text, t2 : Text) : Bool

Returns t1 >= t2.

+

public func compare(t1 : Text, t2 : Text) : {#less; #equal; #greater}

Compares t1 and t2 lexicographically.

+
motoko include=import
+import { print } "mo:base/Debug";
+
+print(debug_show Text.compare("abc", "abc")); // #equal
+print(debug_show Text.compare("abc", "def")); // #less
+print(debug_show Text.compare("abc", "ABC")); // #greater

public func join(sep : Text, ts : Iter.Iter<Text>) : Text

Join an iterator of Text values with a given delimiter.

+
motoko include=import
+let joined = Text.join(", ", ["a", "b", "c"].vals()); // "a, b, c"

public func map(t : Text, f : Char -> Char) : Text

Applies a function to each character in a Text value, returning the concatenated Char results.

+
motoko include=import
+// Replace all occurrences of '?' with '!'
+let result = Text.map("Motoko?", func(c) {
+  if (c == '?') '!'
+  else c
+});

public func translate(t : Text, f : Char -> Text) : Text

Returns the result of applying f to each character in ts, concatenating the intermediate text values.

+
motoko include=import
+// Replace all occurrences of '?' with "!!"
+let result = Text.translate("Motoko?", func(c) {
+  if (c == '?') "!!"
+  else Text.fromChar(c)
+}); // "Motoko!!"

type Pattern = {#char : Char; #text : Text; #predicate : (Char -> Bool)}

A pattern p describes a sequence of characters. A pattern has one of the following forms:

+
  • #char c matches the single character sequence, c.
  • #text t matches multi-character text sequence t.
  • #predicate p matches any single character sequence c satisfying predicate p(c).
+ +

A match for p is any sequence of characters matching the pattern p.

+
motoko include=import
+let charPattern = #char 'A';
+let textPattern = #text "phrase";
+let predicatePattern : Text.Pattern = #predicate (func(c) { c == 'A' or c == 'B' }); // matches "A" or "B"

public func split(t : Text, p : Pattern) : Iter.Iter<Text>

Splits the input Text with the specified Pattern.

+

Two fields are separated by exactly one match.

+
motoko include=import
+let words = Text.split("This is a sentence.", #char ' ');
+Text.join("|", words) // "This|is|a|sentence."

public func tokens(t : Text, p : Pattern) : Iter.Iter<Text>

Returns a sequence of tokens from the input Text delimited by the specified Pattern, derived from start to end. +A "token" is a non-empty maximal subsequence of t not containing a match for pattern p. +Two tokens may be separated by one or more matches of p.

+
motoko include=import
+let tokens = Text.tokens("this needs\n an   example", #predicate (func(c) { c == ' ' or c == '\n' }));
+Text.join("|", tokens) // "this|needs|an|example"

public func contains(t : Text, p : Pattern) : Bool

Returns true if the input Text contains a match for the specified Pattern.

+
motoko include=import
+Text.contains("Motoko", #text "oto") // true

public func startsWith(t : Text, p : Pattern) : Bool

Returns true if the input Text starts with a prefix matching the specified Pattern.

+
motoko include=import
+Text.startsWith("Motoko", #text "Mo") // true

public func endsWith(t : Text, p : Pattern) : Bool

Returns true if the input Text ends with a suffix matching the specified Pattern.

+
motoko include=import
+Text.endsWith("Motoko", #char 'o') // true

public func replace(
  t : Text,
  p : Pattern,
  r : Text
) : Text

Returns the input text t with all matches of pattern p replaced by text r.

+
motoko include=import
+let result = Text.replace("abcabc", #char 'a', "A"); // "AbcAbc"

public func stripStart(t : Text, p : Pattern) : ?Text

Strips one occurrence of the given Pattern from the beginning of the input Text. +If you want to remove multiple instances of the pattern, use Text.trimStart() instead.

+
motoko include=import
+// Try to strip a nonexistent character
+let none = Text.stripStart("abc", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripStart("--abc", #char '-'); // ?"-abc"

public func stripEnd(t : Text, p : Pattern) : ?Text

Strips one occurrence of the given Pattern from the end of the input Text. +If you want to remove multiple instances of the pattern, use Text.trimEnd() instead.

+
motoko include=import
+// Try to strip a nonexistent character
+let none = Text.stripEnd("xyz", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripEnd("xyz--", #char '-'); // ?"xyz-"

public func trimStart(t : Text, p : Pattern) : Text

Trims the given Pattern from the start of the input Text. +If you only want to remove a single instance of the pattern, use Text.stripStart() instead.

+
motoko include=import
+let trimmed = Text.trimStart("---abc", #char '-'); // "abc"

public func trimEnd(t : Text, p : Pattern) : Text

Trims the given Pattern from the end of the input Text. +If you only want to remove a single instance of the pattern, use Text.stripEnd() instead.

+
motoko include=import
+let trimmed = Text.trimEnd("xyz---", #char '-'); // "xyz"

public func trim(t : Text, p : Pattern) : Text

Trims the given Pattern from both the start and end of the input Text.

+
motoko include=import
+let trimmed = Text.trim("---abcxyz---", #char '-'); // "abcxyz"

public func compareWith(
  t1 : Text,
  t2 : Text,
  cmp : (Char, Char) -> {#less; #equal; #greater}
) : {#less; #equal; #greater}

Compares t1 and t2 using the provided character-wise comparison function.

+
motoko include=import
+import Char "mo:base/Char";
+
+Text.compareWith("abc", "ABC", func(c1, c2) { Char.compare(c1, c2) }) // #greater

public let encodeUtf8 : Text -> Blob

Returns a UTF-8 encoded Blob from the given Text.

+
motoko include=import
+let blob = Text.encodeUtf8("Hello");

public let decodeUtf8 : Blob -> ?Text

Tries to decode the given Blob as UTF-8. +Returns null if the blob is not valid UTF-8.

+
motoko include=import
+let text = Text.decodeUtf8("\48\65\6C\6C\6F"); // ?"Hello"

\ No newline at end of file diff --git a/base-doc/Time.html b/base-doc/Time.html new file mode 100644 index 00000000000..a1b43b8a892 --- /dev/null +++ b/base-doc/Time.html @@ -0,0 +1,9 @@ + +

Time

System time

+

type Time = Int

System time is represent as nanoseconds since 1970-01-01.

+

public let now : () -> Time

Current system time given as nanoseconds since 1970-01-01. The system guarantees that:

+
  • the time, as observed by the canister smart contract, is monotonically increasing, even across canister upgrades.
  • within an invocation of one entry point, the time is constant.
+ +

The system times of different canisters are unrelated, and calls from one canister to another may appear to travel "backwards in time"

+

Note: While an implementation will likely try to keep the system time close to the real time, this is not formally guaranteed.

+

\ No newline at end of file diff --git a/base-doc/Timer.html b/base-doc/Timer.html new file mode 100644 index 00000000000..6bc42920cb4 --- /dev/null +++ b/base-doc/Timer.html @@ -0,0 +1,27 @@ + +

Timer

Timers for one-off or periodic tasks.

+

Note: If moc is invoked with -no-timer, the importing will fail. +Note: The resolution of the timers is in the order of the block rate,

+
  so durations should be chosen well above that. For frequent
+  canister wake-ups the heatbeat mechanism should be considered.

type Duration = {#seconds : Nat; #nanoseconds : Nat}

type TimerId = Nat

public func setTimer(d : Duration, job : () -> async ()) : TimerId

Installs a one-off timer that upon expiration after given duration d +executes the future job().

+
motoko no-repl
+let now = Time.now();
+let thirtyMinutes = 1_000_000_000 * 60 * 30;
+func alarmUser() : async () {
+  // ...
+};
+appt.reminder = setTimer(#nanoseconds (Int.abs(appt.when - now - thirtyMinutes)), alarmUser);

public func recurringTimer(d : Duration, job : () -> async ()) : TimerId

Installs a recurring timer that upon expiration after given duration d +executes the future job() and reinserts itself for another expiration.

+

Note: A duration of 0 will only expire once.

+
motoko no-repl
+func checkAndWaterPlants() : async () {
+  // ...
+};
+let daily = recurringTimer(#seconds (24 * 60 * 60), checkAndWaterPlants);

public let cancelTimer : TimerId -> ()

Cancels a still active timer with (id : TimerId). For expired timers +and not recognised ids nothing happens.

+
motoko no-repl
+func deleteAppt(appt : Appointment) {
+  cancelTimer (appt.reminder);
+  // ...
+};

\ No newline at end of file diff --git a/base-doc/Trie.html b/base-doc/Trie.html new file mode 100644 index 00000000000..6954d807aae --- /dev/null +++ b/base-doc/Trie.html @@ -0,0 +1,487 @@ + +

Trie

Functional key-value hash maps.

+

Functional maps (and sets) whose representation is "canonical", and +independent of operation history (unlike other popular search trees).

+

The representation we use here comes from Section 6 of "Incremental computation via function caching", Pugh & Teitelbaum.

+

User's overview

+ +

This module provides an applicative (functional) hash map. +Notably, each put produces a new trie and value being replaced, if any.

+

Those looking for a more familiar (imperative, +object-oriented) hash map should consider TrieMap or HashMap instead.

+

The basic Trie operations consist of:

+
  • put - put a key-value into the trie, producing a new version.
  • get - get a key's value from the trie, or null if none.
  • remove - remove a key's value from the trie
  • iter - visit every key-value in the trie.
+ +

The put, get and remove operations work over Key records, +which group the hash of the key with its non-hash key value.

+

Example:

+
import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// we have to provide `put`, `get` and `remove` with
+// a record of type `Key<K> = { hash : Hash.Hash; key : K }`;
+// thus we define the following function that takes a value of type `K`
+// (in this case `Text`) and returns a `Key<K>` record.
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+
+// we start off by creating an empty `Trie`
+let t0 : Trie<Text, Nat> = Trie.empty();
+
+// `put` requires 4 arguments:
+// - the trie we want to insert the value into,
+// - the key of the value we want to insert (note that we use the `key` function defined above),
+// - a function that checks for equality of keys, and
+// - the value we want to insert.
+//
+// When inserting a value, `put` returns a tuple of type `(Trie<K, V>, ?V)`.
+// to get the new trie that contains the value,  we use the `0` projection
+// and assign it to `t1` and `t2` respectively.
+let t1 : Trie<Text, Nat> = Trie.put(t0, key "hello", Text.equal, 42).0;
+let t2 : Trie<Text, Nat> = Trie.put(t1, key "world", Text.equal, 24).0;
+
+// If for a given key there already was a value in the trie, `put` returns
+// that previous value as the second element of the tuple.
+// in our case we have already inserted the value 42 for the key "hello", so
+// `put` returns 42 as the second element of the tuple.
+let (t3, n) : (Trie<Text, Nat>, ?Nat) = Trie.put(
+  t2,
+  key "hello",
+  Text.equal,
+  0,
+);
+assert (n == ?42);
+
+// `get` requires 3 arguments:
+// - the trie we want to get the value from
+// - the key of the value we want to get (note that we use the `key` function defined above)
+// - a function that checks for equality of keys
+//
+// If the given key is nonexistent in the trie, `get` returns `null`.
+var value = Trie.get(t3, key "hello", Text.equal); // Returns `?42`
+assert(value == ?0);
+value := Trie.get(t3, key "universe", Text.equal); // Returns `null`
+assert(value == null);
+
+// `remove` requires 3 arguments:
+// - the trie we want to remove the value from,
+// - the key of the value we want to remove (note that we use the `key` function defined above), and
+// - a function that checks for equality of keys.
+//
+// In the case of keys of type `Text`, we can use `Text.equal`
+// to check for equality of keys. Function `remove` returns a tuple of type `(Trie<K, V>, ?V)`.
+// where the second element of the tuple is the value that was removed, or `null` if
+// there was no value for the given key.
+let removedValue : ?Nat = Trie.remove(
+  t3,
+  key "hello",
+  Text.equal,
+).1;
+assert (removedValue == ?0);
+
+// To iterate over the Trie, we use the `iter` function that takes a trie
+// of type `Trie<K,V>` and returns an iterator of type `Iter<(K,V)>`:
+var sum : Nat = 0;
+for (kv in Trie.iter(t3)) {
+  sum += kv.1;
+};
+assert(sum == 24);

type Trie<K, V> = {#empty; #leaf : Leaf<K, V>; #branch : Branch<K, V>}

Binary hash tries: either empty, a leaf node, or a branch node

+

type Leaf<K, V> = { size : Nat; keyvals : AssocList<Key<K>, V> }

Leaf nodes of trie consist of key-value pairs as a list.

+

type Branch<K, V> = { size : Nat; left : Trie<K, V>; right : Trie<K, V> }

Branch nodes of the trie discriminate on a bit position of the keys' hashes. +we never store this bitpos; rather, +we enforce a style where this position is always known from context.

+

type AssocList<K, V> = AssocList.AssocList<K, V>

type Key<K> = { hash : Hash.Hash; key : K }

A Key for the trie has an associated hash value

+
  • hash permits fast inequality checks, and permits collisions, while
  • key permits precise equality checks, but is only used on values with equal hashes.

public func equalKey<K>(keq : (K, K) -> Bool) : ((Key<K>, Key<K>) -> Bool)

Equality function for two Key<K>s, in terms of equality of K's.

+

public func isValid<K, V>(t : Trie<K, V>, _enforceNormal : Bool) : Bool

@deprecated isValid is an internal predicate and will be removed in future.

+

type Trie2D<K1, K2, V> = Trie<K1, Trie<K2, V>>

A 2D trie maps dimension-1 keys to another +layer of tries, each keyed on the dimension-2 keys.

+

type Trie3D<K1, K2, K3, V> = Trie<K1, Trie2D<K2, K3, V>>

A 3D trie maps dimension-1 keys to another +Composition of 2D tries, each keyed on the dimension-2 and dimension-3 keys.

+

public func empty<K, V>() : Trie<K, V>

An empty trie. This is usually the starting point for building a trie.

+

Example:

+
motoko name=initialize
+import { print } "mo:base/Debug";
+import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// We have to provide `put`, `get` and `remove` with
+// a function of return type `Key<K> = { hash : Hash.Hash; key : K }`
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+// We start off by creating an empty `Trie`
+var trie : Trie<Text, Nat> = Trie.empty();

public func size<K, V>(t : Trie<K, V>) : Nat

Get the size in O(1) time.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+var size = Trie.size(trie); // Returns 0, as `trie` is empty
+assert(size == 0);
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+size := Trie.size(trie); // Returns 1, as we just added a new entry
+assert(size == 1);

public func branch<K, V>(l : Trie<K, V>, r : Trie<K, V>) : Trie<K, V>

Construct a branch node, computing the size stored there.

+

public func leaf<K, V>(kvs : AssocList<Key<K>, V>, bitpos : Nat) : Trie<K, V>

Construct a leaf node, computing the size stored there.

+

This helper function automatically enforces the MAX_LEAF_SIZE +by constructing branches as necessary; to do so, it also needs the bitpos +of the leaf.

+

public func fromList<K, V>(
  kvc : ?Nat,
  kvs : AssocList<Key<K>, V>,
  bitpos : Nat
) : Trie<K, V>

Transform a list into a trie, splitting input list into small (leaf) lists, if necessary.

+

public func clone<K, V>(t : Trie<K, V>) : Trie<K, V>

Clone the trie efficiently, via sharing.

+

Purely-functional representation permits O(1) copy, via persistent sharing.

+

public func replace<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : ?V
) : (Trie<K, V>, ?V)

Replace the given key's value option with the given value, returning the modified trie. +Also returns the replaced value if the key existed and null otherwise. +Compares keys using the provided function k_eq.

+

Note: Replacing a key's value by null removes the key and also shrinks the trie.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "test", Text.equal, 1).0;
+trie := Trie.replace(trie, key "test", Text.equal, 42).0;
+assert (Trie.get(trie, key "hello", Text.equal) == ?42);

public func put<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : V
) : (Trie<K, V>, ?V)

Put the given key's value in the trie; return the new trie, and the previous value associated with the key, if any.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+let previousValue = Trie.put(trie, key "hello", Text.equal, 33).1; // Returns ?42
+assert(previousValue == ?42);

public func get<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : ?V

Get the value of the given key in the trie, or return null if nonexistent.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.get(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.get(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);

public func find<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : ?V

Find the given key's value in the trie, or return null if nonexistent

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.find(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.find(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);

public func merge<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

Merge tries, preferring the left trie where there are collisions +in common keys.

+

note: the disj operation generalizes this merge +operation in various ways, and does not (in general) lose +information; this operation is a simpler, special case.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// mergedTrie has the value 42 for "hello", as the left trie is preferred
+// in the case of a collision
+var mergedTrie = Trie.merge(trie, trie2, Text.equal);
+var value = Trie.get(mergedTrie, key "hello", Text.equal);
+assert(value == ?42);

public func mergeDisjoint<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

+

Merge tries like merge, but traps if there are collisions in common keys between the +left and right inputs.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// `mergeDisjoint` signals a dynamic errror
+// in the case of a collision
+var mergedTrie = Trie.mergeDisjoint(trie, trie2, Text.equal);

public func diff<K, V, W>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

Difference of tries. The output consists of pairs of +the left trie whose keys are not present in the right trie; the +values of the right trie are irrelevant.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 now has an additional key
+trie2 := Trie.put(trie2, key "ciao", Text.equal, 33).0;
+// `diff` returns a trie with the key "ciao",
+// as this key is not present in `trie`
+// (note that we pass `trie2` as the left trie)
+Trie.diff(trie2, trie, Text.equal);

public func disj<K, V, W, X>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool,
  vbin : (?V, ?W) -> X
) : Trie<K, X>

Map disjunction.

+

This operation generalizes the notion of "set union" to finite maps.

+

Produces a "disjunctive image" of the two tries, where the values of +matching keys are combined with the given binary operator.

+

For unmatched key-value pairs, the operator is still applied to +create the value in the image. To accomodate these various +situations, the operator accepts optional values, but is never +applied to (null, null).

+

Implements the database idea of an "outer join".

+

public func join<K, V, W, X>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool,
  vbin : (V, W) -> X
) : Trie<K, X>

Map join.

+

Implements the database idea of an "inner join".

+

This operation generalizes the notion of "set intersection" to +finite maps. The values of matching keys are combined with the given binary +operator, and unmatched key-value pairs are not present in the output.

+

public func foldUp<K, V, X>(
  t : Trie<K, V>,
  bin : (X, X) -> X,
  leaf : (K, V) -> X,
  empty : X
) : X

This operation gives a recursor for the internal structure of +tries. Many common operations are instantiations of this function, +either as clients, or as hand-specialized versions (e.g., see , map, +mapFilter, some and all below).

+

public func prod<K1, V1, K2, V2, K3, V3>(
  tl : Trie<K1, V1>,
  tr : Trie<K2, V2>,
  op : (K1, V1, K2, V2) -> ?(Key<K3>, V3),
  k3_eq : (K3, K3) -> Bool
) : Trie<K3, V3>

Map product.

+

Conditional catesian product, where the given +operation op conditionally creates output elements in the +resulting trie.

+

The keyed structure of the input tries are not relevant for this +operation: all pairs are considered, regardless of keys matching or +not. Moreover, the resulting trie may use keys that are unrelated to +these input keys.

+

public func iter<K, V>(t : Trie<K, V>) : I.Iter<(K, V)>

Returns an iterator of type Iter over the key-value entries of the trie.

+

Each iterator gets a persistent view of the mapping, independent of concurrent updates to the iterated map.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// create an Iterator over key-value pairs of trie
+let iter = Trie.iter(trie);
+// add another key-value pair to `trie`.
+// because we created our iterator before
+// this update, it will not contain this new key-value pair
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+var sum : Nat = 0;
+for ((k,v) in iter) {
+  sum += v;
+};
+assert(sum == 74);

module Build

type Build<K, V> = {#skip; #put : (K, ?Hash.Hash, V); #seq : { size : Nat; left : Build<K, V>; right : Build<K, V> }}

The build of a trie, as an AST for a simple DSL.

+

public func size<K, V>(tb : Build<K, V>) : Nat

Size of the build, measured in #put operations

+

public func seq<K, V>(l : Build<K, V>, r : Build<K, V>) : Build<K, V>

Build sequence of two sub-builds

+

public func prod<K1, V1, K2, V2, K3, V3>(
  tl : Trie<K1, V1>,
  tr : Trie<K2, V2>,
  op : (K1, V1, K2, V2) -> ?(K3, V3),
  k3_eq : (K3, K3) -> Bool
) : Build<K3, V3>

Like prod, except do not actually do the put calls, just +record them, as a (binary tree) data structure, isomorphic to the +recursion of this function (which is balanced, in expectation).

+

public func nth<K, V>(tb : Build<K, V>, i : Nat) : ?(K, ?Hash.Hash, V)

Project the nth key-value pair from the trie build.

+

This position is meaningful only when the build contains multiple uses of one or more keys, otherwise it is not.

+

public func projectInner<K1, K2, V>(t : Trie<K1, Build<K2, V>>) : Build<K2, V>

Like mergeDisjoint, except that it avoids the +work of actually merging any tries; rather, just record the work for +latter (if ever).

+

public func toArray<K, V, W>(tb : Build<K, V>, f : (K, V) -> W) : [W]

Gather the collection of key-value pairs into an array of a (possibly-distinct) type.

+

Represent the construction of tries as data.

+

This module provides optimized variants of normal tries, for +more efficient join queries.

+

The central insight is that for (unmaterialized) join query results, we +do not need to actually build any resulting trie of the resulting +data, but rather, just need a collection of what would be in that +trie. Since query results can be large (quadratic in the DB size), +avoiding the construction of this trie provides a considerable savings.

+

To get this savings, we use an ADT for the operations that would build this trie, +if evaluated. This structure specializes a rope: a balanced tree representing a +sequence. It is only as balanced as the tries from which we generate +these build ASTs. They have no intrinsic balance properties of their +own.

+

public func fold<K, V, X>(
  t : Trie<K, V>,
  f : (K, V, X) -> X,
  x : X
) : X

Fold over the key-value pairs of the trie, using an accumulator. +The key-value pairs have no reliable or meaningful ordering.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// create an accumulator, in our case the sum of all values
+func calculateSum(k : Text, v : Nat, acc : Nat) : Nat = acc + v;
+// Fold over the trie using the accumulator.
+// Note that 0 is the initial value of the accumulator.
+let sum = Trie.fold(trie, calculateSum, 0);
+assert(sum == 77);

public func some<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool

Test whether a given key-value pair is present, or not.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// `some` takes a function that returns a Boolean indicating whether
+// the key-value pair is present or not
+var isPresent = Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "bye" and v == 32,
+);
+assert(isPresent == true);
+isPresent := Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "hello" and v == 32,
+);
+assert(isPresent == false);

public func all<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool

Test whether all key-value pairs have a given property.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `all` takes a function that returns a boolean indicating whether
+// the key-value pairs all have a given property, in our case that
+// all values are greater than 9
+var hasProperty = Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 9,
+);
+assert(hasProperty == true);
+// now we check if all values are greater than 100
+hasProperty := Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 100,
+);
+assert(hasProperty == false);

public func nth<K, V>(t : Trie<K, V>, i : Nat) : ?(Key<K>, V)

Project the nth key-value pair from the trie.

+

Note: This position is not meaningful; it's only here so that we +can inject tries into arrays using functions like Array.tabulate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+import Array "mo:base/Array";
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `tabulate` takes a size parameter, so we check the size of
+// the trie first
+let size = Trie.size(trie);
+// Now we can create an array of the same size passing `nth` as
+// the generator used to fill the array.
+// Note that `toArray` is a convenience function that does the
+// same thing without you having to check whether the tuple is
+// `null` or not, which we're not doing in this example
+let array = Array.tabulate<?(Key<Text>, Nat)>(
+  size,
+  func n = Trie.nth(trie, n)
+);

public func toArray<K, V, W>(t : Trie<K, V>, f : (K, V) -> W) : [W]

Gather the collection of key-value pairs into an array of a (possibly-distinct) type.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `toArray` takes a function that takes a key-value tuple
+// and returns a value of the type you want to use to fill
+// the array.
+// In our case we just return the value
+let array = Trie.toArray<Text, Nat, Nat>(
+  trie,
+  func (k, v) = v
+);

public func isEmpty<K, V>(t : Trie<K, V>) : Bool

Test for "deep emptiness": subtrees that have branching structure, +but no leaves. These can result from naive filtering operations; +filter uses this function to avoid creating such subtrees.

+

public func filter<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Trie<K, V>

Filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `filter` takes a function that takes a key-value tuple
+// and returns true if the key-value pair should be included.
+// In our case those are pairs with a value greater than 20
+let filteredTrie = Trie.filter<Text, Nat>(
+  trie,
+  func (k, v) = v > 20
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 20) == true);

public func mapFilter<K, V, W>(t : Trie<K, V>, f : (K, V) -> ?W) : Trie<K, W>

Map and filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `mapFilter` takes a function that takes a key-value tuple
+// and returns a possibly-distinct value if the key-value pair should be included.
+// In our case, we filter for values greater than 20 and map them to their square.
+let filteredTrie = Trie.mapFilter<Text, Nat, Nat>(
+  trie,
+  func (k, v) = if (v > 20) return ?(v**2) else return null
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 60) == true);

public func equalStructure<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  keq : (K, K) -> Bool,
  veq : (V, V) -> Bool
) : Bool

Test for equality, but naively, based on structure. +Does not attempt to remove "junk" in the tree; +For instance, a "smarter" approach would equate + #bin {left = #empty; right = #empty} +with + #empty. +We do not observe that equality here.

+

public func replaceThen<K, V, X>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v2 : V,
  success : (Trie<K, V>, V) -> X,
  fail : () -> X
) : X

Replace the given key's value in the trie, +and only if successful, do the success continuation, +otherwise, return the failure value

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `replaceThen` takes the same arguments as `replace` but also a success continuation
+// and a failure connection that are called in the respective scenarios.
+// if the replace fails, that is the key is not present in the trie, the failure continuation is called.
+// if the replace succeeds, that is the key is present in the trie, the success continuation is called.
+// in this example we are simply returning the Text values `success` and `fail` respectively.
+var continuation = Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "hello",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "success");
+continuation := Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "shalom",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "fail");

public func putFresh<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : V
) : Trie<K, V>

Put the given key's value in the trie; return the new trie; assert that no prior value is associated with the key

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+// note that compared to `put`, `putFresh` does not return a tuple
+trie := Trie.putFresh(trie, key "hello", Text.equal, 42);
+trie := Trie.putFresh(trie, key "bye", Text.equal, 32);
+// this will fail as "hello" is already present in the trie
+trie := Trie.putFresh(trie, key "hello", Text.equal, 10);

public func put2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  v : V
) : Trie2D<K1, K2, V>

Put the given key's value in the 2D trie; return the new 2D trie.

+

public func put3D<K1, K2, K3, V>(
  t : Trie3D<K1, K2, K3, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  k3 : Key<K3>,
  k3_eq : (K3, K3) -> Bool,
  v : V
) : Trie3D<K1, K2, K3, V>

Put the given key's value in the trie; return the new trie;

+

public func remove<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : (Trie<K, V>, ?V)

Remove the entry for the given key from the trie, by returning the reduced trie. +Also returns the removed value if the key existed and null otherwise. +Compares keys using the provided function k_eq.

+

Note: The removal of an existing key shrinks the trie.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// remove the entry associated with "hello"
+trie := Trie.remove(trie, key "hello", Text.equal).0;
+assert (Trie.get(trie, key "hello", Text.equal) == null);

public func removeThen<K, V, X>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  success : (Trie<K, V>, V) -> X,
  fail : () -> X
) : X

Remove the given key's value in the trie, +and only if successful, do the success continuation, +otherwise, return the failure value

+

public func remove2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool
) : (Trie2D<K1, K2, V>, ?V)

remove the given key-key pair's value in the 2D trie; return the +new trie, and the prior value, if any.

+

public func remove3D<K1, K2, K3, V>(
  t : Trie3D<K1, K2, K3, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  k3 : Key<K3>,
  k3_eq : (K3, K3) -> Bool
) : (Trie3D<K1, K2, K3, V>, ?V)

Remove the given key-key pair's value in the 3D trie; return the +new trie, and the prior value, if any.

+

public func mergeDisjoint2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  k1_eq : (K1, K1) -> Bool,
  k2_eq : (K2, K2) -> Bool
) : Trie<K2, V>

Like mergeDisjoint, except instead of merging a +pair, it merges the collection of dimension-2 sub-trees of a 2D +trie.

+

\ No newline at end of file diff --git a/base-doc/TrieMap.html b/base-doc/TrieMap.html new file mode 100644 index 00000000000..bf9a4552f11 --- /dev/null +++ b/base-doc/TrieMap.html @@ -0,0 +1,209 @@ + +

TrieMap

Class TrieMap<K, V> provides a map from keys of type K to values of type V. +The class wraps and manipulates an underyling hash trie, found in the Trie +module. The trie is a binary tree in which the position of elements in the +tree are determined using the hash of the elements.

+

Note: The class TrieMap exposes the same interface as HashMap.

+

Creating a map: +The equality function is used to compare keys, and the hash function is used +to hash keys. See the example below.

+
motoko name=initialize
+import TrieMap "mo:base/TrieMap";
+import Nat "mo:base/Nat";
+import Hash "mo:base/Hash";
+import Iter "mo:base/Iter";
+
+let map = TrieMap.TrieMap<Nat, Nat>(Nat.equal, Hash.hash)

class TrieMap<K, V>(isEq : (K, K) -> Bool, hashOf : K -> Hash.Hash)

public func size() : Nat

Returns the number of entries in the map.

+

Example:

+
motoko include=initialize
+map.size()
+ +

Runtime: O(1) +Space: O(1)

+

public func put(key : K, value : V)

Maps key to value, and overwrites the old entry if the key +was already present.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(2, 12);
+Iter.toArray(map.entries())
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func replace(key : K, value : V) : ?V

Maps key to value. Overwrites and returns the old entry as an +option if the key was already present, and null otherwise.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.replace(0, 20)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func get(key : K) : ?V

Gets the value associated with the key key in an option, or null if it +doesn't exist.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.get(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func delete(key : K)

Delete the entry associated with key key, if it exists. If the key is +absent, there is no effect.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.delete(0);
+map.get(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func remove(key : K) : ?V

Delete the entry associated with key key. Return the deleted value +as an option if it exists, and null otherwise.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.remove(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func keys() : I.Iter<K>

Returns an iterator over the keys of the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the keys
+var sum = 0;
+for (key in map.keys()) {
+  sum += key;
+};
+// 0 + 1 + 2
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func vals() : I.Iter<V>

Returns an iterator over the values in the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the values
+var sum = 0;
+for (key in map.vals()) {
+  sum += key;
+};
+// 10 + 11 + 12
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func entries() : I.Iter<(K, V)>

Returns an iterator over the entries (key-value pairs) in the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the products of key-value pairs
+var sum = 0;
+for ((key, value) in map.entries()) {
+  sum += key * value;
+};
+// (0 * 10) + (1 * 11) + (2 * 12)
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func clone<K, V>(
  map : TrieMap<K, V>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : TrieMap<K, V>

Produce a copy of map, using keyEq to compare keys and keyHash to +hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// Clone using the same equality and hash functions used to initialize `map`
+let mapCopy = TrieMap.clone(map, Nat.equal, Hash.hash);
+Iter.toArray(mapCopy.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that the trie underlying map is reasonably +balanced and that keyEq and keyHash run in O(1) time and space.

+

public func fromEntries<K, V>(
  entries : I.Iter<(K, V)>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : TrieMap<K, V>

Create a new map from the entries in entries, using keyEq to compare +keys and keyHash to hash keys.

+

Example:

+
motoko include=initialize
+let entries = [(0, 10), (1, 11), (2, 12)];
+let newMap = TrieMap.fromEntries<Nat, Nat>(entries.vals(), Nat.equal, Hash.hash);
+newMap.get(2)
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that entries returns elements in O(1) time, +and keyEq and keyHash run in O(1) time and space.

+

public func map<K, V1, V2>(
  map : TrieMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> V2
) : TrieMap<K, V2>

Transform (map) the values in map using function f, retaining the keys. +Uses keyEq to compare keys and keyHash to hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map
+let newMap = TrieMap.map<Nat, Nat, Nat>(map, Nat.equal, Hash.hash, func(key, value) = value * 2);
+Iter.toArray(newMap.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that f, keyEq, and keyHash run in O(1) +time and space.

+

public func mapFilter<K, V1, V2>(
  map : TrieMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> ?V2
) : TrieMap<K, V2>

Transform (map) the values in map using function f, discarding entries +for which f evaluates to null. Uses keyEq to compare keys and +keyHash to hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map, only keeping entries that have an even key
+let newMap =
+  TrieMap.mapFilter<Nat, Nat, Nat>(
+    map,
+    Nat.equal,
+    Hash.hash,
+    func(key, value) = if (key % 2 == 0) { ?(value * 2) } else { null }
+  );
+Iter.toArray(newMap.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that f, keyEq, and keyHash run in O(1) +time and space.

+

\ No newline at end of file diff --git a/base-doc/TrieSet.html b/base-doc/TrieSet.html new file mode 100644 index 00000000000..99b1ddd7d0c --- /dev/null +++ b/base-doc/TrieSet.html @@ -0,0 +1,16 @@ + +

TrieSet

Functional set

+

Sets are partial maps from element type to unit type, +i.e., the partial map represents the set with its domain.

+

type Hash = Hash.Hash

type Set<T> = Trie.Trie<T, ()>

public func empty<T>() : Set<T>

Empty set.

+

public func put<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Set<T>

Put an element into the set.

+

public func delete<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Set<T>

Delete an element from the set.

+

public func equal<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Bool

Test if two sets are equal.

+

public func size<T>(s : Set<T>) : Nat

The number of set elements, set's cardinality.

+

public func isEmpty<T>(s : Set<T>) : Bool

Test if s is the empty set.

+

public func isSubset<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Bool

Test if s1 is a subset of s2.

+

public func mem<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Bool

Test if a set contains a given element.

+

public func union<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set union.

+

public func diff<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set difference.

+

public func intersect<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set intersection.

+

public func fromArray<T>(
  arr : [T],
  elemHash : T -> Hash,
  eq : (T, T) -> Bool
) : Set<T>

public func toArray<T>(s : Set<T>) : [T]

\ No newline at end of file diff --git a/base-doc/index.html b/base-doc/index.html new file mode 100644 index 00000000000..b0f0c081bca --- /dev/null +++ b/base-doc/index.html @@ -0,0 +1,497 @@ + +

Index of modules

  • Array

    Provides extended utility functions on Arrays.

    +

    Note the difference between mutable and non-mutable arrays below.

    +

    WARNING: If you are looking for a list that can grow and shrink in size, +it is recommended you use either the Buffer class or the List class for +those purposes. Arrays must be created with a fixed size.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Array "mo:base/Array";
  • AssocList

    Map implemented as a linked-list of key-value pairs ("Associations").

    +

    NOTE: This map implementation is mainly used as underlying buckets for other map +structures. Thus, other map implementations are easier to use in most cases.

    +
  • Blob

    Module for working with Blobs: immutable sequence of bytes.

    +

    Blobs represent sequences of bytes. They are immutable, iterable, but not indexable and can be empty.

    +

    Byte sequences are also often represented as [Nat8], i.e. an array of bytes, but this representation is currently much less compact than Blob, taking 4 physical bytes to represent each logical byte in the sequence. +If you would like to manipulate Blobs, it is recommended that you convert +Blobs to [var Nat8] or Buffer<Nat8>, do the manipulation, then convert back.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Blob "mo:base/Blob";
    + +

    Some built in features not listed in this module:

    +
    • You can create a Blob literal from a Text literal, provided the context expects an expression of type Blob.
    • b.size() : Nat returns the number of bytes in the blob b;
    • b.vals() : Iter.Iter<Nat8> returns an iterator to enumerate the bytes of the blob b.
    + +

    For example:

    +
    motoko include=import
    +import Debug "mo:base/Debug";
    +import Nat8 "mo:base/Nat8";
    +
    +let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
    +let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
    +let numBytes = blob.size(); // => 4 (returns the number of bytes in the Blob)
    +for (byte : Nat8 in blob.vals()) { // iterator over the Blob
    +  Debug.print(Nat8.toText(byte))
    +}
  • Bool

    Boolean type and operations.

    +

    While boolean operators _ and _ and _ or _ are short-circuiting, +avoiding computation of the right argument when possible, the functions +logand(_, _) and logor(_, _) are strict and will always evaluate both +of their arguments.

    +
  • Buffer

    Class Buffer<X> provides a mutable list of elements of type X. +The class wraps and resizes an underyling array that holds the elements, +and thus is comparable to ArrayLists or Vectors in other languages.

    +

    When required, the current state of a buffer object can be converted to a fixed-size array of its elements. +This is recommended for example when storing a buffer to a stable variable.

    +

    Throughout this documentation, two terms come up that can be confused: size +and capacity. size is the length of the list that the buffer represents. +capacity is the length of the underyling array that backs this list. +capacity >= size is an invariant for this class.

    +

    Like arrays, elements in the buffer are ordered by indices from 0 to size-1.

    +

    WARNING: Certain operations are amortized O(1) time, such as add, but run +in worst case O(n) time. These worst case runtimes may exceed the cycles limit +per message if the size of the buffer is large enough. Grow these structures +with discretion. All amortized operations below also list the worst case runtime.

    +

    Constructor: +The argument initCapacity determines the initial capacity of the array. +The underlying array grows by a factor of 1.5 when its current capacity is +exceeded. Further, when the size of the buffer shrinks to be less than 1/4th +of the capacity, the underyling array is shrunk by a factor of 2.

    +

    Example:

    +
    motoko name=initialize
    +import Buffer "mo:base/Buffer";
    +
    +let buffer = Buffer.Buffer<Nat>(3); // Creates a new Buffer
    + +

    Runtime: O(initCapacity)

    +

    Space: O(initCapacity)

    +
  • CertifiedData

    Certified data.

    +

    The Internet Computer allows canister smart contracts to store a small amount of data during +update method processing so that during query call processing, the canister can obtain +a certificate about that data.

    +

    This module provides a low-level interface to this API, aimed at advanced +users and library implementors. See the Internet Computer Functional +Specification and corresponding documentation for how to use this to make query +calls to your canister tamperproof.

    +
  • Char

    Characters

    +
  • Debug

    Utility functions for debugging.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Debug "mo:base/Debug";
  • Deque

    Double-ended queue (deque) of a generic element type T.

    +

    The interface to deques is purely functional, not imperative, and deques are immutable values. +In particular, deque operations such as push and pop do not update their input deque but, instead, return the +value of the modified deque, alongside any other data. +The input deque is left unchanged.

    +

    Examples of use-cases: +Queue (FIFO) by using pushBack() and popFront(). +Stack (LIFO) by using pushFront() and popFront().

    +

    A deque is internally implemented as two lists, a head access list and a (reversed) tail access list, +that are dynamically size-balanced by splitting.

    +

    Construction: Create a new deque with the empty<T>() function.

    +

    Note on the costs of push and pop functions:

    +
    • Runtime: O(1) amortized costs, O(n)` worst case cost per single call.
    • Space: O(1) amortized costs, O(n)` worst case cost per single call.
    + +

    n denotes the number of elements stored in the deque.

    +
  • Error

    Error values and inspection.

    +

    The Error type is the argument to throw, parameter of catch. +The Error type is opaque.

    +
  • ExperimentalCycles

    Managing cycles within actors on the Internet Computer (IC).

    +

    The usage of the Internet Computer is measured, and paid for, in cycles. +This library provides imperative operations for observing cycles, transferring cycles, and +observing refunds of cycles.

    +

    WARNING: This low-level API is experimental and likely to change or even disappear. +Dedicated syntactic support for manipulating cycles may be added to the language in future, obsoleting this library.

    +

    NOTE: Since cycles measure computational resources, the value of balance() can change from one call to the next.

    +

    Example for use on IC:

    +
    motoko no-repl
    +import Cycles "mo:base/ExperimentalCycles";
    +import Debug "mo:base/Debug";
    +
    +actor {
    +  public func main() : async() {
    +    Debug.print("Main balance: " # debug_show(Cycles.balance()));
    +    Cycles.add(15_000_000);
    +    await operation(); // accepts 10_000_000 cycles
    +    Debug.print("Main refunded: " # debug_show(Cycles.refunded())); // 5_000_000
    +    Debug.print("Main balance: " # debug_show(Cycles.balance())); // decreased by around 10_000_000
    +  };
    +
    +  func operation() : async() {
    +    Debug.print("Operation balance: " # debug_show(Cycles.balance()));
    +    Debug.print("Operation available: " # debug_show(Cycles.available()));
    +    let obtained = Cycles.accept(10_000_000);
    +    Debug.print("Operation obtained: " # debug_show(obtained)); // => 10_000_000
    +    Debug.print("Operation balance: " # debug_show(Cycles.balance())); // increased by 10_000_000
    +    Debug.print("Operation available: " # debug_show(Cycles.available())); // decreased by 10_000_000
    +  }
    +}
  • ExperimentalInternetComputer

    Low-level interface to the Internet Computer.

    +

    WARNING: This low-level API is experimental and likely to change or even disappear.

    +
  • ExperimentalStableMemory

    Byte-level access to (virtual) stable memory.

    +

    WARNING: As its name suggests, this library is experimental, subject to change +and may be replaced by safer alternatives in later versions of Motoko. +Use at your own risk and discretion.

    +

    This is a lightweight abstraction over IC stable memory and supports persisting +raw binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API.

    +

    Memory is allocated, using grow(pages), sequentially and on demand, in units of 64KiB pages, starting with 0 allocated pages. +New pages are zero initialized. +Growth is capped by a soft limit on page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

    +

    Each load operation loads from byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current stable memory size.

    +

    Each store operation stores to byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current stable memory size.

    +

    Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

    +

    The current page allocation and page contents is preserved across upgrades.

    +

    NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +page size reported by Motoko function size(). +This (and the cap on growth) are to accommodate Motoko's stable variables. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 48Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

    +

    Usage:

    +
    motoko no-repl
    +import StableMemory "mo:base/ExperimentalStableMemory";
  • Float

    Double precision (64-bit) floating-point numbers in IEEE 754 representation.

    +

    This module contains common floating-point constants and utility functions.

    +

    Notation for special values in the documentation below: ++inf: Positive infinity +-inf: Negative infinity +NaN: "not a number" (can have different sign bit values, but NaN != NaN regardless of the sign).

    +

    Note: +Floating point numbers have limited precision and operations may inherently result in numerical errors.

    +

    Examples of numerical errors:

    +
      0.1 + 0.1 + 0.1 == 0.3 // => false
    +  
    + +
     1e16 + 1.0 != 1e16 // => false
    +  
    + +

    (and many more cases)

    +

    Advice:

    +
    • Floating point number comparisons by == or != are discouraged. Instead, it is better to compare + floating-point numbers with a numerical tolerance, called epsilon.
    + +

    Example:

    +
      import Float "mo:base/Float";
    +  let x = 0.1 + 0.1 + 0.1;
    +  let y = 0.3;
    +
    +  let epsilon = 1e-6; // This depends on the application case (needs a numerical error analysis).
    +  Float.equalWithin(x, y, epsilon) // => true
    +  
    + +
    • For absolute precision, it is recommened to encode the fraction number as a pair of a Nat for the base + and a Nat for the exponent (decimal point).
  • Func

    Functions on functions, creating functions from simpler inputs.

    +

    (Most commonly used when programming in functional style using higher-order +functions.)

    +
  • Hash

    Hash values

    +
  • HashMap

    Class HashMap<K, V> provides a hashmap from keys of type K to values of type V. +The class is parameterized by the key's equality and hash functions, +and an initial capacity. However, the underlying allocation happens only when +the first key-value entry is inserted.

    +

    Internally, the map is represented as an array of AssocList (buckets). +The growth policy of the underyling array is very simple, for now: double +the current capacity when the expected bucket list size grows beyond a +certain constant.

    +

    WARNING: Certain operations are amortized O(1) time, such as put, but run +in worst case O(size) time. These worst case runtimes may exceed the cycles limit +per message if the size of the map is large enough. Further, this runtime analysis +assumes that the hash functions uniformly maps keys over the hash space. Grow these structures +with discretion, and with good hash functions. All amortized operations +below also list the worst case runtime.

    +

    For maps without amortization, see TrieMap.

    +

    Note on the constructor: +The argument initCapacity determines the initial number of buckets in the +underyling array. Also, the runtime and space anlyses in this documentation +assumes that the equality and hash functions for keys used to construct the +map run in O(1) time and space.

    +

    Example:

    +
    motoko name=initialize
    +import HashMap "mo:base/HashMap";
    +import Text "mo:base/Text";
    +
    +let map = HashMap.HashMap<Text, Nat>(5, Text.equal, Text.hash);
    + +

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Heap

    Class Heap<X> provides a priority queue of elements of type X.

    +

    The class wraps a purely-functional implementation based on a leftist heap.

    +

    Note on the constructor: +The constructor takes in a comparison function compare that defines the +ordering between elements of type X. Most primitive types have a default +version of this comparison function defined in their modules (e.g. Nat.compare). +The runtime analysis in this documentation assumes that the compare function +runs in O(1) time and space.

    +

    Example:

    +
    motoko name=initialize
    +import Heap "mo:base/Heap";
    +import Text "mo:base/Text";
    +
    +let heap = Heap.Heap<Text>(Text.compare);
    + +

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Int

    Signed integer numbers with infinite precision (also called big integers).

    +

    Most operations on integer numbers (e.g. addition) are available as built-in operators (e.g. -1 + 1). +This module provides equivalent functions and Text conversion.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int "mo:base/Int";
  • Int16

    16-bit signed integers with checked arithmetic.

    +

    Common 16-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Int32

    32-bit signed integers with checked arithmetic.

    +

    Common 32-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Int64

    64-bit signed integers with checked arithmetic.

    +

    Common 64-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Int8

    8-bit signed integers with checked arithmetic.

    +

    Common 8-bit integer functions. +Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Iter

    Iterators

    +
  • IterType

    The Iterator type

    +
  • List

    Purely-functional, singly-linked lists. +A list of type List<T> is either null or an optional pair of a value of type T and a tail, itself of type List<T>.

    +

    To use this library, import it using:

    +
    motoko name=initialize
    +import List "mo:base/List";
  • Nat

    Natural numbers with infinite precision.

    +

    Most operations on natural numbers (e.g. addition) are available as built-in operators (e.g. 1 + 1). +This module provides equivalent functions and Text conversion.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat "mo:base/Nat";
  • Nat16

    16-bit unsigned integers with checked arithmetic

    +

    Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Nat32

    32-bit unsigned integers with checked arithmetic

    +

    Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Nat64

    64-bit unsigned integers with checked arithmetic

    +

    Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • Nat8

    8-bit unsigned integers with checked arithmetic

    +

    Most operations are available as built-in operators (e.g. 1 + 1).

    +
  • None

    The absent value

    +

    The None type represents a type with no value.

    +

    It is often used to type code that fails to return control (e.g. an infinite loop) +or to designate impossible values (e.g. the type ?None only contains null).

    +
  • Option

    Typesafe nulls

    +

    Optional values can be seen as a typesafe null. A value of type ?Int can +be constructed with either null or ?42. The simplest way to get at the +contents of an optional is to use pattern matching:

    +
    let optionalInt1 : ?Int = ?42;
    +let optionalInt2 : ?Int = null;
    +
    +let int1orZero : Int = switch optionalInt1 {
    +  case null 0;
    +  case (?int) int;
    +};
    +assert int1orZero == 42;
    +
    +let int2orZero : Int = switch optionalInt2 {
    +  case null 0;
    +  case (?int) int;
    +};
    +assert int2orZero == 0;
    + +

    The functions in this module capture some common operations when working +with optionals that can be more succinct than using pattern matching.

    +
  • Order

    Order

    +
  • Prelude

    General utilities

    +

    This prelude file proposes standard library features that may +belong in the language (compiler-internal) prelude sometime, after +some further experience and discussion. Until then, they live here.

    +
  • Principal

    Module for interacting with Principals (users and canisters).

    +

    Principals are used to identify entities that can interact with the Internet +Computer. These entities are either users or canisters.

    +

    Example textual representation of Principals:

    +

    un4fu-tqaaa-aaaab-qadjq-cai

    +

    In Motoko, there is a primitive Principal type called Principal. As an example +of where you might see Principals, you can access the Principal of the +caller of your shared function.

    +
    motoko no-repl
    +shared(msg) func foo() {
    +  let caller : Principal = msg.caller;
    +};
    + +

    Then, you can use this module to work with the Principal.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Principal "mo:base/Principal";
  • RBTree

    Key-value map implemented as a red-black tree (RBTree) with nodes storing key-value pairs.

    +

    A red-black tree is a balanced binary search tree ordered by the keys.

    +

    The tree data structure internally colors each of its nodes either red or black, +and uses this information to balance the tree during the modifying operations.

    +

    Creation: +Instantiate class RBTree<K, V> that provides a map from keys of type K to values of type V.

    +

    Example:

    +
    import RBTree "mo:base/RBTree";
    +import Nat "mo:base/Nat";
    +import Debug "mo:base/Debug";
    +
    +let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a new red-black tree mapping Nat to Text
    +tree.put(1, "one");
    +tree.put(2, "two");
    +tree.put(3, "tree");
    +for (entry in tree.entries()) {
    +  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
    +}
    + +

    Performance:

    +
    • Runtime: O(log(n)) worst case cost per insertion, removal, and retrieval operation.
    • Space: O(n) for storing the entire tree. +n denotes the number of key-value entries (i.e. nodes) stored in the tree.
    + +

    Note:

    +
    • Tree operations, such as retrieval, insertion, and removal create O(log(n)) temporary objects that become garbage.
    + +

    Credits:

    +

    The core of this implementation is derived from:

    +
  • Random

    A module for obtaining randomness on the Internet Computer (IC).

    +

    This module provides the fundamentals for user abstractions to build on.

    +

    Dealing with randomness on a deterministic computing platform, such +as the IC, is intricate. Some basic rules need to be followed by the +user of this module to obtain (and maintain) the benefits of crypto- +graphic randomness:

    +
    • cryptographic entropy (randomness source) is only obtainable + asyncronously in discrete chunks of 256 bits (32-byte sized Blobs)
    • all bets must be closed before entropy is being asked for in + order to decide them
    • this implies that the same entropy (i.e. Blob) - or surplus entropy + not utilised yet - cannot be used for a new round of bets without + losing the cryptographic guarantees.
    + +

    Concretely, the below class Finite, as well as the +*From methods risk the carrying-over of state from previous rounds. +These are provided for performance (and convenience) reasons, and need +special care when used. Similar caveats apply for user-defined (pseudo) +random number generators.

    +

    Usage:

    +
    motoko no-repl
    +import Random "mo:base/Random";
  • Result

    Error handling with the Result type.

    +
  • Stack

    Class Stack<X> provides a Minimal LIFO stack of elements of type X.

    +

    See library Deque for mixed LIFO/FIFO behavior.

    +

    Example:

    +
    motoko name=initialize
    +import Stack "mo:base/Stack";
    +
    +let stack = Stack.Stack<Nat>(); // create a stack

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Text

    Utility functions for Text values.

    +

    A Text value represents human-readable text as a sequence of characters of type Char.

    +
    let text = "Hello!";
    +let size = text.size(); // 6
    +let iter = text.chars(); // iterator ('H', 'e', 'l', 'l', 'o', '!')
    +let concat = text # " 👋"; // "Hello! 👋"
    + +

    The "mo:base/Text" module defines additional operations on Text values.

    +

    Import the module from the base library:

    +
    motoko name=import
    +import Text "mo:base/Text";
    + +

    Note: Text values are represented as ropes of UTF-8 character sequences with O(1) concatenation.

    +
  • Time

    System time

    +
  • Timer

    Timers for one-off or periodic tasks.

    +

    Note: If moc is invoked with -no-timer, the importing will fail. +Note: The resolution of the timers is in the order of the block rate,

    +
      so durations should be chosen well above that. For frequent
    +  canister wake-ups the heatbeat mechanism should be considered.
  • Trie

    Functional key-value hash maps.

    +

    Functional maps (and sets) whose representation is "canonical", and +independent of operation history (unlike other popular search trees).

    +

    The representation we use here comes from Section 6 of "Incremental computation via function caching", Pugh & Teitelbaum.

    +

    User's overview

    + +

    This module provides an applicative (functional) hash map. +Notably, each put produces a new trie and value being replaced, if any.

    +

    Those looking for a more familiar (imperative, +object-oriented) hash map should consider TrieMap or HashMap instead.

    +

    The basic Trie operations consist of:

    +
    • put - put a key-value into the trie, producing a new version.
    • get - get a key's value from the trie, or null if none.
    • remove - remove a key's value from the trie
    • iter - visit every key-value in the trie.
    + +

    The put, get and remove operations work over Key records, +which group the hash of the key with its non-hash key value.

    +

    Example:

    +
    import Trie "mo:base/Trie";
    +import Text "mo:base/Text";
    +
    +// we do this to have shorter type names and thus
    +// better readibility
    +type Trie<K, V> = Trie.Trie<K, V>;
    +type Key<K> = Trie.Key<K>;
    +
    +// we have to provide `put`, `get` and `remove` with
    +// a record of type `Key<K> = { hash : Hash.Hash; key : K }`;
    +// thus we define the following function that takes a value of type `K`
    +// (in this case `Text`) and returns a `Key<K>` record.
    +func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
    +
    +// we start off by creating an empty `Trie`
    +let t0 : Trie<Text, Nat> = Trie.empty();
    +
    +// `put` requires 4 arguments:
    +// - the trie we want to insert the value into,
    +// - the key of the value we want to insert (note that we use the `key` function defined above),
    +// - a function that checks for equality of keys, and
    +// - the value we want to insert.
    +//
    +// When inserting a value, `put` returns a tuple of type `(Trie<K, V>, ?V)`.
    +// to get the new trie that contains the value,  we use the `0` projection
    +// and assign it to `t1` and `t2` respectively.
    +let t1 : Trie<Text, Nat> = Trie.put(t0, key "hello", Text.equal, 42).0;
    +let t2 : Trie<Text, Nat> = Trie.put(t1, key "world", Text.equal, 24).0;
    +
    +// If for a given key there already was a value in the trie, `put` returns
    +// that previous value as the second element of the tuple.
    +// in our case we have already inserted the value 42 for the key "hello", so
    +// `put` returns 42 as the second element of the tuple.
    +let (t3, n) : (Trie<Text, Nat>, ?Nat) = Trie.put(
    +  t2,
    +  key "hello",
    +  Text.equal,
    +  0,
    +);
    +assert (n == ?42);
    +
    +// `get` requires 3 arguments:
    +// - the trie we want to get the value from
    +// - the key of the value we want to get (note that we use the `key` function defined above)
    +// - a function that checks for equality of keys
    +//
    +// If the given key is nonexistent in the trie, `get` returns `null`.
    +var value = Trie.get(t3, key "hello", Text.equal); // Returns `?42`
    +assert(value == ?0);
    +value := Trie.get(t3, key "universe", Text.equal); // Returns `null`
    +assert(value == null);
    +
    +// `remove` requires 3 arguments:
    +// - the trie we want to remove the value from,
    +// - the key of the value we want to remove (note that we use the `key` function defined above), and
    +// - a function that checks for equality of keys.
    +//
    +// In the case of keys of type `Text`, we can use `Text.equal`
    +// to check for equality of keys. Function `remove` returns a tuple of type `(Trie<K, V>, ?V)`.
    +// where the second element of the tuple is the value that was removed, or `null` if
    +// there was no value for the given key.
    +let removedValue : ?Nat = Trie.remove(
    +  t3,
    +  key "hello",
    +  Text.equal,
    +).1;
    +assert (removedValue == ?0);
    +
    +// To iterate over the Trie, we use the `iter` function that takes a trie
    +// of type `Trie<K,V>` and returns an iterator of type `Iter<(K,V)>`:
    +var sum : Nat = 0;
    +for (kv in Trie.iter(t3)) {
    +  sum += kv.1;
    +};
    +assert(sum == 24);
  • TrieMap

    Class TrieMap<K, V> provides a map from keys of type K to values of type V. +The class wraps and manipulates an underyling hash trie, found in the Trie +module. The trie is a binary tree in which the position of elements in the +tree are determined using the hash of the elements.

    +

    Note: The class TrieMap exposes the same interface as HashMap.

    +

    Creating a map: +The equality function is used to compare keys, and the hash function is used +to hash keys. See the example below.

    +
    motoko name=initialize
    +import TrieMap "mo:base/TrieMap";
    +import Nat "mo:base/Nat";
    +import Hash "mo:base/Hash";
    +import Iter "mo:base/Iter";
    +
    +let map = TrieMap.TrieMap<Nat, Nat>(Nat.equal, Hash.hash)
  • TrieSet

    Functional set

    +

    Sets are partial maps from element type to unit type, +i.e., the partial map represents the set with its domain.

    +
\ No newline at end of file diff --git a/base-doc/nix-support/hydra-build-products b/base-doc/nix-support/hydra-build-products new file mode 100644 index 00000000000..8313cd9a300 --- /dev/null +++ b/base-doc/nix-support/hydra-build-products @@ -0,0 +1 @@ +report docs /nix/store/85iahvzzl5vk2chkzq357i6k35v70vas-base-doc index.html diff --git a/base-doc/styles.css b/base-doc/styles.css new file mode 100644 index 00000000000..65732bf1dbb --- /dev/null +++ b/base-doc/styles.css @@ -0,0 +1,162 @@ + +* { + box-sizing: border-box; +} + +body { + background: #fff; + color: #222; + font-family: Circular Std, sans-serif; + line-height: 1.15; + -webkit-font-smoothing: antialiased; + margin: 0; + font-size: 1.0625rem; +} + +.keyword { + color: #264059; +} + +.type { + color: #ad448e; +} + +.parameter { + color: #264059; +} + +.classname { + color: #2c8093; +} + +.fnname { + color: #9a6e31; +} + +.sidebar { + width: 200px; + position: fixed; + left: 0; + top: 0; + bottom: 0; + overflow: auto; + + background-color: #F1F1F1; +} + +.documentation { + margin-left: 230px; + max-width: 960px; +} + +.sidebar > ul { + margin: 0 10px; + padding: 0; + list-style: none; +} + +.sidebar a { + display: block; + text-overflow: ellipsis; + overflow: hidden; + line-height: 15px; + padding: 7px 5px; + font-size: 14px; + font-weight: 400; + transition: border 500ms ease-out; + color: #000; + text-decoration: none; +} + +.sidebar h3 { + border-bottom: 1px #dddddd solid; + font-weight: 500; + margin: 20px 0 15px 0; + padding-bottom: 6px; + text-align: center; +} + +.declaration { + border-bottom: 1px solid #f0f0f0; +} +.declaration:last-of-type { + border-bottom: none; +} + +.declaration :last-child { + border: none; +} + +h1 { + font-weight: 500; + padding-bottom: 6px; + border-bottom: 1px #D5D5D5 dashed; +} + +h4.function-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.value-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.type-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.class-declaration { + font-weight: 600; + margin-top: 16px; +} + +.class-declaration ~ div { + margin-left: 20px; +} + +.index-container { + display: flex; + flex-direction: column; + align-items: center; + font-size: 1.2rem; +} + +.index-header { + font-weight: 400; +} + +.index-listing { + padding: 0; + list-style: none; + max-width: 960px; +} + +.index-item { + margin-bottom: 5px; +} + +.index-item-link { + text-decoration: none; + font-weight: 400; +} + +.index-item-link::after { + content: " \2014\00A0"; +} + +.index-item-comment { + display: inline; +} + +.index-item-comment > * { + display: none; +} + +.index-item-comment > *:first-child { + display: inline; + white-space: nowrap; +} + diff --git a/coverage/codegen/compile.ml.html b/coverage/codegen/compile.ml.html new file mode 100644 index 00000000000..9b55db19893 --- /dev/null +++ b/coverage/codegen/compile.ml.html @@ -0,0 +1,34258 @@ + + + + + compile.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+   10
+   11
+   12
+   13
+   14
+   15
+   16
+   17
+   18
+   19
+   20
+   21
+   22
+   23
+   24
+   25
+   26
+   27
+   28
+   29
+   30
+   31
+   32
+   33
+   34
+   35
+   36
+   37
+   38
+   39
+   40
+   41
+   42
+   43
+   44
+   45
+   46
+   47
+   48
+   49
+   50
+   51
+   52
+   53
+   54
+   55
+   56
+   57
+   58
+   59
+   60
+   61
+   62
+   63
+   64
+   65
+   66
+   67
+   68
+   69
+   70
+   71
+   72
+   73
+   74
+   75
+   76
+   77
+   78
+   79
+   80
+   81
+   82
+   83
+   84
+   85
+   86
+   87
+   88
+   89
+   90
+   91
+   92
+   93
+   94
+   95
+   96
+   97
+   98
+   99
+  100
+  101
+  102
+  103
+  104
+  105
+  106
+  107
+  108
+  109
+  110
+  111
+  112
+  113
+  114
+  115
+  116
+  117
+  118
+  119
+  120
+  121
+  122
+  123
+  124
+  125
+  126
+  127
+  128
+  129
+  130
+  131
+  132
+  133
+  134
+  135
+  136
+  137
+  138
+  139
+  140
+  141
+  142
+  143
+  144
+  145
+  146
+  147
+  148
+  149
+  150
+  151
+  152
+  153
+  154
+  155
+  156
+  157
+  158
+  159
+  160
+  161
+  162
+  163
+  164
+  165
+  166
+  167
+  168
+  169
+  170
+  171
+  172
+  173
+  174
+  175
+  176
+  177
+  178
+  179
+  180
+  181
+  182
+  183
+  184
+  185
+  186
+  187
+  188
+  189
+  190
+  191
+  192
+  193
+  194
+  195
+  196
+  197
+  198
+  199
+  200
+  201
+  202
+  203
+  204
+  205
+  206
+  207
+  208
+  209
+  210
+  211
+  212
+  213
+  214
+  215
+  216
+  217
+  218
+  219
+  220
+  221
+  222
+  223
+  224
+  225
+  226
+  227
+  228
+  229
+  230
+  231
+  232
+  233
+  234
+  235
+  236
+  237
+  238
+  239
+  240
+  241
+  242
+  243
+  244
+  245
+  246
+  247
+  248
+  249
+  250
+  251
+  252
+  253
+  254
+  255
+  256
+  257
+  258
+  259
+  260
+  261
+  262
+  263
+  264
+  265
+  266
+  267
+  268
+  269
+  270
+  271
+  272
+  273
+  274
+  275
+  276
+  277
+  278
+  279
+  280
+  281
+  282
+  283
+  284
+  285
+  286
+  287
+  288
+  289
+  290
+  291
+  292
+  293
+  294
+  295
+  296
+  297
+  298
+  299
+  300
+  301
+  302
+  303
+  304
+  305
+  306
+  307
+  308
+  309
+  310
+  311
+  312
+  313
+  314
+  315
+  316
+  317
+  318
+  319
+  320
+  321
+  322
+  323
+  324
+  325
+  326
+  327
+  328
+  329
+  330
+  331
+  332
+  333
+  334
+  335
+  336
+  337
+  338
+  339
+  340
+  341
+  342
+  343
+  344
+  345
+  346
+  347
+  348
+  349
+  350
+  351
+  352
+  353
+  354
+  355
+  356
+  357
+  358
+  359
+  360
+  361
+  362
+  363
+  364
+  365
+  366
+  367
+  368
+  369
+  370
+  371
+  372
+  373
+  374
+  375
+  376
+  377
+  378
+  379
+  380
+  381
+  382
+  383
+  384
+  385
+  386
+  387
+  388
+  389
+  390
+  391
+  392
+  393
+  394
+  395
+  396
+  397
+  398
+  399
+  400
+  401
+  402
+  403
+  404
+  405
+  406
+  407
+  408
+  409
+  410
+  411
+  412
+  413
+  414
+  415
+  416
+  417
+  418
+  419
+  420
+  421
+  422
+  423
+  424
+  425
+  426
+  427
+  428
+  429
+  430
+  431
+  432
+  433
+  434
+  435
+  436
+  437
+  438
+  439
+  440
+  441
+  442
+  443
+  444
+  445
+  446
+  447
+  448
+  449
+  450
+  451
+  452
+  453
+  454
+  455
+  456
+  457
+  458
+  459
+  460
+  461
+  462
+  463
+  464
+  465
+  466
+  467
+  468
+  469
+  470
+  471
+  472
+  473
+  474
+  475
+  476
+  477
+  478
+  479
+  480
+  481
+  482
+  483
+  484
+  485
+  486
+  487
+  488
+  489
+  490
+  491
+  492
+  493
+  494
+  495
+  496
+  497
+  498
+  499
+  500
+  501
+  502
+  503
+  504
+  505
+  506
+  507
+  508
+  509
+  510
+  511
+  512
+  513
+  514
+  515
+  516
+  517
+  518
+  519
+  520
+  521
+  522
+  523
+  524
+  525
+  526
+  527
+  528
+  529
+  530
+  531
+  532
+  533
+  534
+  535
+  536
+  537
+  538
+  539
+  540
+  541
+  542
+  543
+  544
+  545
+  546
+  547
+  548
+  549
+  550
+  551
+  552
+  553
+  554
+  555
+  556
+  557
+  558
+  559
+  560
+  561
+  562
+  563
+  564
+  565
+  566
+  567
+  568
+  569
+  570
+  571
+  572
+  573
+  574
+  575
+  576
+  577
+  578
+  579
+  580
+  581
+  582
+  583
+  584
+  585
+  586
+  587
+  588
+  589
+  590
+  591
+  592
+  593
+  594
+  595
+  596
+  597
+  598
+  599
+  600
+  601
+  602
+  603
+  604
+  605
+  606
+  607
+  608
+  609
+  610
+  611
+  612
+  613
+  614
+  615
+  616
+  617
+  618
+  619
+  620
+  621
+  622
+  623
+  624
+  625
+  626
+  627
+  628
+  629
+  630
+  631
+  632
+  633
+  634
+  635
+  636
+  637
+  638
+  639
+  640
+  641
+  642
+  643
+  644
+  645
+  646
+  647
+  648
+  649
+  650
+  651
+  652
+  653
+  654
+  655
+  656
+  657
+  658
+  659
+  660
+  661
+  662
+  663
+  664
+  665
+  666
+  667
+  668
+  669
+  670
+  671
+  672
+  673
+  674
+  675
+  676
+  677
+  678
+  679
+  680
+  681
+  682
+  683
+  684
+  685
+  686
+  687
+  688
+  689
+  690
+  691
+  692
+  693
+  694
+  695
+  696
+  697
+  698
+  699
+  700
+  701
+  702
+  703
+  704
+  705
+  706
+  707
+  708
+  709
+  710
+  711
+  712
+  713
+  714
+  715
+  716
+  717
+  718
+  719
+  720
+  721
+  722
+  723
+  724
+  725
+  726
+  727
+  728
+  729
+  730
+  731
+  732
+  733
+  734
+  735
+  736
+  737
+  738
+  739
+  740
+  741
+  742
+  743
+  744
+  745
+  746
+  747
+  748
+  749
+  750
+  751
+  752
+  753
+  754
+  755
+  756
+  757
+  758
+  759
+  760
+  761
+  762
+  763
+  764
+  765
+  766
+  767
+  768
+  769
+  770
+  771
+  772
+  773
+  774
+  775
+  776
+  777
+  778
+  779
+  780
+  781
+  782
+  783
+  784
+  785
+  786
+  787
+  788
+  789
+  790
+  791
+  792
+  793
+  794
+  795
+  796
+  797
+  798
+  799
+  800
+  801
+  802
+  803
+  804
+  805
+  806
+  807
+  808
+  809
+  810
+  811
+  812
+  813
+  814
+  815
+  816
+  817
+  818
+  819
+  820
+  821
+  822
+  823
+  824
+  825
+  826
+  827
+  828
+  829
+  830
+  831
+  832
+  833
+  834
+  835
+  836
+  837
+  838
+  839
+  840
+  841
+  842
+  843
+  844
+  845
+  846
+  847
+  848
+  849
+  850
+  851
+  852
+  853
+  854
+  855
+  856
+  857
+  858
+  859
+  860
+  861
+  862
+  863
+  864
+  865
+  866
+  867
+  868
+  869
+  870
+  871
+  872
+  873
+  874
+  875
+  876
+  877
+  878
+  879
+  880
+  881
+  882
+  883
+  884
+  885
+  886
+  887
+  888
+  889
+  890
+  891
+  892
+  893
+  894
+  895
+  896
+  897
+  898
+  899
+  900
+  901
+  902
+  903
+  904
+  905
+  906
+  907
+  908
+  909
+  910
+  911
+  912
+  913
+  914
+  915
+  916
+  917
+  918
+  919
+  920
+  921
+  922
+  923
+  924
+  925
+  926
+  927
+  928
+  929
+  930
+  931
+  932
+  933
+  934
+  935
+  936
+  937
+  938
+  939
+  940
+  941
+  942
+  943
+  944
+  945
+  946
+  947
+  948
+  949
+  950
+  951
+  952
+  953
+  954
+  955
+  956
+  957
+  958
+  959
+  960
+  961
+  962
+  963
+  964
+  965
+  966
+  967
+  968
+  969
+  970
+  971
+  972
+  973
+  974
+  975
+  976
+  977
+  978
+  979
+  980
+  981
+  982
+  983
+  984
+  985
+  986
+  987
+  988
+  989
+  990
+  991
+  992
+  993
+  994
+  995
+  996
+  997
+  998
+  999
+ 1000
+ 1001
+ 1002
+ 1003
+ 1004
+ 1005
+ 1006
+ 1007
+ 1008
+ 1009
+ 1010
+ 1011
+ 1012
+ 1013
+ 1014
+ 1015
+ 1016
+ 1017
+ 1018
+ 1019
+ 1020
+ 1021
+ 1022
+ 1023
+ 1024
+ 1025
+ 1026
+ 1027
+ 1028
+ 1029
+ 1030
+ 1031
+ 1032
+ 1033
+ 1034
+ 1035
+ 1036
+ 1037
+ 1038
+ 1039
+ 1040
+ 1041
+ 1042
+ 1043
+ 1044
+ 1045
+ 1046
+ 1047
+ 1048
+ 1049
+ 1050
+ 1051
+ 1052
+ 1053
+ 1054
+ 1055
+ 1056
+ 1057
+ 1058
+ 1059
+ 1060
+ 1061
+ 1062
+ 1063
+ 1064
+ 1065
+ 1066
+ 1067
+ 1068
+ 1069
+ 1070
+ 1071
+ 1072
+ 1073
+ 1074
+ 1075
+ 1076
+ 1077
+ 1078
+ 1079
+ 1080
+ 1081
+ 1082
+ 1083
+ 1084
+ 1085
+ 1086
+ 1087
+ 1088
+ 1089
+ 1090
+ 1091
+ 1092
+ 1093
+ 1094
+ 1095
+ 1096
+ 1097
+ 1098
+ 1099
+ 1100
+ 1101
+ 1102
+ 1103
+ 1104
+ 1105
+ 1106
+ 1107
+ 1108
+ 1109
+ 1110
+ 1111
+ 1112
+ 1113
+ 1114
+ 1115
+ 1116
+ 1117
+ 1118
+ 1119
+ 1120
+ 1121
+ 1122
+ 1123
+ 1124
+ 1125
+ 1126
+ 1127
+ 1128
+ 1129
+ 1130
+ 1131
+ 1132
+ 1133
+ 1134
+ 1135
+ 1136
+ 1137
+ 1138
+ 1139
+ 1140
+ 1141
+ 1142
+ 1143
+ 1144
+ 1145
+ 1146
+ 1147
+ 1148
+ 1149
+ 1150
+ 1151
+ 1152
+ 1153
+ 1154
+ 1155
+ 1156
+ 1157
+ 1158
+ 1159
+ 1160
+ 1161
+ 1162
+ 1163
+ 1164
+ 1165
+ 1166
+ 1167
+ 1168
+ 1169
+ 1170
+ 1171
+ 1172
+ 1173
+ 1174
+ 1175
+ 1176
+ 1177
+ 1178
+ 1179
+ 1180
+ 1181
+ 1182
+ 1183
+ 1184
+ 1185
+ 1186
+ 1187
+ 1188
+ 1189
+ 1190
+ 1191
+ 1192
+ 1193
+ 1194
+ 1195
+ 1196
+ 1197
+ 1198
+ 1199
+ 1200
+ 1201
+ 1202
+ 1203
+ 1204
+ 1205
+ 1206
+ 1207
+ 1208
+ 1209
+ 1210
+ 1211
+ 1212
+ 1213
+ 1214
+ 1215
+ 1216
+ 1217
+ 1218
+ 1219
+ 1220
+ 1221
+ 1222
+ 1223
+ 1224
+ 1225
+ 1226
+ 1227
+ 1228
+ 1229
+ 1230
+ 1231
+ 1232
+ 1233
+ 1234
+ 1235
+ 1236
+ 1237
+ 1238
+ 1239
+ 1240
+ 1241
+ 1242
+ 1243
+ 1244
+ 1245
+ 1246
+ 1247
+ 1248
+ 1249
+ 1250
+ 1251
+ 1252
+ 1253
+ 1254
+ 1255
+ 1256
+ 1257
+ 1258
+ 1259
+ 1260
+ 1261
+ 1262
+ 1263
+ 1264
+ 1265
+ 1266
+ 1267
+ 1268
+ 1269
+ 1270
+ 1271
+ 1272
+ 1273
+ 1274
+ 1275
+ 1276
+ 1277
+ 1278
+ 1279
+ 1280
+ 1281
+ 1282
+ 1283
+ 1284
+ 1285
+ 1286
+ 1287
+ 1288
+ 1289
+ 1290
+ 1291
+ 1292
+ 1293
+ 1294
+ 1295
+ 1296
+ 1297
+ 1298
+ 1299
+ 1300
+ 1301
+ 1302
+ 1303
+ 1304
+ 1305
+ 1306
+ 1307
+ 1308
+ 1309
+ 1310
+ 1311
+ 1312
+ 1313
+ 1314
+ 1315
+ 1316
+ 1317
+ 1318
+ 1319
+ 1320
+ 1321
+ 1322
+ 1323
+ 1324
+ 1325
+ 1326
+ 1327
+ 1328
+ 1329
+ 1330
+ 1331
+ 1332
+ 1333
+ 1334
+ 1335
+ 1336
+ 1337
+ 1338
+ 1339
+ 1340
+ 1341
+ 1342
+ 1343
+ 1344
+ 1345
+ 1346
+ 1347
+ 1348
+ 1349
+ 1350
+ 1351
+ 1352
+ 1353
+ 1354
+ 1355
+ 1356
+ 1357
+ 1358
+ 1359
+ 1360
+ 1361
+ 1362
+ 1363
+ 1364
+ 1365
+ 1366
+ 1367
+ 1368
+ 1369
+ 1370
+ 1371
+ 1372
+ 1373
+ 1374
+ 1375
+ 1376
+ 1377
+ 1378
+ 1379
+ 1380
+ 1381
+ 1382
+ 1383
+ 1384
+ 1385
+ 1386
+ 1387
+ 1388
+ 1389
+ 1390
+ 1391
+ 1392
+ 1393
+ 1394
+ 1395
+ 1396
+ 1397
+ 1398
+ 1399
+ 1400
+ 1401
+ 1402
+ 1403
+ 1404
+ 1405
+ 1406
+ 1407
+ 1408
+ 1409
+ 1410
+ 1411
+ 1412
+ 1413
+ 1414
+ 1415
+ 1416
+ 1417
+ 1418
+ 1419
+ 1420
+ 1421
+ 1422
+ 1423
+ 1424
+ 1425
+ 1426
+ 1427
+ 1428
+ 1429
+ 1430
+ 1431
+ 1432
+ 1433
+ 1434
+ 1435
+ 1436
+ 1437
+ 1438
+ 1439
+ 1440
+ 1441
+ 1442
+ 1443
+ 1444
+ 1445
+ 1446
+ 1447
+ 1448
+ 1449
+ 1450
+ 1451
+ 1452
+ 1453
+ 1454
+ 1455
+ 1456
+ 1457
+ 1458
+ 1459
+ 1460
+ 1461
+ 1462
+ 1463
+ 1464
+ 1465
+ 1466
+ 1467
+ 1468
+ 1469
+ 1470
+ 1471
+ 1472
+ 1473
+ 1474
+ 1475
+ 1476
+ 1477
+ 1478
+ 1479
+ 1480
+ 1481
+ 1482
+ 1483
+ 1484
+ 1485
+ 1486
+ 1487
+ 1488
+ 1489
+ 1490
+ 1491
+ 1492
+ 1493
+ 1494
+ 1495
+ 1496
+ 1497
+ 1498
+ 1499
+ 1500
+ 1501
+ 1502
+ 1503
+ 1504
+ 1505
+ 1506
+ 1507
+ 1508
+ 1509
+ 1510
+ 1511
+ 1512
+ 1513
+ 1514
+ 1515
+ 1516
+ 1517
+ 1518
+ 1519
+ 1520
+ 1521
+ 1522
+ 1523
+ 1524
+ 1525
+ 1526
+ 1527
+ 1528
+ 1529
+ 1530
+ 1531
+ 1532
+ 1533
+ 1534
+ 1535
+ 1536
+ 1537
+ 1538
+ 1539
+ 1540
+ 1541
+ 1542
+ 1543
+ 1544
+ 1545
+ 1546
+ 1547
+ 1548
+ 1549
+ 1550
+ 1551
+ 1552
+ 1553
+ 1554
+ 1555
+ 1556
+ 1557
+ 1558
+ 1559
+ 1560
+ 1561
+ 1562
+ 1563
+ 1564
+ 1565
+ 1566
+ 1567
+ 1568
+ 1569
+ 1570
+ 1571
+ 1572
+ 1573
+ 1574
+ 1575
+ 1576
+ 1577
+ 1578
+ 1579
+ 1580
+ 1581
+ 1582
+ 1583
+ 1584
+ 1585
+ 1586
+ 1587
+ 1588
+ 1589
+ 1590
+ 1591
+ 1592
+ 1593
+ 1594
+ 1595
+ 1596
+ 1597
+ 1598
+ 1599
+ 1600
+ 1601
+ 1602
+ 1603
+ 1604
+ 1605
+ 1606
+ 1607
+ 1608
+ 1609
+ 1610
+ 1611
+ 1612
+ 1613
+ 1614
+ 1615
+ 1616
+ 1617
+ 1618
+ 1619
+ 1620
+ 1621
+ 1622
+ 1623
+ 1624
+ 1625
+ 1626
+ 1627
+ 1628
+ 1629
+ 1630
+ 1631
+ 1632
+ 1633
+ 1634
+ 1635
+ 1636
+ 1637
+ 1638
+ 1639
+ 1640
+ 1641
+ 1642
+ 1643
+ 1644
+ 1645
+ 1646
+ 1647
+ 1648
+ 1649
+ 1650
+ 1651
+ 1652
+ 1653
+ 1654
+ 1655
+ 1656
+ 1657
+ 1658
+ 1659
+ 1660
+ 1661
+ 1662
+ 1663
+ 1664
+ 1665
+ 1666
+ 1667
+ 1668
+ 1669
+ 1670
+ 1671
+ 1672
+ 1673
+ 1674
+ 1675
+ 1676
+ 1677
+ 1678
+ 1679
+ 1680
+ 1681
+ 1682
+ 1683
+ 1684
+ 1685
+ 1686
+ 1687
+ 1688
+ 1689
+ 1690
+ 1691
+ 1692
+ 1693
+ 1694
+ 1695
+ 1696
+ 1697
+ 1698
+ 1699
+ 1700
+ 1701
+ 1702
+ 1703
+ 1704
+ 1705
+ 1706
+ 1707
+ 1708
+ 1709
+ 1710
+ 1711
+ 1712
+ 1713
+ 1714
+ 1715
+ 1716
+ 1717
+ 1718
+ 1719
+ 1720
+ 1721
+ 1722
+ 1723
+ 1724
+ 1725
+ 1726
+ 1727
+ 1728
+ 1729
+ 1730
+ 1731
+ 1732
+ 1733
+ 1734
+ 1735
+ 1736
+ 1737
+ 1738
+ 1739
+ 1740
+ 1741
+ 1742
+ 1743
+ 1744
+ 1745
+ 1746
+ 1747
+ 1748
+ 1749
+ 1750
+ 1751
+ 1752
+ 1753
+ 1754
+ 1755
+ 1756
+ 1757
+ 1758
+ 1759
+ 1760
+ 1761
+ 1762
+ 1763
+ 1764
+ 1765
+ 1766
+ 1767
+ 1768
+ 1769
+ 1770
+ 1771
+ 1772
+ 1773
+ 1774
+ 1775
+ 1776
+ 1777
+ 1778
+ 1779
+ 1780
+ 1781
+ 1782
+ 1783
+ 1784
+ 1785
+ 1786
+ 1787
+ 1788
+ 1789
+ 1790
+ 1791
+ 1792
+ 1793
+ 1794
+ 1795
+ 1796
+ 1797
+ 1798
+ 1799
+ 1800
+ 1801
+ 1802
+ 1803
+ 1804
+ 1805
+ 1806
+ 1807
+ 1808
+ 1809
+ 1810
+ 1811
+ 1812
+ 1813
+ 1814
+ 1815
+ 1816
+ 1817
+ 1818
+ 1819
+ 1820
+ 1821
+ 1822
+ 1823
+ 1824
+ 1825
+ 1826
+ 1827
+ 1828
+ 1829
+ 1830
+ 1831
+ 1832
+ 1833
+ 1834
+ 1835
+ 1836
+ 1837
+ 1838
+ 1839
+ 1840
+ 1841
+ 1842
+ 1843
+ 1844
+ 1845
+ 1846
+ 1847
+ 1848
+ 1849
+ 1850
+ 1851
+ 1852
+ 1853
+ 1854
+ 1855
+ 1856
+ 1857
+ 1858
+ 1859
+ 1860
+ 1861
+ 1862
+ 1863
+ 1864
+ 1865
+ 1866
+ 1867
+ 1868
+ 1869
+ 1870
+ 1871
+ 1872
+ 1873
+ 1874
+ 1875
+ 1876
+ 1877
+ 1878
+ 1879
+ 1880
+ 1881
+ 1882
+ 1883
+ 1884
+ 1885
+ 1886
+ 1887
+ 1888
+ 1889
+ 1890
+ 1891
+ 1892
+ 1893
+ 1894
+ 1895
+ 1896
+ 1897
+ 1898
+ 1899
+ 1900
+ 1901
+ 1902
+ 1903
+ 1904
+ 1905
+ 1906
+ 1907
+ 1908
+ 1909
+ 1910
+ 1911
+ 1912
+ 1913
+ 1914
+ 1915
+ 1916
+ 1917
+ 1918
+ 1919
+ 1920
+ 1921
+ 1922
+ 1923
+ 1924
+ 1925
+ 1926
+ 1927
+ 1928
+ 1929
+ 1930
+ 1931
+ 1932
+ 1933
+ 1934
+ 1935
+ 1936
+ 1937
+ 1938
+ 1939
+ 1940
+ 1941
+ 1942
+ 1943
+ 1944
+ 1945
+ 1946
+ 1947
+ 1948
+ 1949
+ 1950
+ 1951
+ 1952
+ 1953
+ 1954
+ 1955
+ 1956
+ 1957
+ 1958
+ 1959
+ 1960
+ 1961
+ 1962
+ 1963
+ 1964
+ 1965
+ 1966
+ 1967
+ 1968
+ 1969
+ 1970
+ 1971
+ 1972
+ 1973
+ 1974
+ 1975
+ 1976
+ 1977
+ 1978
+ 1979
+ 1980
+ 1981
+ 1982
+ 1983
+ 1984
+ 1985
+ 1986
+ 1987
+ 1988
+ 1989
+ 1990
+ 1991
+ 1992
+ 1993
+ 1994
+ 1995
+ 1996
+ 1997
+ 1998
+ 1999
+ 2000
+ 2001
+ 2002
+ 2003
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023
+ 2024
+ 2025
+ 2026
+ 2027
+ 2028
+ 2029
+ 2030
+ 2031
+ 2032
+ 2033
+ 2034
+ 2035
+ 2036
+ 2037
+ 2038
+ 2039
+ 2040
+ 2041
+ 2042
+ 2043
+ 2044
+ 2045
+ 2046
+ 2047
+ 2048
+ 2049
+ 2050
+ 2051
+ 2052
+ 2053
+ 2054
+ 2055
+ 2056
+ 2057
+ 2058
+ 2059
+ 2060
+ 2061
+ 2062
+ 2063
+ 2064
+ 2065
+ 2066
+ 2067
+ 2068
+ 2069
+ 2070
+ 2071
+ 2072
+ 2073
+ 2074
+ 2075
+ 2076
+ 2077
+ 2078
+ 2079
+ 2080
+ 2081
+ 2082
+ 2083
+ 2084
+ 2085
+ 2086
+ 2087
+ 2088
+ 2089
+ 2090
+ 2091
+ 2092
+ 2093
+ 2094
+ 2095
+ 2096
+ 2097
+ 2098
+ 2099
+ 2100
+ 2101
+ 2102
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2109
+ 2110
+ 2111
+ 2112
+ 2113
+ 2114
+ 2115
+ 2116
+ 2117
+ 2118
+ 2119
+ 2120
+ 2121
+ 2122
+ 2123
+ 2124
+ 2125
+ 2126
+ 2127
+ 2128
+ 2129
+ 2130
+ 2131
+ 2132
+ 2133
+ 2134
+ 2135
+ 2136
+ 2137
+ 2138
+ 2139
+ 2140
+ 2141
+ 2142
+ 2143
+ 2144
+ 2145
+ 2146
+ 2147
+ 2148
+ 2149
+ 2150
+ 2151
+ 2152
+ 2153
+ 2154
+ 2155
+ 2156
+ 2157
+ 2158
+ 2159
+ 2160
+ 2161
+ 2162
+ 2163
+ 2164
+ 2165
+ 2166
+ 2167
+ 2168
+ 2169
+ 2170
+ 2171
+ 2172
+ 2173
+ 2174
+ 2175
+ 2176
+ 2177
+ 2178
+ 2179
+ 2180
+ 2181
+ 2182
+ 2183
+ 2184
+ 2185
+ 2186
+ 2187
+ 2188
+ 2189
+ 2190
+ 2191
+ 2192
+ 2193
+ 2194
+ 2195
+ 2196
+ 2197
+ 2198
+ 2199
+ 2200
+ 2201
+ 2202
+ 2203
+ 2204
+ 2205
+ 2206
+ 2207
+ 2208
+ 2209
+ 2210
+ 2211
+ 2212
+ 2213
+ 2214
+ 2215
+ 2216
+ 2217
+ 2218
+ 2219
+ 2220
+ 2221
+ 2222
+ 2223
+ 2224
+ 2225
+ 2226
+ 2227
+ 2228
+ 2229
+ 2230
+ 2231
+ 2232
+ 2233
+ 2234
+ 2235
+ 2236
+ 2237
+ 2238
+ 2239
+ 2240
+ 2241
+ 2242
+ 2243
+ 2244
+ 2245
+ 2246
+ 2247
+ 2248
+ 2249
+ 2250
+ 2251
+ 2252
+ 2253
+ 2254
+ 2255
+ 2256
+ 2257
+ 2258
+ 2259
+ 2260
+ 2261
+ 2262
+ 2263
+ 2264
+ 2265
+ 2266
+ 2267
+ 2268
+ 2269
+ 2270
+ 2271
+ 2272
+ 2273
+ 2274
+ 2275
+ 2276
+ 2277
+ 2278
+ 2279
+ 2280
+ 2281
+ 2282
+ 2283
+ 2284
+ 2285
+ 2286
+ 2287
+ 2288
+ 2289
+ 2290
+ 2291
+ 2292
+ 2293
+ 2294
+ 2295
+ 2296
+ 2297
+ 2298
+ 2299
+ 2300
+ 2301
+ 2302
+ 2303
+ 2304
+ 2305
+ 2306
+ 2307
+ 2308
+ 2309
+ 2310
+ 2311
+ 2312
+ 2313
+ 2314
+ 2315
+ 2316
+ 2317
+ 2318
+ 2319
+ 2320
+ 2321
+ 2322
+ 2323
+ 2324
+ 2325
+ 2326
+ 2327
+ 2328
+ 2329
+ 2330
+ 2331
+ 2332
+ 2333
+ 2334
+ 2335
+ 2336
+ 2337
+ 2338
+ 2339
+ 2340
+ 2341
+ 2342
+ 2343
+ 2344
+ 2345
+ 2346
+ 2347
+ 2348
+ 2349
+ 2350
+ 2351
+ 2352
+ 2353
+ 2354
+ 2355
+ 2356
+ 2357
+ 2358
+ 2359
+ 2360
+ 2361
+ 2362
+ 2363
+ 2364
+ 2365
+ 2366
+ 2367
+ 2368
+ 2369
+ 2370
+ 2371
+ 2372
+ 2373
+ 2374
+ 2375
+ 2376
+ 2377
+ 2378
+ 2379
+ 2380
+ 2381
+ 2382
+ 2383
+ 2384
+ 2385
+ 2386
+ 2387
+ 2388
+ 2389
+ 2390
+ 2391
+ 2392
+ 2393
+ 2394
+ 2395
+ 2396
+ 2397
+ 2398
+ 2399
+ 2400
+ 2401
+ 2402
+ 2403
+ 2404
+ 2405
+ 2406
+ 2407
+ 2408
+ 2409
+ 2410
+ 2411
+ 2412
+ 2413
+ 2414
+ 2415
+ 2416
+ 2417
+ 2418
+ 2419
+ 2420
+ 2421
+ 2422
+ 2423
+ 2424
+ 2425
+ 2426
+ 2427
+ 2428
+ 2429
+ 2430
+ 2431
+ 2432
+ 2433
+ 2434
+ 2435
+ 2436
+ 2437
+ 2438
+ 2439
+ 2440
+ 2441
+ 2442
+ 2443
+ 2444
+ 2445
+ 2446
+ 2447
+ 2448
+ 2449
+ 2450
+ 2451
+ 2452
+ 2453
+ 2454
+ 2455
+ 2456
+ 2457
+ 2458
+ 2459
+ 2460
+ 2461
+ 2462
+ 2463
+ 2464
+ 2465
+ 2466
+ 2467
+ 2468
+ 2469
+ 2470
+ 2471
+ 2472
+ 2473
+ 2474
+ 2475
+ 2476
+ 2477
+ 2478
+ 2479
+ 2480
+ 2481
+ 2482
+ 2483
+ 2484
+ 2485
+ 2486
+ 2487
+ 2488
+ 2489
+ 2490
+ 2491
+ 2492
+ 2493
+ 2494
+ 2495
+ 2496
+ 2497
+ 2498
+ 2499
+ 2500
+ 2501
+ 2502
+ 2503
+ 2504
+ 2505
+ 2506
+ 2507
+ 2508
+ 2509
+ 2510
+ 2511
+ 2512
+ 2513
+ 2514
+ 2515
+ 2516
+ 2517
+ 2518
+ 2519
+ 2520
+ 2521
+ 2522
+ 2523
+ 2524
+ 2525
+ 2526
+ 2527
+ 2528
+ 2529
+ 2530
+ 2531
+ 2532
+ 2533
+ 2534
+ 2535
+ 2536
+ 2537
+ 2538
+ 2539
+ 2540
+ 2541
+ 2542
+ 2543
+ 2544
+ 2545
+ 2546
+ 2547
+ 2548
+ 2549
+ 2550
+ 2551
+ 2552
+ 2553
+ 2554
+ 2555
+ 2556
+ 2557
+ 2558
+ 2559
+ 2560
+ 2561
+ 2562
+ 2563
+ 2564
+ 2565
+ 2566
+ 2567
+ 2568
+ 2569
+ 2570
+ 2571
+ 2572
+ 2573
+ 2574
+ 2575
+ 2576
+ 2577
+ 2578
+ 2579
+ 2580
+ 2581
+ 2582
+ 2583
+ 2584
+ 2585
+ 2586
+ 2587
+ 2588
+ 2589
+ 2590
+ 2591
+ 2592
+ 2593
+ 2594
+ 2595
+ 2596
+ 2597
+ 2598
+ 2599
+ 2600
+ 2601
+ 2602
+ 2603
+ 2604
+ 2605
+ 2606
+ 2607
+ 2608
+ 2609
+ 2610
+ 2611
+ 2612
+ 2613
+ 2614
+ 2615
+ 2616
+ 2617
+ 2618
+ 2619
+ 2620
+ 2621
+ 2622
+ 2623
+ 2624
+ 2625
+ 2626
+ 2627
+ 2628
+ 2629
+ 2630
+ 2631
+ 2632
+ 2633
+ 2634
+ 2635
+ 2636
+ 2637
+ 2638
+ 2639
+ 2640
+ 2641
+ 2642
+ 2643
+ 2644
+ 2645
+ 2646
+ 2647
+ 2648
+ 2649
+ 2650
+ 2651
+ 2652
+ 2653
+ 2654
+ 2655
+ 2656
+ 2657
+ 2658
+ 2659
+ 2660
+ 2661
+ 2662
+ 2663
+ 2664
+ 2665
+ 2666
+ 2667
+ 2668
+ 2669
+ 2670
+ 2671
+ 2672
+ 2673
+ 2674
+ 2675
+ 2676
+ 2677
+ 2678
+ 2679
+ 2680
+ 2681
+ 2682
+ 2683
+ 2684
+ 2685
+ 2686
+ 2687
+ 2688
+ 2689
+ 2690
+ 2691
+ 2692
+ 2693
+ 2694
+ 2695
+ 2696
+ 2697
+ 2698
+ 2699
+ 2700
+ 2701
+ 2702
+ 2703
+ 2704
+ 2705
+ 2706
+ 2707
+ 2708
+ 2709
+ 2710
+ 2711
+ 2712
+ 2713
+ 2714
+ 2715
+ 2716
+ 2717
+ 2718
+ 2719
+ 2720
+ 2721
+ 2722
+ 2723
+ 2724
+ 2725
+ 2726
+ 2727
+ 2728
+ 2729
+ 2730
+ 2731
+ 2732
+ 2733
+ 2734
+ 2735
+ 2736
+ 2737
+ 2738
+ 2739
+ 2740
+ 2741
+ 2742
+ 2743
+ 2744
+ 2745
+ 2746
+ 2747
+ 2748
+ 2749
+ 2750
+ 2751
+ 2752
+ 2753
+ 2754
+ 2755
+ 2756
+ 2757
+ 2758
+ 2759
+ 2760
+ 2761
+ 2762
+ 2763
+ 2764
+ 2765
+ 2766
+ 2767
+ 2768
+ 2769
+ 2770
+ 2771
+ 2772
+ 2773
+ 2774
+ 2775
+ 2776
+ 2777
+ 2778
+ 2779
+ 2780
+ 2781
+ 2782
+ 2783
+ 2784
+ 2785
+ 2786
+ 2787
+ 2788
+ 2789
+ 2790
+ 2791
+ 2792
+ 2793
+ 2794
+ 2795
+ 2796
+ 2797
+ 2798
+ 2799
+ 2800
+ 2801
+ 2802
+ 2803
+ 2804
+ 2805
+ 2806
+ 2807
+ 2808
+ 2809
+ 2810
+ 2811
+ 2812
+ 2813
+ 2814
+ 2815
+ 2816
+ 2817
+ 2818
+ 2819
+ 2820
+ 2821
+ 2822
+ 2823
+ 2824
+ 2825
+ 2826
+ 2827
+ 2828
+ 2829
+ 2830
+ 2831
+ 2832
+ 2833
+ 2834
+ 2835
+ 2836
+ 2837
+ 2838
+ 2839
+ 2840
+ 2841
+ 2842
+ 2843
+ 2844
+ 2845
+ 2846
+ 2847
+ 2848
+ 2849
+ 2850
+ 2851
+ 2852
+ 2853
+ 2854
+ 2855
+ 2856
+ 2857
+ 2858
+ 2859
+ 2860
+ 2861
+ 2862
+ 2863
+ 2864
+ 2865
+ 2866
+ 2867
+ 2868
+ 2869
+ 2870
+ 2871
+ 2872
+ 2873
+ 2874
+ 2875
+ 2876
+ 2877
+ 2878
+ 2879
+ 2880
+ 2881
+ 2882
+ 2883
+ 2884
+ 2885
+ 2886
+ 2887
+ 2888
+ 2889
+ 2890
+ 2891
+ 2892
+ 2893
+ 2894
+ 2895
+ 2896
+ 2897
+ 2898
+ 2899
+ 2900
+ 2901
+ 2902
+ 2903
+ 2904
+ 2905
+ 2906
+ 2907
+ 2908
+ 2909
+ 2910
+ 2911
+ 2912
+ 2913
+ 2914
+ 2915
+ 2916
+ 2917
+ 2918
+ 2919
+ 2920
+ 2921
+ 2922
+ 2923
+ 2924
+ 2925
+ 2926
+ 2927
+ 2928
+ 2929
+ 2930
+ 2931
+ 2932
+ 2933
+ 2934
+ 2935
+ 2936
+ 2937
+ 2938
+ 2939
+ 2940
+ 2941
+ 2942
+ 2943
+ 2944
+ 2945
+ 2946
+ 2947
+ 2948
+ 2949
+ 2950
+ 2951
+ 2952
+ 2953
+ 2954
+ 2955
+ 2956
+ 2957
+ 2958
+ 2959
+ 2960
+ 2961
+ 2962
+ 2963
+ 2964
+ 2965
+ 2966
+ 2967
+ 2968
+ 2969
+ 2970
+ 2971
+ 2972
+ 2973
+ 2974
+ 2975
+ 2976
+ 2977
+ 2978
+ 2979
+ 2980
+ 2981
+ 2982
+ 2983
+ 2984
+ 2985
+ 2986
+ 2987
+ 2988
+ 2989
+ 2990
+ 2991
+ 2992
+ 2993
+ 2994
+ 2995
+ 2996
+ 2997
+ 2998
+ 2999
+ 3000
+ 3001
+ 3002
+ 3003
+ 3004
+ 3005
+ 3006
+ 3007
+ 3008
+ 3009
+ 3010
+ 3011
+ 3012
+ 3013
+ 3014
+ 3015
+ 3016
+ 3017
+ 3018
+ 3019
+ 3020
+ 3021
+ 3022
+ 3023
+ 3024
+ 3025
+ 3026
+ 3027
+ 3028
+ 3029
+ 3030
+ 3031
+ 3032
+ 3033
+ 3034
+ 3035
+ 3036
+ 3037
+ 3038
+ 3039
+ 3040
+ 3041
+ 3042
+ 3043
+ 3044
+ 3045
+ 3046
+ 3047
+ 3048
+ 3049
+ 3050
+ 3051
+ 3052
+ 3053
+ 3054
+ 3055
+ 3056
+ 3057
+ 3058
+ 3059
+ 3060
+ 3061
+ 3062
+ 3063
+ 3064
+ 3065
+ 3066
+ 3067
+ 3068
+ 3069
+ 3070
+ 3071
+ 3072
+ 3073
+ 3074
+ 3075
+ 3076
+ 3077
+ 3078
+ 3079
+ 3080
+ 3081
+ 3082
+ 3083
+ 3084
+ 3085
+ 3086
+ 3087
+ 3088
+ 3089
+ 3090
+ 3091
+ 3092
+ 3093
+ 3094
+ 3095
+ 3096
+ 3097
+ 3098
+ 3099
+ 3100
+ 3101
+ 3102
+ 3103
+ 3104
+ 3105
+ 3106
+ 3107
+ 3108
+ 3109
+ 3110
+ 3111
+ 3112
+ 3113
+ 3114
+ 3115
+ 3116
+ 3117
+ 3118
+ 3119
+ 3120
+ 3121
+ 3122
+ 3123
+ 3124
+ 3125
+ 3126
+ 3127
+ 3128
+ 3129
+ 3130
+ 3131
+ 3132
+ 3133
+ 3134
+ 3135
+ 3136
+ 3137
+ 3138
+ 3139
+ 3140
+ 3141
+ 3142
+ 3143
+ 3144
+ 3145
+ 3146
+ 3147
+ 3148
+ 3149
+ 3150
+ 3151
+ 3152
+ 3153
+ 3154
+ 3155
+ 3156
+ 3157
+ 3158
+ 3159
+ 3160
+ 3161
+ 3162
+ 3163
+ 3164
+ 3165
+ 3166
+ 3167
+ 3168
+ 3169
+ 3170
+ 3171
+ 3172
+ 3173
+ 3174
+ 3175
+ 3176
+ 3177
+ 3178
+ 3179
+ 3180
+ 3181
+ 3182
+ 3183
+ 3184
+ 3185
+ 3186
+ 3187
+ 3188
+ 3189
+ 3190
+ 3191
+ 3192
+ 3193
+ 3194
+ 3195
+ 3196
+ 3197
+ 3198
+ 3199
+ 3200
+ 3201
+ 3202
+ 3203
+ 3204
+ 3205
+ 3206
+ 3207
+ 3208
+ 3209
+ 3210
+ 3211
+ 3212
+ 3213
+ 3214
+ 3215
+ 3216
+ 3217
+ 3218
+ 3219
+ 3220
+ 3221
+ 3222
+ 3223
+ 3224
+ 3225
+ 3226
+ 3227
+ 3228
+ 3229
+ 3230
+ 3231
+ 3232
+ 3233
+ 3234
+ 3235
+ 3236
+ 3237
+ 3238
+ 3239
+ 3240
+ 3241
+ 3242
+ 3243
+ 3244
+ 3245
+ 3246
+ 3247
+ 3248
+ 3249
+ 3250
+ 3251
+ 3252
+ 3253
+ 3254
+ 3255
+ 3256
+ 3257
+ 3258
+ 3259
+ 3260
+ 3261
+ 3262
+ 3263
+ 3264
+ 3265
+ 3266
+ 3267
+ 3268
+ 3269
+ 3270
+ 3271
+ 3272
+ 3273
+ 3274
+ 3275
+ 3276
+ 3277
+ 3278
+ 3279
+ 3280
+ 3281
+ 3282
+ 3283
+ 3284
+ 3285
+ 3286
+ 3287
+ 3288
+ 3289
+ 3290
+ 3291
+ 3292
+ 3293
+ 3294
+ 3295
+ 3296
+ 3297
+ 3298
+ 3299
+ 3300
+ 3301
+ 3302
+ 3303
+ 3304
+ 3305
+ 3306
+ 3307
+ 3308
+ 3309
+ 3310
+ 3311
+ 3312
+ 3313
+ 3314
+ 3315
+ 3316
+ 3317
+ 3318
+ 3319
+ 3320
+ 3321
+ 3322
+ 3323
+ 3324
+ 3325
+ 3326
+ 3327
+ 3328
+ 3329
+ 3330
+ 3331
+ 3332
+ 3333
+ 3334
+ 3335
+ 3336
+ 3337
+ 3338
+ 3339
+ 3340
+ 3341
+ 3342
+ 3343
+ 3344
+ 3345
+ 3346
+ 3347
+ 3348
+ 3349
+ 3350
+ 3351
+ 3352
+ 3353
+ 3354
+ 3355
+ 3356
+ 3357
+ 3358
+ 3359
+ 3360
+ 3361
+ 3362
+ 3363
+ 3364
+ 3365
+ 3366
+ 3367
+ 3368
+ 3369
+ 3370
+ 3371
+ 3372
+ 3373
+ 3374
+ 3375
+ 3376
+ 3377
+ 3378
+ 3379
+ 3380
+ 3381
+ 3382
+ 3383
+ 3384
+ 3385
+ 3386
+ 3387
+ 3388
+ 3389
+ 3390
+ 3391
+ 3392
+ 3393
+ 3394
+ 3395
+ 3396
+ 3397
+ 3398
+ 3399
+ 3400
+ 3401
+ 3402
+ 3403
+ 3404
+ 3405
+ 3406
+ 3407
+ 3408
+ 3409
+ 3410
+ 3411
+ 3412
+ 3413
+ 3414
+ 3415
+ 3416
+ 3417
+ 3418
+ 3419
+ 3420
+ 3421
+ 3422
+ 3423
+ 3424
+ 3425
+ 3426
+ 3427
+ 3428
+ 3429
+ 3430
+ 3431
+ 3432
+ 3433
+ 3434
+ 3435
+ 3436
+ 3437
+ 3438
+ 3439
+ 3440
+ 3441
+ 3442
+ 3443
+ 3444
+ 3445
+ 3446
+ 3447
+ 3448
+ 3449
+ 3450
+ 3451
+ 3452
+ 3453
+ 3454
+ 3455
+ 3456
+ 3457
+ 3458
+ 3459
+ 3460
+ 3461
+ 3462
+ 3463
+ 3464
+ 3465
+ 3466
+ 3467
+ 3468
+ 3469
+ 3470
+ 3471
+ 3472
+ 3473
+ 3474
+ 3475
+ 3476
+ 3477
+ 3478
+ 3479
+ 3480
+ 3481
+ 3482
+ 3483
+ 3484
+ 3485
+ 3486
+ 3487
+ 3488
+ 3489
+ 3490
+ 3491
+ 3492
+ 3493
+ 3494
+ 3495
+ 3496
+ 3497
+ 3498
+ 3499
+ 3500
+ 3501
+ 3502
+ 3503
+ 3504
+ 3505
+ 3506
+ 3507
+ 3508
+ 3509
+ 3510
+ 3511
+ 3512
+ 3513
+ 3514
+ 3515
+ 3516
+ 3517
+ 3518
+ 3519
+ 3520
+ 3521
+ 3522
+ 3523
+ 3524
+ 3525
+ 3526
+ 3527
+ 3528
+ 3529
+ 3530
+ 3531
+ 3532
+ 3533
+ 3534
+ 3535
+ 3536
+ 3537
+ 3538
+ 3539
+ 3540
+ 3541
+ 3542
+ 3543
+ 3544
+ 3545
+ 3546
+ 3547
+ 3548
+ 3549
+ 3550
+ 3551
+ 3552
+ 3553
+ 3554
+ 3555
+ 3556
+ 3557
+ 3558
+ 3559
+ 3560
+ 3561
+ 3562
+ 3563
+ 3564
+ 3565
+ 3566
+ 3567
+ 3568
+ 3569
+ 3570
+ 3571
+ 3572
+ 3573
+ 3574
+ 3575
+ 3576
+ 3577
+ 3578
+ 3579
+ 3580
+ 3581
+ 3582
+ 3583
+ 3584
+ 3585
+ 3586
+ 3587
+ 3588
+ 3589
+ 3590
+ 3591
+ 3592
+ 3593
+ 3594
+ 3595
+ 3596
+ 3597
+ 3598
+ 3599
+ 3600
+ 3601
+ 3602
+ 3603
+ 3604
+ 3605
+ 3606
+ 3607
+ 3608
+ 3609
+ 3610
+ 3611
+ 3612
+ 3613
+ 3614
+ 3615
+ 3616
+ 3617
+ 3618
+ 3619
+ 3620
+ 3621
+ 3622
+ 3623
+ 3624
+ 3625
+ 3626
+ 3627
+ 3628
+ 3629
+ 3630
+ 3631
+ 3632
+ 3633
+ 3634
+ 3635
+ 3636
+ 3637
+ 3638
+ 3639
+ 3640
+ 3641
+ 3642
+ 3643
+ 3644
+ 3645
+ 3646
+ 3647
+ 3648
+ 3649
+ 3650
+ 3651
+ 3652
+ 3653
+ 3654
+ 3655
+ 3656
+ 3657
+ 3658
+ 3659
+ 3660
+ 3661
+ 3662
+ 3663
+ 3664
+ 3665
+ 3666
+ 3667
+ 3668
+ 3669
+ 3670
+ 3671
+ 3672
+ 3673
+ 3674
+ 3675
+ 3676
+ 3677
+ 3678
+ 3679
+ 3680
+ 3681
+ 3682
+ 3683
+ 3684
+ 3685
+ 3686
+ 3687
+ 3688
+ 3689
+ 3690
+ 3691
+ 3692
+ 3693
+ 3694
+ 3695
+ 3696
+ 3697
+ 3698
+ 3699
+ 3700
+ 3701
+ 3702
+ 3703
+ 3704
+ 3705
+ 3706
+ 3707
+ 3708
+ 3709
+ 3710
+ 3711
+ 3712
+ 3713
+ 3714
+ 3715
+ 3716
+ 3717
+ 3718
+ 3719
+ 3720
+ 3721
+ 3722
+ 3723
+ 3724
+ 3725
+ 3726
+ 3727
+ 3728
+ 3729
+ 3730
+ 3731
+ 3732
+ 3733
+ 3734
+ 3735
+ 3736
+ 3737
+ 3738
+ 3739
+ 3740
+ 3741
+ 3742
+ 3743
+ 3744
+ 3745
+ 3746
+ 3747
+ 3748
+ 3749
+ 3750
+ 3751
+ 3752
+ 3753
+ 3754
+ 3755
+ 3756
+ 3757
+ 3758
+ 3759
+ 3760
+ 3761
+ 3762
+ 3763
+ 3764
+ 3765
+ 3766
+ 3767
+ 3768
+ 3769
+ 3770
+ 3771
+ 3772
+ 3773
+ 3774
+ 3775
+ 3776
+ 3777
+ 3778
+ 3779
+ 3780
+ 3781
+ 3782
+ 3783
+ 3784
+ 3785
+ 3786
+ 3787
+ 3788
+ 3789
+ 3790
+ 3791
+ 3792
+ 3793
+ 3794
+ 3795
+ 3796
+ 3797
+ 3798
+ 3799
+ 3800
+ 3801
+ 3802
+ 3803
+ 3804
+ 3805
+ 3806
+ 3807
+ 3808
+ 3809
+ 3810
+ 3811
+ 3812
+ 3813
+ 3814
+ 3815
+ 3816
+ 3817
+ 3818
+ 3819
+ 3820
+ 3821
+ 3822
+ 3823
+ 3824
+ 3825
+ 3826
+ 3827
+ 3828
+ 3829
+ 3830
+ 3831
+ 3832
+ 3833
+ 3834
+ 3835
+ 3836
+ 3837
+ 3838
+ 3839
+ 3840
+ 3841
+ 3842
+ 3843
+ 3844
+ 3845
+ 3846
+ 3847
+ 3848
+ 3849
+ 3850
+ 3851
+ 3852
+ 3853
+ 3854
+ 3855
+ 3856
+ 3857
+ 3858
+ 3859
+ 3860
+ 3861
+ 3862
+ 3863
+ 3864
+ 3865
+ 3866
+ 3867
+ 3868
+ 3869
+ 3870
+ 3871
+ 3872
+ 3873
+ 3874
+ 3875
+ 3876
+ 3877
+ 3878
+ 3879
+ 3880
+ 3881
+ 3882
+ 3883
+ 3884
+ 3885
+ 3886
+ 3887
+ 3888
+ 3889
+ 3890
+ 3891
+ 3892
+ 3893
+ 3894
+ 3895
+ 3896
+ 3897
+ 3898
+ 3899
+ 3900
+ 3901
+ 3902
+ 3903
+ 3904
+ 3905
+ 3906
+ 3907
+ 3908
+ 3909
+ 3910
+ 3911
+ 3912
+ 3913
+ 3914
+ 3915
+ 3916
+ 3917
+ 3918
+ 3919
+ 3920
+ 3921
+ 3922
+ 3923
+ 3924
+ 3925
+ 3926
+ 3927
+ 3928
+ 3929
+ 3930
+ 3931
+ 3932
+ 3933
+ 3934
+ 3935
+ 3936
+ 3937
+ 3938
+ 3939
+ 3940
+ 3941
+ 3942
+ 3943
+ 3944
+ 3945
+ 3946
+ 3947
+ 3948
+ 3949
+ 3950
+ 3951
+ 3952
+ 3953
+ 3954
+ 3955
+ 3956
+ 3957
+ 3958
+ 3959
+ 3960
+ 3961
+ 3962
+ 3963
+ 3964
+ 3965
+ 3966
+ 3967
+ 3968
+ 3969
+ 3970
+ 3971
+ 3972
+ 3973
+ 3974
+ 3975
+ 3976
+ 3977
+ 3978
+ 3979
+ 3980
+ 3981
+ 3982
+ 3983
+ 3984
+ 3985
+ 3986
+ 3987
+ 3988
+ 3989
+ 3990
+ 3991
+ 3992
+ 3993
+ 3994
+ 3995
+ 3996
+ 3997
+ 3998
+ 3999
+ 4000
+ 4001
+ 4002
+ 4003
+ 4004
+ 4005
+ 4006
+ 4007
+ 4008
+ 4009
+ 4010
+ 4011
+ 4012
+ 4013
+ 4014
+ 4015
+ 4016
+ 4017
+ 4018
+ 4019
+ 4020
+ 4021
+ 4022
+ 4023
+ 4024
+ 4025
+ 4026
+ 4027
+ 4028
+ 4029
+ 4030
+ 4031
+ 4032
+ 4033
+ 4034
+ 4035
+ 4036
+ 4037
+ 4038
+ 4039
+ 4040
+ 4041
+ 4042
+ 4043
+ 4044
+ 4045
+ 4046
+ 4047
+ 4048
+ 4049
+ 4050
+ 4051
+ 4052
+ 4053
+ 4054
+ 4055
+ 4056
+ 4057
+ 4058
+ 4059
+ 4060
+ 4061
+ 4062
+ 4063
+ 4064
+ 4065
+ 4066
+ 4067
+ 4068
+ 4069
+ 4070
+ 4071
+ 4072
+ 4073
+ 4074
+ 4075
+ 4076
+ 4077
+ 4078
+ 4079
+ 4080
+ 4081
+ 4082
+ 4083
+ 4084
+ 4085
+ 4086
+ 4087
+ 4088
+ 4089
+ 4090
+ 4091
+ 4092
+ 4093
+ 4094
+ 4095
+ 4096
+ 4097
+ 4098
+ 4099
+ 4100
+ 4101
+ 4102
+ 4103
+ 4104
+ 4105
+ 4106
+ 4107
+ 4108
+ 4109
+ 4110
+ 4111
+ 4112
+ 4113
+ 4114
+ 4115
+ 4116
+ 4117
+ 4118
+ 4119
+ 4120
+ 4121
+ 4122
+ 4123
+ 4124
+ 4125
+ 4126
+ 4127
+ 4128
+ 4129
+ 4130
+ 4131
+ 4132
+ 4133
+ 4134
+ 4135
+ 4136
+ 4137
+ 4138
+ 4139
+ 4140
+ 4141
+ 4142
+ 4143
+ 4144
+ 4145
+ 4146
+ 4147
+ 4148
+ 4149
+ 4150
+ 4151
+ 4152
+ 4153
+ 4154
+ 4155
+ 4156
+ 4157
+ 4158
+ 4159
+ 4160
+ 4161
+ 4162
+ 4163
+ 4164
+ 4165
+ 4166
+ 4167
+ 4168
+ 4169
+ 4170
+ 4171
+ 4172
+ 4173
+ 4174
+ 4175
+ 4176
+ 4177
+ 4178
+ 4179
+ 4180
+ 4181
+ 4182
+ 4183
+ 4184
+ 4185
+ 4186
+ 4187
+ 4188
+ 4189
+ 4190
+ 4191
+ 4192
+ 4193
+ 4194
+ 4195
+ 4196
+ 4197
+ 4198
+ 4199
+ 4200
+ 4201
+ 4202
+ 4203
+ 4204
+ 4205
+ 4206
+ 4207
+ 4208
+ 4209
+ 4210
+ 4211
+ 4212
+ 4213
+ 4214
+ 4215
+ 4216
+ 4217
+ 4218
+ 4219
+ 4220
+ 4221
+ 4222
+ 4223
+ 4224
+ 4225
+ 4226
+ 4227
+ 4228
+ 4229
+ 4230
+ 4231
+ 4232
+ 4233
+ 4234
+ 4235
+ 4236
+ 4237
+ 4238
+ 4239
+ 4240
+ 4241
+ 4242
+ 4243
+ 4244
+ 4245
+ 4246
+ 4247
+ 4248
+ 4249
+ 4250
+ 4251
+ 4252
+ 4253
+ 4254
+ 4255
+ 4256
+ 4257
+ 4258
+ 4259
+ 4260
+ 4261
+ 4262
+ 4263
+ 4264
+ 4265
+ 4266
+ 4267
+ 4268
+ 4269
+ 4270
+ 4271
+ 4272
+ 4273
+ 4274
+ 4275
+ 4276
+ 4277
+ 4278
+ 4279
+ 4280
+ 4281
+ 4282
+ 4283
+ 4284
+ 4285
+ 4286
+ 4287
+ 4288
+ 4289
+ 4290
+ 4291
+ 4292
+ 4293
+ 4294
+ 4295
+ 4296
+ 4297
+ 4298
+ 4299
+ 4300
+ 4301
+ 4302
+ 4303
+ 4304
+ 4305
+ 4306
+ 4307
+ 4308
+ 4309
+ 4310
+ 4311
+ 4312
+ 4313
+ 4314
+ 4315
+ 4316
+ 4317
+ 4318
+ 4319
+ 4320
+ 4321
+ 4322
+ 4323
+ 4324
+ 4325
+ 4326
+ 4327
+ 4328
+ 4329
+ 4330
+ 4331
+ 4332
+ 4333
+ 4334
+ 4335
+ 4336
+ 4337
+ 4338
+ 4339
+ 4340
+ 4341
+ 4342
+ 4343
+ 4344
+ 4345
+ 4346
+ 4347
+ 4348
+ 4349
+ 4350
+ 4351
+ 4352
+ 4353
+ 4354
+ 4355
+ 4356
+ 4357
+ 4358
+ 4359
+ 4360
+ 4361
+ 4362
+ 4363
+ 4364
+ 4365
+ 4366
+ 4367
+ 4368
+ 4369
+ 4370
+ 4371
+ 4372
+ 4373
+ 4374
+ 4375
+ 4376
+ 4377
+ 4378
+ 4379
+ 4380
+ 4381
+ 4382
+ 4383
+ 4384
+ 4385
+ 4386
+ 4387
+ 4388
+ 4389
+ 4390
+ 4391
+ 4392
+ 4393
+ 4394
+ 4395
+ 4396
+ 4397
+ 4398
+ 4399
+ 4400
+ 4401
+ 4402
+ 4403
+ 4404
+ 4405
+ 4406
+ 4407
+ 4408
+ 4409
+ 4410
+ 4411
+ 4412
+ 4413
+ 4414
+ 4415
+ 4416
+ 4417
+ 4418
+ 4419
+ 4420
+ 4421
+ 4422
+ 4423
+ 4424
+ 4425
+ 4426
+ 4427
+ 4428
+ 4429
+ 4430
+ 4431
+ 4432
+ 4433
+ 4434
+ 4435
+ 4436
+ 4437
+ 4438
+ 4439
+ 4440
+ 4441
+ 4442
+ 4443
+ 4444
+ 4445
+ 4446
+ 4447
+ 4448
+ 4449
+ 4450
+ 4451
+ 4452
+ 4453
+ 4454
+ 4455
+ 4456
+ 4457
+ 4458
+ 4459
+ 4460
+ 4461
+ 4462
+ 4463
+ 4464
+ 4465
+ 4466
+ 4467
+ 4468
+ 4469
+ 4470
+ 4471
+ 4472
+ 4473
+ 4474
+ 4475
+ 4476
+ 4477
+ 4478
+ 4479
+ 4480
+ 4481
+ 4482
+ 4483
+ 4484
+ 4485
+ 4486
+ 4487
+ 4488
+ 4489
+ 4490
+ 4491
+ 4492
+ 4493
+ 4494
+ 4495
+ 4496
+ 4497
+ 4498
+ 4499
+ 4500
+ 4501
+ 4502
+ 4503
+ 4504
+ 4505
+ 4506
+ 4507
+ 4508
+ 4509
+ 4510
+ 4511
+ 4512
+ 4513
+ 4514
+ 4515
+ 4516
+ 4517
+ 4518
+ 4519
+ 4520
+ 4521
+ 4522
+ 4523
+ 4524
+ 4525
+ 4526
+ 4527
+ 4528
+ 4529
+ 4530
+ 4531
+ 4532
+ 4533
+ 4534
+ 4535
+ 4536
+ 4537
+ 4538
+ 4539
+ 4540
+ 4541
+ 4542
+ 4543
+ 4544
+ 4545
+ 4546
+ 4547
+ 4548
+ 4549
+ 4550
+ 4551
+ 4552
+ 4553
+ 4554
+ 4555
+ 4556
+ 4557
+ 4558
+ 4559
+ 4560
+ 4561
+ 4562
+ 4563
+ 4564
+ 4565
+ 4566
+ 4567
+ 4568
+ 4569
+ 4570
+ 4571
+ 4572
+ 4573
+ 4574
+ 4575
+ 4576
+ 4577
+ 4578
+ 4579
+ 4580
+ 4581
+ 4582
+ 4583
+ 4584
+ 4585
+ 4586
+ 4587
+ 4588
+ 4589
+ 4590
+ 4591
+ 4592
+ 4593
+ 4594
+ 4595
+ 4596
+ 4597
+ 4598
+ 4599
+ 4600
+ 4601
+ 4602
+ 4603
+ 4604
+ 4605
+ 4606
+ 4607
+ 4608
+ 4609
+ 4610
+ 4611
+ 4612
+ 4613
+ 4614
+ 4615
+ 4616
+ 4617
+ 4618
+ 4619
+ 4620
+ 4621
+ 4622
+ 4623
+ 4624
+ 4625
+ 4626
+ 4627
+ 4628
+ 4629
+ 4630
+ 4631
+ 4632
+ 4633
+ 4634
+ 4635
+ 4636
+ 4637
+ 4638
+ 4639
+ 4640
+ 4641
+ 4642
+ 4643
+ 4644
+ 4645
+ 4646
+ 4647
+ 4648
+ 4649
+ 4650
+ 4651
+ 4652
+ 4653
+ 4654
+ 4655
+ 4656
+ 4657
+ 4658
+ 4659
+ 4660
+ 4661
+ 4662
+ 4663
+ 4664
+ 4665
+ 4666
+ 4667
+ 4668
+ 4669
+ 4670
+ 4671
+ 4672
+ 4673
+ 4674
+ 4675
+ 4676
+ 4677
+ 4678
+ 4679
+ 4680
+ 4681
+ 4682
+ 4683
+ 4684
+ 4685
+ 4686
+ 4687
+ 4688
+ 4689
+ 4690
+ 4691
+ 4692
+ 4693
+ 4694
+ 4695
+ 4696
+ 4697
+ 4698
+ 4699
+ 4700
+ 4701
+ 4702
+ 4703
+ 4704
+ 4705
+ 4706
+ 4707
+ 4708
+ 4709
+ 4710
+ 4711
+ 4712
+ 4713
+ 4714
+ 4715
+ 4716
+ 4717
+ 4718
+ 4719
+ 4720
+ 4721
+ 4722
+ 4723
+ 4724
+ 4725
+ 4726
+ 4727
+ 4728
+ 4729
+ 4730
+ 4731
+ 4732
+ 4733
+ 4734
+ 4735
+ 4736
+ 4737
+ 4738
+ 4739
+ 4740
+ 4741
+ 4742
+ 4743
+ 4744
+ 4745
+ 4746
+ 4747
+ 4748
+ 4749
+ 4750
+ 4751
+ 4752
+ 4753
+ 4754
+ 4755
+ 4756
+ 4757
+ 4758
+ 4759
+ 4760
+ 4761
+ 4762
+ 4763
+ 4764
+ 4765
+ 4766
+ 4767
+ 4768
+ 4769
+ 4770
+ 4771
+ 4772
+ 4773
+ 4774
+ 4775
+ 4776
+ 4777
+ 4778
+ 4779
+ 4780
+ 4781
+ 4782
+ 4783
+ 4784
+ 4785
+ 4786
+ 4787
+ 4788
+ 4789
+ 4790
+ 4791
+ 4792
+ 4793
+ 4794
+ 4795
+ 4796
+ 4797
+ 4798
+ 4799
+ 4800
+ 4801
+ 4802
+ 4803
+ 4804
+ 4805
+ 4806
+ 4807
+ 4808
+ 4809
+ 4810
+ 4811
+ 4812
+ 4813
+ 4814
+ 4815
+ 4816
+ 4817
+ 4818
+ 4819
+ 4820
+ 4821
+ 4822
+ 4823
+ 4824
+ 4825
+ 4826
+ 4827
+ 4828
+ 4829
+ 4830
+ 4831
+ 4832
+ 4833
+ 4834
+ 4835
+ 4836
+ 4837
+ 4838
+ 4839
+ 4840
+ 4841
+ 4842
+ 4843
+ 4844
+ 4845
+ 4846
+ 4847
+ 4848
+ 4849
+ 4850
+ 4851
+ 4852
+ 4853
+ 4854
+ 4855
+ 4856
+ 4857
+ 4858
+ 4859
+ 4860
+ 4861
+ 4862
+ 4863
+ 4864
+ 4865
+ 4866
+ 4867
+ 4868
+ 4869
+ 4870
+ 4871
+ 4872
+ 4873
+ 4874
+ 4875
+ 4876
+ 4877
+ 4878
+ 4879
+ 4880
+ 4881
+ 4882
+ 4883
+ 4884
+ 4885
+ 4886
+ 4887
+ 4888
+ 4889
+ 4890
+ 4891
+ 4892
+ 4893
+ 4894
+ 4895
+ 4896
+ 4897
+ 4898
+ 4899
+ 4900
+ 4901
+ 4902
+ 4903
+ 4904
+ 4905
+ 4906
+ 4907
+ 4908
+ 4909
+ 4910
+ 4911
+ 4912
+ 4913
+ 4914
+ 4915
+ 4916
+ 4917
+ 4918
+ 4919
+ 4920
+ 4921
+ 4922
+ 4923
+ 4924
+ 4925
+ 4926
+ 4927
+ 4928
+ 4929
+ 4930
+ 4931
+ 4932
+ 4933
+ 4934
+ 4935
+ 4936
+ 4937
+ 4938
+ 4939
+ 4940
+ 4941
+ 4942
+ 4943
+ 4944
+ 4945
+ 4946
+ 4947
+ 4948
+ 4949
+ 4950
+ 4951
+ 4952
+ 4953
+ 4954
+ 4955
+ 4956
+ 4957
+ 4958
+ 4959
+ 4960
+ 4961
+ 4962
+ 4963
+ 4964
+ 4965
+ 4966
+ 4967
+ 4968
+ 4969
+ 4970
+ 4971
+ 4972
+ 4973
+ 4974
+ 4975
+ 4976
+ 4977
+ 4978
+ 4979
+ 4980
+ 4981
+ 4982
+ 4983
+ 4984
+ 4985
+ 4986
+ 4987
+ 4988
+ 4989
+ 4990
+ 4991
+ 4992
+ 4993
+ 4994
+ 4995
+ 4996
+ 4997
+ 4998
+ 4999
+ 5000
+ 5001
+ 5002
+ 5003
+ 5004
+ 5005
+ 5006
+ 5007
+ 5008
+ 5009
+ 5010
+ 5011
+ 5012
+ 5013
+ 5014
+ 5015
+ 5016
+ 5017
+ 5018
+ 5019
+ 5020
+ 5021
+ 5022
+ 5023
+ 5024
+ 5025
+ 5026
+ 5027
+ 5028
+ 5029
+ 5030
+ 5031
+ 5032
+ 5033
+ 5034
+ 5035
+ 5036
+ 5037
+ 5038
+ 5039
+ 5040
+ 5041
+ 5042
+ 5043
+ 5044
+ 5045
+ 5046
+ 5047
+ 5048
+ 5049
+ 5050
+ 5051
+ 5052
+ 5053
+ 5054
+ 5055
+ 5056
+ 5057
+ 5058
+ 5059
+ 5060
+ 5061
+ 5062
+ 5063
+ 5064
+ 5065
+ 5066
+ 5067
+ 5068
+ 5069
+ 5070
+ 5071
+ 5072
+ 5073
+ 5074
+ 5075
+ 5076
+ 5077
+ 5078
+ 5079
+ 5080
+ 5081
+ 5082
+ 5083
+ 5084
+ 5085
+ 5086
+ 5087
+ 5088
+ 5089
+ 5090
+ 5091
+ 5092
+ 5093
+ 5094
+ 5095
+ 5096
+ 5097
+ 5098
+ 5099
+ 5100
+ 5101
+ 5102
+ 5103
+ 5104
+ 5105
+ 5106
+ 5107
+ 5108
+ 5109
+ 5110
+ 5111
+ 5112
+ 5113
+ 5114
+ 5115
+ 5116
+ 5117
+ 5118
+ 5119
+ 5120
+ 5121
+ 5122
+ 5123
+ 5124
+ 5125
+ 5126
+ 5127
+ 5128
+ 5129
+ 5130
+ 5131
+ 5132
+ 5133
+ 5134
+ 5135
+ 5136
+ 5137
+ 5138
+ 5139
+ 5140
+ 5141
+ 5142
+ 5143
+ 5144
+ 5145
+ 5146
+ 5147
+ 5148
+ 5149
+ 5150
+ 5151
+ 5152
+ 5153
+ 5154
+ 5155
+ 5156
+ 5157
+ 5158
+ 5159
+ 5160
+ 5161
+ 5162
+ 5163
+ 5164
+ 5165
+ 5166
+ 5167
+ 5168
+ 5169
+ 5170
+ 5171
+ 5172
+ 5173
+ 5174
+ 5175
+ 5176
+ 5177
+ 5178
+ 5179
+ 5180
+ 5181
+ 5182
+ 5183
+ 5184
+ 5185
+ 5186
+ 5187
+ 5188
+ 5189
+ 5190
+ 5191
+ 5192
+ 5193
+ 5194
+ 5195
+ 5196
+ 5197
+ 5198
+ 5199
+ 5200
+ 5201
+ 5202
+ 5203
+ 5204
+ 5205
+ 5206
+ 5207
+ 5208
+ 5209
+ 5210
+ 5211
+ 5212
+ 5213
+ 5214
+ 5215
+ 5216
+ 5217
+ 5218
+ 5219
+ 5220
+ 5221
+ 5222
+ 5223
+ 5224
+ 5225
+ 5226
+ 5227
+ 5228
+ 5229
+ 5230
+ 5231
+ 5232
+ 5233
+ 5234
+ 5235
+ 5236
+ 5237
+ 5238
+ 5239
+ 5240
+ 5241
+ 5242
+ 5243
+ 5244
+ 5245
+ 5246
+ 5247
+ 5248
+ 5249
+ 5250
+ 5251
+ 5252
+ 5253
+ 5254
+ 5255
+ 5256
+ 5257
+ 5258
+ 5259
+ 5260
+ 5261
+ 5262
+ 5263
+ 5264
+ 5265
+ 5266
+ 5267
+ 5268
+ 5269
+ 5270
+ 5271
+ 5272
+ 5273
+ 5274
+ 5275
+ 5276
+ 5277
+ 5278
+ 5279
+ 5280
+ 5281
+ 5282
+ 5283
+ 5284
+ 5285
+ 5286
+ 5287
+ 5288
+ 5289
+ 5290
+ 5291
+ 5292
+ 5293
+ 5294
+ 5295
+ 5296
+ 5297
+ 5298
+ 5299
+ 5300
+ 5301
+ 5302
+ 5303
+ 5304
+ 5305
+ 5306
+ 5307
+ 5308
+ 5309
+ 5310
+ 5311
+ 5312
+ 5313
+ 5314
+ 5315
+ 5316
+ 5317
+ 5318
+ 5319
+ 5320
+ 5321
+ 5322
+ 5323
+ 5324
+ 5325
+ 5326
+ 5327
+ 5328
+ 5329
+ 5330
+ 5331
+ 5332
+ 5333
+ 5334
+ 5335
+ 5336
+ 5337
+ 5338
+ 5339
+ 5340
+ 5341
+ 5342
+ 5343
+ 5344
+ 5345
+ 5346
+ 5347
+ 5348
+ 5349
+ 5350
+ 5351
+ 5352
+ 5353
+ 5354
+ 5355
+ 5356
+ 5357
+ 5358
+ 5359
+ 5360
+ 5361
+ 5362
+ 5363
+ 5364
+ 5365
+ 5366
+ 5367
+ 5368
+ 5369
+ 5370
+ 5371
+ 5372
+ 5373
+ 5374
+ 5375
+ 5376
+ 5377
+ 5378
+ 5379
+ 5380
+ 5381
+ 5382
+ 5383
+ 5384
+ 5385
+ 5386
+ 5387
+ 5388
+ 5389
+ 5390
+ 5391
+ 5392
+ 5393
+ 5394
+ 5395
+ 5396
+ 5397
+ 5398
+ 5399
+ 5400
+ 5401
+ 5402
+ 5403
+ 5404
+ 5405
+ 5406
+ 5407
+ 5408
+ 5409
+ 5410
+ 5411
+ 5412
+ 5413
+ 5414
+ 5415
+ 5416
+ 5417
+ 5418
+ 5419
+ 5420
+ 5421
+ 5422
+ 5423
+ 5424
+ 5425
+ 5426
+ 5427
+ 5428
+ 5429
+ 5430
+ 5431
+ 5432
+ 5433
+ 5434
+ 5435
+ 5436
+ 5437
+ 5438
+ 5439
+ 5440
+ 5441
+ 5442
+ 5443
+ 5444
+ 5445
+ 5446
+ 5447
+ 5448
+ 5449
+ 5450
+ 5451
+ 5452
+ 5453
+ 5454
+ 5455
+ 5456
+ 5457
+ 5458
+ 5459
+ 5460
+ 5461
+ 5462
+ 5463
+ 5464
+ 5465
+ 5466
+ 5467
+ 5468
+ 5469
+ 5470
+ 5471
+ 5472
+ 5473
+ 5474
+ 5475
+ 5476
+ 5477
+ 5478
+ 5479
+ 5480
+ 5481
+ 5482
+ 5483
+ 5484
+ 5485
+ 5486
+ 5487
+ 5488
+ 5489
+ 5490
+ 5491
+ 5492
+ 5493
+ 5494
+ 5495
+ 5496
+ 5497
+ 5498
+ 5499
+ 5500
+ 5501
+ 5502
+ 5503
+ 5504
+ 5505
+ 5506
+ 5507
+ 5508
+ 5509
+ 5510
+ 5511
+ 5512
+ 5513
+ 5514
+ 5515
+ 5516
+ 5517
+ 5518
+ 5519
+ 5520
+ 5521
+ 5522
+ 5523
+ 5524
+ 5525
+ 5526
+ 5527
+ 5528
+ 5529
+ 5530
+ 5531
+ 5532
+ 5533
+ 5534
+ 5535
+ 5536
+ 5537
+ 5538
+ 5539
+ 5540
+ 5541
+ 5542
+ 5543
+ 5544
+ 5545
+ 5546
+ 5547
+ 5548
+ 5549
+ 5550
+ 5551
+ 5552
+ 5553
+ 5554
+ 5555
+ 5556
+ 5557
+ 5558
+ 5559
+ 5560
+ 5561
+ 5562
+ 5563
+ 5564
+ 5565
+ 5566
+ 5567
+ 5568
+ 5569
+ 5570
+ 5571
+ 5572
+ 5573
+ 5574
+ 5575
+ 5576
+ 5577
+ 5578
+ 5579
+ 5580
+ 5581
+ 5582
+ 5583
+ 5584
+ 5585
+ 5586
+ 5587
+ 5588
+ 5589
+ 5590
+ 5591
+ 5592
+ 5593
+ 5594
+ 5595
+ 5596
+ 5597
+ 5598
+ 5599
+ 5600
+ 5601
+ 5602
+ 5603
+ 5604
+ 5605
+ 5606
+ 5607
+ 5608
+ 5609
+ 5610
+ 5611
+ 5612
+ 5613
+ 5614
+ 5615
+ 5616
+ 5617
+ 5618
+ 5619
+ 5620
+ 5621
+ 5622
+ 5623
+ 5624
+ 5625
+ 5626
+ 5627
+ 5628
+ 5629
+ 5630
+ 5631
+ 5632
+ 5633
+ 5634
+ 5635
+ 5636
+ 5637
+ 5638
+ 5639
+ 5640
+ 5641
+ 5642
+ 5643
+ 5644
+ 5645
+ 5646
+ 5647
+ 5648
+ 5649
+ 5650
+ 5651
+ 5652
+ 5653
+ 5654
+ 5655
+ 5656
+ 5657
+ 5658
+ 5659
+ 5660
+ 5661
+ 5662
+ 5663
+ 5664
+ 5665
+ 5666
+ 5667
+ 5668
+ 5669
+ 5670
+ 5671
+ 5672
+ 5673
+ 5674
+ 5675
+ 5676
+ 5677
+ 5678
+ 5679
+ 5680
+ 5681
+ 5682
+ 5683
+ 5684
+ 5685
+ 5686
+ 5687
+ 5688
+ 5689
+ 5690
+ 5691
+ 5692
+ 5693
+ 5694
+ 5695
+ 5696
+ 5697
+ 5698
+ 5699
+ 5700
+ 5701
+ 5702
+ 5703
+ 5704
+ 5705
+ 5706
+ 5707
+ 5708
+ 5709
+ 5710
+ 5711
+ 5712
+ 5713
+ 5714
+ 5715
+ 5716
+ 5717
+ 5718
+ 5719
+ 5720
+ 5721
+ 5722
+ 5723
+ 5724
+ 5725
+ 5726
+ 5727
+ 5728
+ 5729
+ 5730
+ 5731
+ 5732
+ 5733
+ 5734
+ 5735
+ 5736
+ 5737
+ 5738
+ 5739
+ 5740
+ 5741
+ 5742
+ 5743
+ 5744
+ 5745
+ 5746
+ 5747
+ 5748
+ 5749
+ 5750
+ 5751
+ 5752
+ 5753
+ 5754
+ 5755
+ 5756
+ 5757
+ 5758
+ 5759
+ 5760
+ 5761
+ 5762
+ 5763
+ 5764
+ 5765
+ 5766
+ 5767
+ 5768
+ 5769
+ 5770
+ 5771
+ 5772
+ 5773
+ 5774
+ 5775
+ 5776
+ 5777
+ 5778
+ 5779
+ 5780
+ 5781
+ 5782
+ 5783
+ 5784
+ 5785
+ 5786
+ 5787
+ 5788
+ 5789
+ 5790
+ 5791
+ 5792
+ 5793
+ 5794
+ 5795
+ 5796
+ 5797
+ 5798
+ 5799
+ 5800
+ 5801
+ 5802
+ 5803
+ 5804
+ 5805
+ 5806
+ 5807
+ 5808
+ 5809
+ 5810
+ 5811
+ 5812
+ 5813
+ 5814
+ 5815
+ 5816
+ 5817
+ 5818
+ 5819
+ 5820
+ 5821
+ 5822
+ 5823
+ 5824
+ 5825
+ 5826
+ 5827
+ 5828
+ 5829
+ 5830
+ 5831
+ 5832
+ 5833
+ 5834
+ 5835
+ 5836
+ 5837
+ 5838
+ 5839
+ 5840
+ 5841
+ 5842
+ 5843
+ 5844
+ 5845
+ 5846
+ 5847
+ 5848
+ 5849
+ 5850
+ 5851
+ 5852
+ 5853
+ 5854
+ 5855
+ 5856
+ 5857
+ 5858
+ 5859
+ 5860
+ 5861
+ 5862
+ 5863
+ 5864
+ 5865
+ 5866
+ 5867
+ 5868
+ 5869
+ 5870
+ 5871
+ 5872
+ 5873
+ 5874
+ 5875
+ 5876
+ 5877
+ 5878
+ 5879
+ 5880
+ 5881
+ 5882
+ 5883
+ 5884
+ 5885
+ 5886
+ 5887
+ 5888
+ 5889
+ 5890
+ 5891
+ 5892
+ 5893
+ 5894
+ 5895
+ 5896
+ 5897
+ 5898
+ 5899
+ 5900
+ 5901
+ 5902
+ 5903
+ 5904
+ 5905
+ 5906
+ 5907
+ 5908
+ 5909
+ 5910
+ 5911
+ 5912
+ 5913
+ 5914
+ 5915
+ 5916
+ 5917
+ 5918
+ 5919
+ 5920
+ 5921
+ 5922
+ 5923
+ 5924
+ 5925
+ 5926
+ 5927
+ 5928
+ 5929
+ 5930
+ 5931
+ 5932
+ 5933
+ 5934
+ 5935
+ 5936
+ 5937
+ 5938
+ 5939
+ 5940
+ 5941
+ 5942
+ 5943
+ 5944
+ 5945
+ 5946
+ 5947
+ 5948
+ 5949
+ 5950
+ 5951
+ 5952
+ 5953
+ 5954
+ 5955
+ 5956
+ 5957
+ 5958
+ 5959
+ 5960
+ 5961
+ 5962
+ 5963
+ 5964
+ 5965
+ 5966
+ 5967
+ 5968
+ 5969
+ 5970
+ 5971
+ 5972
+ 5973
+ 5974
+ 5975
+ 5976
+ 5977
+ 5978
+ 5979
+ 5980
+ 5981
+ 5982
+ 5983
+ 5984
+ 5985
+ 5986
+ 5987
+ 5988
+ 5989
+ 5990
+ 5991
+ 5992
+ 5993
+ 5994
+ 5995
+ 5996
+ 5997
+ 5998
+ 5999
+ 6000
+ 6001
+ 6002
+ 6003
+ 6004
+ 6005
+ 6006
+ 6007
+ 6008
+ 6009
+ 6010
+ 6011
+ 6012
+ 6013
+ 6014
+ 6015
+ 6016
+ 6017
+ 6018
+ 6019
+ 6020
+ 6021
+ 6022
+ 6023
+ 6024
+ 6025
+ 6026
+ 6027
+ 6028
+ 6029
+ 6030
+ 6031
+ 6032
+ 6033
+ 6034
+ 6035
+ 6036
+ 6037
+ 6038
+ 6039
+ 6040
+ 6041
+ 6042
+ 6043
+ 6044
+ 6045
+ 6046
+ 6047
+ 6048
+ 6049
+ 6050
+ 6051
+ 6052
+ 6053
+ 6054
+ 6055
+ 6056
+ 6057
+ 6058
+ 6059
+ 6060
+ 6061
+ 6062
+ 6063
+ 6064
+ 6065
+ 6066
+ 6067
+ 6068
+ 6069
+ 6070
+ 6071
+ 6072
+ 6073
+ 6074
+ 6075
+ 6076
+ 6077
+ 6078
+ 6079
+ 6080
+ 6081
+ 6082
+ 6083
+ 6084
+ 6085
+ 6086
+ 6087
+ 6088
+ 6089
+ 6090
+ 6091
+ 6092
+ 6093
+ 6094
+ 6095
+ 6096
+ 6097
+ 6098
+ 6099
+ 6100
+ 6101
+ 6102
+ 6103
+ 6104
+ 6105
+ 6106
+ 6107
+ 6108
+ 6109
+ 6110
+ 6111
+ 6112
+ 6113
+ 6114
+ 6115
+ 6116
+ 6117
+ 6118
+ 6119
+ 6120
+ 6121
+ 6122
+ 6123
+ 6124
+ 6125
+ 6126
+ 6127
+ 6128
+ 6129
+ 6130
+ 6131
+ 6132
+ 6133
+ 6134
+ 6135
+ 6136
+ 6137
+ 6138
+ 6139
+ 6140
+ 6141
+ 6142
+ 6143
+ 6144
+ 6145
+ 6146
+ 6147
+ 6148
+ 6149
+ 6150
+ 6151
+ 6152
+ 6153
+ 6154
+ 6155
+ 6156
+ 6157
+ 6158
+ 6159
+ 6160
+ 6161
+ 6162
+ 6163
+ 6164
+ 6165
+ 6166
+ 6167
+ 6168
+ 6169
+ 6170
+ 6171
+ 6172
+ 6173
+ 6174
+ 6175
+ 6176
+ 6177
+ 6178
+ 6179
+ 6180
+ 6181
+ 6182
+ 6183
+ 6184
+ 6185
+ 6186
+ 6187
+ 6188
+ 6189
+ 6190
+ 6191
+ 6192
+ 6193
+ 6194
+ 6195
+ 6196
+ 6197
+ 6198
+ 6199
+ 6200
+ 6201
+ 6202
+ 6203
+ 6204
+ 6205
+ 6206
+ 6207
+ 6208
+ 6209
+ 6210
+ 6211
+ 6212
+ 6213
+ 6214
+ 6215
+ 6216
+ 6217
+ 6218
+ 6219
+ 6220
+ 6221
+ 6222
+ 6223
+ 6224
+ 6225
+ 6226
+ 6227
+ 6228
+ 6229
+ 6230
+ 6231
+ 6232
+ 6233
+ 6234
+ 6235
+ 6236
+ 6237
+ 6238
+ 6239
+ 6240
+ 6241
+ 6242
+ 6243
+ 6244
+ 6245
+ 6246
+ 6247
+ 6248
+ 6249
+ 6250
+ 6251
+ 6252
+ 6253
+ 6254
+ 6255
+ 6256
+ 6257
+ 6258
+ 6259
+ 6260
+ 6261
+ 6262
+ 6263
+ 6264
+ 6265
+ 6266
+ 6267
+ 6268
+ 6269
+ 6270
+ 6271
+ 6272
+ 6273
+ 6274
+ 6275
+ 6276
+ 6277
+ 6278
+ 6279
+ 6280
+ 6281
+ 6282
+ 6283
+ 6284
+ 6285
+ 6286
+ 6287
+ 6288
+ 6289
+ 6290
+ 6291
+ 6292
+ 6293
+ 6294
+ 6295
+ 6296
+ 6297
+ 6298
+ 6299
+ 6300
+ 6301
+ 6302
+ 6303
+ 6304
+ 6305
+ 6306
+ 6307
+ 6308
+ 6309
+ 6310
+ 6311
+ 6312
+ 6313
+ 6314
+ 6315
+ 6316
+ 6317
+ 6318
+ 6319
+ 6320
+ 6321
+ 6322
+ 6323
+ 6324
+ 6325
+ 6326
+ 6327
+ 6328
+ 6329
+ 6330
+ 6331
+ 6332
+ 6333
+ 6334
+ 6335
+ 6336
+ 6337
+ 6338
+ 6339
+ 6340
+ 6341
+ 6342
+ 6343
+ 6344
+ 6345
+ 6346
+ 6347
+ 6348
+ 6349
+ 6350
+ 6351
+ 6352
+ 6353
+ 6354
+ 6355
+ 6356
+ 6357
+ 6358
+ 6359
+ 6360
+ 6361
+ 6362
+ 6363
+ 6364
+ 6365
+ 6366
+ 6367
+ 6368
+ 6369
+ 6370
+ 6371
+ 6372
+ 6373
+ 6374
+ 6375
+ 6376
+ 6377
+ 6378
+ 6379
+ 6380
+ 6381
+ 6382
+ 6383
+ 6384
+ 6385
+ 6386
+ 6387
+ 6388
+ 6389
+ 6390
+ 6391
+ 6392
+ 6393
+ 6394
+ 6395
+ 6396
+ 6397
+ 6398
+ 6399
+ 6400
+ 6401
+ 6402
+ 6403
+ 6404
+ 6405
+ 6406
+ 6407
+ 6408
+ 6409
+ 6410
+ 6411
+ 6412
+ 6413
+ 6414
+ 6415
+ 6416
+ 6417
+ 6418
+ 6419
+ 6420
+ 6421
+ 6422
+ 6423
+ 6424
+ 6425
+ 6426
+ 6427
+ 6428
+ 6429
+ 6430
+ 6431
+ 6432
+ 6433
+ 6434
+ 6435
+ 6436
+ 6437
+ 6438
+ 6439
+ 6440
+ 6441
+ 6442
+ 6443
+ 6444
+ 6445
+ 6446
+ 6447
+ 6448
+ 6449
+ 6450
+ 6451
+ 6452
+ 6453
+ 6454
+ 6455
+ 6456
+ 6457
+ 6458
+ 6459
+ 6460
+ 6461
+ 6462
+ 6463
+ 6464
+ 6465
+ 6466
+ 6467
+ 6468
+ 6469
+ 6470
+ 6471
+ 6472
+ 6473
+ 6474
+ 6475
+ 6476
+ 6477
+ 6478
+ 6479
+ 6480
+ 6481
+ 6482
+ 6483
+ 6484
+ 6485
+ 6486
+ 6487
+ 6488
+ 6489
+ 6490
+ 6491
+ 6492
+ 6493
+ 6494
+ 6495
+ 6496
+ 6497
+ 6498
+ 6499
+ 6500
+ 6501
+ 6502
+ 6503
+ 6504
+ 6505
+ 6506
+ 6507
+ 6508
+ 6509
+ 6510
+ 6511
+ 6512
+ 6513
+ 6514
+ 6515
+ 6516
+ 6517
+ 6518
+ 6519
+ 6520
+ 6521
+ 6522
+ 6523
+ 6524
+ 6525
+ 6526
+ 6527
+ 6528
+ 6529
+ 6530
+ 6531
+ 6532
+ 6533
+ 6534
+ 6535
+ 6536
+ 6537
+ 6538
+ 6539
+ 6540
+ 6541
+ 6542
+ 6543
+ 6544
+ 6545
+ 6546
+ 6547
+ 6548
+ 6549
+ 6550
+ 6551
+ 6552
+ 6553
+ 6554
+ 6555
+ 6556
+ 6557
+ 6558
+ 6559
+ 6560
+ 6561
+ 6562
+ 6563
+ 6564
+ 6565
+ 6566
+ 6567
+ 6568
+ 6569
+ 6570
+ 6571
+ 6572
+ 6573
+ 6574
+ 6575
+ 6576
+ 6577
+ 6578
+ 6579
+ 6580
+ 6581
+ 6582
+ 6583
+ 6584
+ 6585
+ 6586
+ 6587
+ 6588
+ 6589
+ 6590
+ 6591
+ 6592
+ 6593
+ 6594
+ 6595
+ 6596
+ 6597
+ 6598
+ 6599
+ 6600
+ 6601
+ 6602
+ 6603
+ 6604
+ 6605
+ 6606
+ 6607
+ 6608
+ 6609
+ 6610
+ 6611
+ 6612
+ 6613
+ 6614
+ 6615
+ 6616
+ 6617
+ 6618
+ 6619
+ 6620
+ 6621
+ 6622
+ 6623
+ 6624
+ 6625
+ 6626
+ 6627
+ 6628
+ 6629
+ 6630
+ 6631
+ 6632
+ 6633
+ 6634
+ 6635
+ 6636
+ 6637
+ 6638
+ 6639
+ 6640
+ 6641
+ 6642
+ 6643
+ 6644
+ 6645
+ 6646
+ 6647
+ 6648
+ 6649
+ 6650
+ 6651
+ 6652
+ 6653
+ 6654
+ 6655
+ 6656
+ 6657
+ 6658
+ 6659
+ 6660
+ 6661
+ 6662
+ 6663
+ 6664
+ 6665
+ 6666
+ 6667
+ 6668
+ 6669
+ 6670
+ 6671
+ 6672
+ 6673
+ 6674
+ 6675
+ 6676
+ 6677
+ 6678
+ 6679
+ 6680
+ 6681
+ 6682
+ 6683
+ 6684
+ 6685
+ 6686
+ 6687
+ 6688
+ 6689
+ 6690
+ 6691
+ 6692
+ 6693
+ 6694
+ 6695
+ 6696
+ 6697
+ 6698
+ 6699
+ 6700
+ 6701
+ 6702
+ 6703
+ 6704
+ 6705
+ 6706
+ 6707
+ 6708
+ 6709
+ 6710
+ 6711
+ 6712
+ 6713
+ 6714
+ 6715
+ 6716
+ 6717
+ 6718
+ 6719
+ 6720
+ 6721
+ 6722
+ 6723
+ 6724
+ 6725
+ 6726
+ 6727
+ 6728
+ 6729
+ 6730
+ 6731
+ 6732
+ 6733
+ 6734
+ 6735
+ 6736
+ 6737
+ 6738
+ 6739
+ 6740
+ 6741
+ 6742
+ 6743
+ 6744
+ 6745
+ 6746
+ 6747
+ 6748
+ 6749
+ 6750
+ 6751
+ 6752
+ 6753
+ 6754
+ 6755
+ 6756
+ 6757
+ 6758
+ 6759
+ 6760
+ 6761
+ 6762
+ 6763
+ 6764
+ 6765
+ 6766
+ 6767
+ 6768
+ 6769
+ 6770
+ 6771
+ 6772
+ 6773
+ 6774
+ 6775
+ 6776
+ 6777
+ 6778
+ 6779
+ 6780
+ 6781
+ 6782
+ 6783
+ 6784
+ 6785
+ 6786
+ 6787
+ 6788
+ 6789
+ 6790
+ 6791
+ 6792
+ 6793
+ 6794
+ 6795
+ 6796
+ 6797
+ 6798
+ 6799
+ 6800
+ 6801
+ 6802
+ 6803
+ 6804
+ 6805
+ 6806
+ 6807
+ 6808
+ 6809
+ 6810
+ 6811
+ 6812
+ 6813
+ 6814
+ 6815
+ 6816
+ 6817
+ 6818
+ 6819
+ 6820
+ 6821
+ 6822
+ 6823
+ 6824
+ 6825
+ 6826
+ 6827
+ 6828
+ 6829
+ 6830
+ 6831
+ 6832
+ 6833
+ 6834
+ 6835
+ 6836
+ 6837
+ 6838
+ 6839
+ 6840
+ 6841
+ 6842
+ 6843
+ 6844
+ 6845
+ 6846
+ 6847
+ 6848
+ 6849
+ 6850
+ 6851
+ 6852
+ 6853
+ 6854
+ 6855
+ 6856
+ 6857
+ 6858
+ 6859
+ 6860
+ 6861
+ 6862
+ 6863
+ 6864
+ 6865
+ 6866
+ 6867
+ 6868
+ 6869
+ 6870
+ 6871
+ 6872
+ 6873
+ 6874
+ 6875
+ 6876
+ 6877
+ 6878
+ 6879
+ 6880
+ 6881
+ 6882
+ 6883
+ 6884
+ 6885
+ 6886
+ 6887
+ 6888
+ 6889
+ 6890
+ 6891
+ 6892
+ 6893
+ 6894
+ 6895
+ 6896
+ 6897
+ 6898
+ 6899
+ 6900
+ 6901
+ 6902
+ 6903
+ 6904
+ 6905
+ 6906
+ 6907
+ 6908
+ 6909
+ 6910
+ 6911
+ 6912
+ 6913
+ 6914
+ 6915
+ 6916
+ 6917
+ 6918
+ 6919
+ 6920
+ 6921
+ 6922
+ 6923
+ 6924
+ 6925
+ 6926
+ 6927
+ 6928
+ 6929
+ 6930
+ 6931
+ 6932
+ 6933
+ 6934
+ 6935
+ 6936
+ 6937
+ 6938
+ 6939
+ 6940
+ 6941
+ 6942
+ 6943
+ 6944
+ 6945
+ 6946
+ 6947
+ 6948
+ 6949
+ 6950
+ 6951
+ 6952
+ 6953
+ 6954
+ 6955
+ 6956
+ 6957
+ 6958
+ 6959
+ 6960
+ 6961
+ 6962
+ 6963
+ 6964
+ 6965
+ 6966
+ 6967
+ 6968
+ 6969
+ 6970
+ 6971
+ 6972
+ 6973
+ 6974
+ 6975
+ 6976
+ 6977
+ 6978
+ 6979
+ 6980
+ 6981
+ 6982
+ 6983
+ 6984
+ 6985
+ 6986
+ 6987
+ 6988
+ 6989
+ 6990
+ 6991
+ 6992
+ 6993
+ 6994
+ 6995
+ 6996
+ 6997
+ 6998
+ 6999
+ 7000
+ 7001
+ 7002
+ 7003
+ 7004
+ 7005
+ 7006
+ 7007
+ 7008
+ 7009
+ 7010
+ 7011
+ 7012
+ 7013
+ 7014
+ 7015
+ 7016
+ 7017
+ 7018
+ 7019
+ 7020
+ 7021
+ 7022
+ 7023
+ 7024
+ 7025
+ 7026
+ 7027
+ 7028
+ 7029
+ 7030
+ 7031
+ 7032
+ 7033
+ 7034
+ 7035
+ 7036
+ 7037
+ 7038
+ 7039
+ 7040
+ 7041
+ 7042
+ 7043
+ 7044
+ 7045
+ 7046
+ 7047
+ 7048
+ 7049
+ 7050
+ 7051
+ 7052
+ 7053
+ 7054
+ 7055
+ 7056
+ 7057
+ 7058
+ 7059
+ 7060
+ 7061
+ 7062
+ 7063
+ 7064
+ 7065
+ 7066
+ 7067
+ 7068
+ 7069
+ 7070
+ 7071
+ 7072
+ 7073
+ 7074
+ 7075
+ 7076
+ 7077
+ 7078
+ 7079
+ 7080
+ 7081
+ 7082
+ 7083
+ 7084
+ 7085
+ 7086
+ 7087
+ 7088
+ 7089
+ 7090
+ 7091
+ 7092
+ 7093
+ 7094
+ 7095
+ 7096
+ 7097
+ 7098
+ 7099
+ 7100
+ 7101
+ 7102
+ 7103
+ 7104
+ 7105
+ 7106
+ 7107
+ 7108
+ 7109
+ 7110
+ 7111
+ 7112
+ 7113
+ 7114
+ 7115
+ 7116
+ 7117
+ 7118
+ 7119
+ 7120
+ 7121
+ 7122
+ 7123
+ 7124
+ 7125
+ 7126
+ 7127
+ 7128
+ 7129
+ 7130
+ 7131
+ 7132
+ 7133
+ 7134
+ 7135
+ 7136
+ 7137
+ 7138
+ 7139
+ 7140
+ 7141
+ 7142
+ 7143
+ 7144
+ 7145
+ 7146
+ 7147
+ 7148
+ 7149
+ 7150
+ 7151
+ 7152
+ 7153
+ 7154
+ 7155
+ 7156
+ 7157
+ 7158
+ 7159
+ 7160
+ 7161
+ 7162
+ 7163
+ 7164
+ 7165
+ 7166
+ 7167
+ 7168
+ 7169
+ 7170
+ 7171
+ 7172
+ 7173
+ 7174
+ 7175
+ 7176
+ 7177
+ 7178
+ 7179
+ 7180
+ 7181
+ 7182
+ 7183
+ 7184
+ 7185
+ 7186
+ 7187
+ 7188
+ 7189
+ 7190
+ 7191
+ 7192
+ 7193
+ 7194
+ 7195
+ 7196
+ 7197
+ 7198
+ 7199
+ 7200
+ 7201
+ 7202
+ 7203
+ 7204
+ 7205
+ 7206
+ 7207
+ 7208
+ 7209
+ 7210
+ 7211
+ 7212
+ 7213
+ 7214
+ 7215
+ 7216
+ 7217
+ 7218
+ 7219
+ 7220
+ 7221
+ 7222
+ 7223
+ 7224
+ 7225
+ 7226
+ 7227
+ 7228
+ 7229
+ 7230
+ 7231
+ 7232
+ 7233
+ 7234
+ 7235
+ 7236
+ 7237
+ 7238
+ 7239
+ 7240
+ 7241
+ 7242
+ 7243
+ 7244
+ 7245
+ 7246
+ 7247
+ 7248
+ 7249
+ 7250
+ 7251
+ 7252
+ 7253
+ 7254
+ 7255
+ 7256
+ 7257
+ 7258
+ 7259
+ 7260
+ 7261
+ 7262
+ 7263
+ 7264
+ 7265
+ 7266
+ 7267
+ 7268
+ 7269
+ 7270
+ 7271
+ 7272
+ 7273
+ 7274
+ 7275
+ 7276
+ 7277
+ 7278
+ 7279
+ 7280
+ 7281
+ 7282
+ 7283
+ 7284
+ 7285
+ 7286
+ 7287
+ 7288
+ 7289
+ 7290
+ 7291
+ 7292
+ 7293
+ 7294
+ 7295
+ 7296
+ 7297
+ 7298
+ 7299
+ 7300
+ 7301
+ 7302
+ 7303
+ 7304
+ 7305
+ 7306
+ 7307
+ 7308
+ 7309
+ 7310
+ 7311
+ 7312
+ 7313
+ 7314
+ 7315
+ 7316
+ 7317
+ 7318
+ 7319
+ 7320
+ 7321
+ 7322
+ 7323
+ 7324
+ 7325
+ 7326
+ 7327
+ 7328
+ 7329
+ 7330
+ 7331
+ 7332
+ 7333
+ 7334
+ 7335
+ 7336
+ 7337
+ 7338
+ 7339
+ 7340
+ 7341
+ 7342
+ 7343
+ 7344
+ 7345
+ 7346
+ 7347
+ 7348
+ 7349
+ 7350
+ 7351
+ 7352
+ 7353
+ 7354
+ 7355
+ 7356
+ 7357
+ 7358
+ 7359
+ 7360
+ 7361
+ 7362
+ 7363
+ 7364
+ 7365
+ 7366
+ 7367
+ 7368
+ 7369
+ 7370
+ 7371
+ 7372
+ 7373
+ 7374
+ 7375
+ 7376
+ 7377
+ 7378
+ 7379
+ 7380
+ 7381
+ 7382
+ 7383
+ 7384
+ 7385
+ 7386
+ 7387
+ 7388
+ 7389
+ 7390
+ 7391
+ 7392
+ 7393
+ 7394
+ 7395
+ 7396
+ 7397
+ 7398
+ 7399
+ 7400
+ 7401
+ 7402
+ 7403
+ 7404
+ 7405
+ 7406
+ 7407
+ 7408
+ 7409
+ 7410
+ 7411
+ 7412
+ 7413
+ 7414
+ 7415
+ 7416
+ 7417
+ 7418
+ 7419
+ 7420
+ 7421
+ 7422
+ 7423
+ 7424
+ 7425
+ 7426
+ 7427
+ 7428
+ 7429
+ 7430
+ 7431
+ 7432
+ 7433
+ 7434
+ 7435
+ 7436
+ 7437
+ 7438
+ 7439
+ 7440
+ 7441
+ 7442
+ 7443
+ 7444
+ 7445
+ 7446
+ 7447
+ 7448
+ 7449
+ 7450
+ 7451
+ 7452
+ 7453
+ 7454
+ 7455
+ 7456
+ 7457
+ 7458
+ 7459
+ 7460
+ 7461
+ 7462
+ 7463
+ 7464
+ 7465
+ 7466
+ 7467
+ 7468
+ 7469
+ 7470
+ 7471
+ 7472
+ 7473
+ 7474
+ 7475
+ 7476
+ 7477
+ 7478
+ 7479
+ 7480
+ 7481
+ 7482
+ 7483
+ 7484
+ 7485
+ 7486
+ 7487
+ 7488
+ 7489
+ 7490
+ 7491
+ 7492
+ 7493
+ 7494
+ 7495
+ 7496
+ 7497
+ 7498
+ 7499
+ 7500
+ 7501
+ 7502
+ 7503
+ 7504
+ 7505
+ 7506
+ 7507
+ 7508
+ 7509
+ 7510
+ 7511
+ 7512
+ 7513
+ 7514
+ 7515
+ 7516
+ 7517
+ 7518
+ 7519
+ 7520
+ 7521
+ 7522
+ 7523
+ 7524
+ 7525
+ 7526
+ 7527
+ 7528
+ 7529
+ 7530
+ 7531
+ 7532
+ 7533
+ 7534
+ 7535
+ 7536
+ 7537
+ 7538
+ 7539
+ 7540
+ 7541
+ 7542
+ 7543
+ 7544
+ 7545
+ 7546
+ 7547
+ 7548
+ 7549
+ 7550
+ 7551
+ 7552
+ 7553
+ 7554
+ 7555
+ 7556
+ 7557
+ 7558
+ 7559
+ 7560
+ 7561
+ 7562
+ 7563
+ 7564
+ 7565
+ 7566
+ 7567
+ 7568
+ 7569
+ 7570
+ 7571
+ 7572
+ 7573
+ 7574
+ 7575
+ 7576
+ 7577
+ 7578
+ 7579
+ 7580
+ 7581
+ 7582
+ 7583
+ 7584
+ 7585
+ 7586
+ 7587
+ 7588
+ 7589
+ 7590
+ 7591
+ 7592
+ 7593
+ 7594
+ 7595
+ 7596
+ 7597
+ 7598
+ 7599
+ 7600
+ 7601
+ 7602
+ 7603
+ 7604
+ 7605
+ 7606
+ 7607
+ 7608
+ 7609
+ 7610
+ 7611
+ 7612
+ 7613
+ 7614
+ 7615
+ 7616
+ 7617
+ 7618
+ 7619
+ 7620
+ 7621
+ 7622
+ 7623
+ 7624
+ 7625
+ 7626
+ 7627
+ 7628
+ 7629
+ 7630
+ 7631
+ 7632
+ 7633
+ 7634
+ 7635
+ 7636
+ 7637
+ 7638
+ 7639
+ 7640
+ 7641
+ 7642
+ 7643
+ 7644
+ 7645
+ 7646
+ 7647
+ 7648
+ 7649
+ 7650
+ 7651
+ 7652
+ 7653
+ 7654
+ 7655
+ 7656
+ 7657
+ 7658
+ 7659
+ 7660
+ 7661
+ 7662
+ 7663
+ 7664
+ 7665
+ 7666
+ 7667
+ 7668
+ 7669
+ 7670
+ 7671
+ 7672
+ 7673
+ 7674
+ 7675
+ 7676
+ 7677
+ 7678
+ 7679
+ 7680
+ 7681
+ 7682
+ 7683
+ 7684
+ 7685
+ 7686
+ 7687
+ 7688
+ 7689
+ 7690
+ 7691
+ 7692
+ 7693
+ 7694
+ 7695
+ 7696
+ 7697
+ 7698
+ 7699
+ 7700
+ 7701
+ 7702
+ 7703
+ 7704
+ 7705
+ 7706
+ 7707
+ 7708
+ 7709
+ 7710
+ 7711
+ 7712
+ 7713
+ 7714
+ 7715
+ 7716
+ 7717
+ 7718
+ 7719
+ 7720
+ 7721
+ 7722
+ 7723
+ 7724
+ 7725
+ 7726
+ 7727
+ 7728
+ 7729
+ 7730
+ 7731
+ 7732
+ 7733
+ 7734
+ 7735
+ 7736
+ 7737
+ 7738
+ 7739
+ 7740
+ 7741
+ 7742
+ 7743
+ 7744
+ 7745
+ 7746
+ 7747
+ 7748
+ 7749
+ 7750
+ 7751
+ 7752
+ 7753
+ 7754
+ 7755
+ 7756
+ 7757
+ 7758
+ 7759
+ 7760
+ 7761
+ 7762
+ 7763
+ 7764
+ 7765
+ 7766
+ 7767
+ 7768
+ 7769
+ 7770
+ 7771
+ 7772
+ 7773
+ 7774
+ 7775
+ 7776
+ 7777
+ 7778
+ 7779
+ 7780
+ 7781
+ 7782
+ 7783
+ 7784
+ 7785
+ 7786
+ 7787
+ 7788
+ 7789
+ 7790
+ 7791
+ 7792
+ 7793
+ 7794
+ 7795
+ 7796
+ 7797
+ 7798
+ 7799
+ 7800
+ 7801
+ 7802
+ 7803
+ 7804
+ 7805
+ 7806
+ 7807
+ 7808
+ 7809
+ 7810
+ 7811
+ 7812
+ 7813
+ 7814
+ 7815
+ 7816
+ 7817
+ 7818
+ 7819
+ 7820
+ 7821
+ 7822
+ 7823
+ 7824
+ 7825
+ 7826
+ 7827
+ 7828
+ 7829
+ 7830
+ 7831
+ 7832
+ 7833
+ 7834
+ 7835
+ 7836
+ 7837
+ 7838
+ 7839
+ 7840
+ 7841
+ 7842
+ 7843
+ 7844
+ 7845
+ 7846
+ 7847
+ 7848
+ 7849
+ 7850
+ 7851
+ 7852
+ 7853
+ 7854
+ 7855
+ 7856
+ 7857
+ 7858
+ 7859
+ 7860
+ 7861
+ 7862
+ 7863
+ 7864
+ 7865
+ 7866
+ 7867
+ 7868
+ 7869
+ 7870
+ 7871
+ 7872
+ 7873
+ 7874
+ 7875
+ 7876
+ 7877
+ 7878
+ 7879
+ 7880
+ 7881
+ 7882
+ 7883
+ 7884
+ 7885
+ 7886
+ 7887
+ 7888
+ 7889
+ 7890
+ 7891
+ 7892
+ 7893
+ 7894
+ 7895
+ 7896
+ 7897
+ 7898
+ 7899
+ 7900
+ 7901
+ 7902
+ 7903
+ 7904
+ 7905
+ 7906
+ 7907
+ 7908
+ 7909
+ 7910
+ 7911
+ 7912
+ 7913
+ 7914
+ 7915
+ 7916
+ 7917
+ 7918
+ 7919
+ 7920
+ 7921
+ 7922
+ 7923
+ 7924
+ 7925
+ 7926
+ 7927
+ 7928
+ 7929
+ 7930
+ 7931
+ 7932
+ 7933
+ 7934
+ 7935
+ 7936
+ 7937
+ 7938
+ 7939
+ 7940
+ 7941
+ 7942
+ 7943
+ 7944
+ 7945
+ 7946
+ 7947
+ 7948
+ 7949
+ 7950
+ 7951
+ 7952
+ 7953
+ 7954
+ 7955
+ 7956
+ 7957
+ 7958
+ 7959
+ 7960
+ 7961
+ 7962
+ 7963
+ 7964
+ 7965
+ 7966
+ 7967
+ 7968
+ 7969
+ 7970
+ 7971
+ 7972
+ 7973
+ 7974
+ 7975
+ 7976
+ 7977
+ 7978
+ 7979
+ 7980
+ 7981
+ 7982
+ 7983
+ 7984
+ 7985
+ 7986
+ 7987
+ 7988
+ 7989
+ 7990
+ 7991
+ 7992
+ 7993
+ 7994
+ 7995
+ 7996
+ 7997
+ 7998
+ 7999
+ 8000
+ 8001
+ 8002
+ 8003
+ 8004
+ 8005
+ 8006
+ 8007
+ 8008
+ 8009
+ 8010
+ 8011
+ 8012
+ 8013
+ 8014
+ 8015
+ 8016
+ 8017
+ 8018
+ 8019
+ 8020
+ 8021
+ 8022
+ 8023
+ 8024
+ 8025
+ 8026
+ 8027
+ 8028
+ 8029
+ 8030
+ 8031
+ 8032
+ 8033
+ 8034
+ 8035
+ 8036
+ 8037
+ 8038
+ 8039
+ 8040
+ 8041
+ 8042
+ 8043
+ 8044
+ 8045
+ 8046
+ 8047
+ 8048
+ 8049
+ 8050
+ 8051
+ 8052
+ 8053
+ 8054
+ 8055
+ 8056
+ 8057
+ 8058
+ 8059
+ 8060
+ 8061
+ 8062
+ 8063
+ 8064
+ 8065
+ 8066
+ 8067
+ 8068
+ 8069
+ 8070
+ 8071
+ 8072
+ 8073
+ 8074
+ 8075
+ 8076
+ 8077
+ 8078
+ 8079
+ 8080
+ 8081
+ 8082
+ 8083
+ 8084
+ 8085
+ 8086
+ 8087
+ 8088
+ 8089
+ 8090
+ 8091
+ 8092
+ 8093
+ 8094
+ 8095
+ 8096
+ 8097
+ 8098
+ 8099
+ 8100
+ 8101
+ 8102
+ 8103
+ 8104
+ 8105
+ 8106
+ 8107
+ 8108
+ 8109
+ 8110
+ 8111
+ 8112
+ 8113
+ 8114
+ 8115
+ 8116
+ 8117
+ 8118
+ 8119
+ 8120
+ 8121
+ 8122
+ 8123
+ 8124
+ 8125
+ 8126
+ 8127
+ 8128
+ 8129
+ 8130
+ 8131
+ 8132
+ 8133
+ 8134
+ 8135
+ 8136
+ 8137
+ 8138
+ 8139
+ 8140
+ 8141
+ 8142
+ 8143
+ 8144
+ 8145
+ 8146
+ 8147
+ 8148
+ 8149
+ 8150
+ 8151
+ 8152
+ 8153
+ 8154
+ 8155
+ 8156
+ 8157
+ 8158
+ 8159
+ 8160
+ 8161
+ 8162
+ 8163
+ 8164
+ 8165
+ 8166
+ 8167
+ 8168
+ 8169
+ 8170
+ 8171
+ 8172
+ 8173
+ 8174
+ 8175
+ 8176
+ 8177
+ 8178
+ 8179
+ 8180
+ 8181
+ 8182
+ 8183
+ 8184
+ 8185
+ 8186
+ 8187
+ 8188
+ 8189
+ 8190
+ 8191
+ 8192
+ 8193
+ 8194
+ 8195
+ 8196
+ 8197
+ 8198
+ 8199
+ 8200
+ 8201
+ 8202
+ 8203
+ 8204
+ 8205
+ 8206
+ 8207
+ 8208
+ 8209
+ 8210
+ 8211
+ 8212
+ 8213
+ 8214
+ 8215
+ 8216
+ 8217
+ 8218
+ 8219
+ 8220
+ 8221
+ 8222
+ 8223
+ 8224
+ 8225
+ 8226
+ 8227
+ 8228
+ 8229
+ 8230
+ 8231
+ 8232
+ 8233
+ 8234
+ 8235
+ 8236
+ 8237
+ 8238
+ 8239
+ 8240
+ 8241
+ 8242
+ 8243
+ 8244
+ 8245
+ 8246
+ 8247
+ 8248
+ 8249
+ 8250
+ 8251
+ 8252
+ 8253
+ 8254
+ 8255
+ 8256
+ 8257
+ 8258
+ 8259
+ 8260
+ 8261
+ 8262
+ 8263
+ 8264
+ 8265
+ 8266
+ 8267
+ 8268
+ 8269
+ 8270
+ 8271
+ 8272
+ 8273
+ 8274
+ 8275
+ 8276
+ 8277
+ 8278
+ 8279
+ 8280
+ 8281
+ 8282
+ 8283
+ 8284
+ 8285
+ 8286
+ 8287
+ 8288
+ 8289
+ 8290
+ 8291
+ 8292
+ 8293
+ 8294
+ 8295
+ 8296
+ 8297
+ 8298
+ 8299
+ 8300
+ 8301
+ 8302
+ 8303
+ 8304
+ 8305
+ 8306
+ 8307
+ 8308
+ 8309
+ 8310
+ 8311
+ 8312
+ 8313
+ 8314
+ 8315
+ 8316
+ 8317
+ 8318
+ 8319
+ 8320
+ 8321
+ 8322
+ 8323
+ 8324
+ 8325
+ 8326
+ 8327
+ 8328
+ 8329
+ 8330
+ 8331
+ 8332
+ 8333
+ 8334
+ 8335
+ 8336
+ 8337
+ 8338
+ 8339
+ 8340
+ 8341
+ 8342
+ 8343
+ 8344
+ 8345
+ 8346
+ 8347
+ 8348
+ 8349
+ 8350
+ 8351
+ 8352
+ 8353
+ 8354
+ 8355
+ 8356
+ 8357
+ 8358
+ 8359
+ 8360
+ 8361
+ 8362
+ 8363
+ 8364
+ 8365
+ 8366
+ 8367
+ 8368
+ 8369
+ 8370
+ 8371
+ 8372
+ 8373
+ 8374
+ 8375
+ 8376
+ 8377
+ 8378
+ 8379
+ 8380
+ 8381
+ 8382
+ 8383
+ 8384
+ 8385
+ 8386
+ 8387
+ 8388
+ 8389
+ 8390
+ 8391
+ 8392
+ 8393
+ 8394
+ 8395
+ 8396
+ 8397
+ 8398
+ 8399
+ 8400
+ 8401
+ 8402
+ 8403
+ 8404
+ 8405
+ 8406
+ 8407
+ 8408
+ 8409
+ 8410
+ 8411
+ 8412
+ 8413
+ 8414
+ 8415
+ 8416
+ 8417
+ 8418
+ 8419
+ 8420
+ 8421
+ 8422
+ 8423
+ 8424
+ 8425
+ 8426
+ 8427
+ 8428
+ 8429
+ 8430
+ 8431
+ 8432
+ 8433
+ 8434
+ 8435
+ 8436
+ 8437
+ 8438
+ 8439
+ 8440
+ 8441
+ 8442
+ 8443
+ 8444
+ 8445
+ 8446
+ 8447
+ 8448
+ 8449
+ 8450
+ 8451
+ 8452
+ 8453
+ 8454
+ 8455
+ 8456
+ 8457
+ 8458
+ 8459
+ 8460
+ 8461
+ 8462
+ 8463
+ 8464
+ 8465
+ 8466
+ 8467
+ 8468
+ 8469
+ 8470
+ 8471
+ 8472
+ 8473
+ 8474
+ 8475
+ 8476
+ 8477
+ 8478
+ 8479
+ 8480
+ 8481
+ 8482
+ 8483
+ 8484
+ 8485
+ 8486
+ 8487
+ 8488
+ 8489
+ 8490
+ 8491
+ 8492
+ 8493
+ 8494
+ 8495
+ 8496
+ 8497
+ 8498
+ 8499
+ 8500
+ 8501
+ 8502
+ 8503
+ 8504
+ 8505
+ 8506
+ 8507
+ 8508
+ 8509
+ 8510
+ 8511
+ 8512
+ 8513
+ 8514
+ 8515
+ 8516
+ 8517
+ 8518
+ 8519
+ 8520
+ 8521
+ 8522
+ 8523
+ 8524
+ 8525
+ 8526
+ 8527
+ 8528
+ 8529
+ 8530
+ 8531
+ 8532
+ 8533
+ 8534
+ 8535
+ 8536
+ 8537
+ 8538
+ 8539
+ 8540
+ 8541
+ 8542
+ 8543
+ 8544
+ 8545
+ 8546
+ 8547
+ 8548
+ 8549
+ 8550
+ 8551
+ 8552
+ 8553
+ 8554
+ 8555
+ 8556
+ 8557
+ 8558
+ 8559
+ 8560
+ 8561
+ 8562
+ 8563
+ 8564
+ 8565
+ 8566
+ 8567
+ 8568
+ 8569
+ 8570
+ 8571
+ 8572
+ 8573
+ 8574
+ 8575
+ 8576
+ 8577
+ 8578
+ 8579
+ 8580
+ 8581
+ 8582
+ 8583
+ 8584
+ 8585
+ 8586
+ 8587
+ 8588
+ 8589
+ 8590
+ 8591
+ 8592
+ 8593
+ 8594
+ 8595
+ 8596
+ 8597
+ 8598
+ 8599
+ 8600
+ 8601
+ 8602
+ 8603
+ 8604
+ 8605
+ 8606
+ 8607
+ 8608
+ 8609
+ 8610
+ 8611
+ 8612
+ 8613
+ 8614
+ 8615
+ 8616
+ 8617
+ 8618
+ 8619
+ 8620
+ 8621
+ 8622
+ 8623
+ 8624
+ 8625
+ 8626
+ 8627
+ 8628
+ 8629
+ 8630
+ 8631
+ 8632
+ 8633
+ 8634
+ 8635
+ 8636
+ 8637
+ 8638
+ 8639
+ 8640
+ 8641
+ 8642
+ 8643
+ 8644
+ 8645
+ 8646
+ 8647
+ 8648
+ 8649
+ 8650
+ 8651
+ 8652
+ 8653
+ 8654
+ 8655
+ 8656
+ 8657
+ 8658
+ 8659
+ 8660
+ 8661
+ 8662
+ 8663
+ 8664
+ 8665
+ 8666
+ 8667
+ 8668
+ 8669
+ 8670
+ 8671
+ 8672
+ 8673
+ 8674
+ 8675
+ 8676
+ 8677
+ 8678
+ 8679
+ 8680
+ 8681
+ 8682
+ 8683
+ 8684
+ 8685
+ 8686
+ 8687
+ 8688
+ 8689
+ 8690
+ 8691
+ 8692
+ 8693
+ 8694
+ 8695
+ 8696
+ 8697
+ 8698
+ 8699
+ 8700
+ 8701
+ 8702
+ 8703
+ 8704
+ 8705
+ 8706
+ 8707
+ 8708
+ 8709
+ 8710
+ 8711
+ 8712
+ 8713
+ 8714
+ 8715
+ 8716
+ 8717
+ 8718
+ 8719
+ 8720
+ 8721
+ 8722
+ 8723
+ 8724
+ 8725
+ 8726
+ 8727
+ 8728
+ 8729
+ 8730
+ 8731
+ 8732
+ 8733
+ 8734
+ 8735
+ 8736
+ 8737
+ 8738
+ 8739
+ 8740
+ 8741
+ 8742
+ 8743
+ 8744
+ 8745
+ 8746
+ 8747
+ 8748
+ 8749
+ 8750
+ 8751
+ 8752
+ 8753
+ 8754
+ 8755
+ 8756
+ 8757
+ 8758
+ 8759
+ 8760
+ 8761
+ 8762
+ 8763
+ 8764
+ 8765
+ 8766
+ 8767
+ 8768
+ 8769
+ 8770
+ 8771
+ 8772
+ 8773
+ 8774
+ 8775
+ 8776
+ 8777
+ 8778
+ 8779
+ 8780
+ 8781
+ 8782
+ 8783
+ 8784
+ 8785
+ 8786
+ 8787
+ 8788
+ 8789
+ 8790
+ 8791
+ 8792
+ 8793
+ 8794
+ 8795
+ 8796
+ 8797
+ 8798
+ 8799
+ 8800
+ 8801
+ 8802
+ 8803
+ 8804
+ 8805
+ 8806
+ 8807
+ 8808
+ 8809
+ 8810
+ 8811
+ 8812
+ 8813
+ 8814
+ 8815
+ 8816
+ 8817
+ 8818
+ 8819
+ 8820
+ 8821
+ 8822
+ 8823
+ 8824
+ 8825
+ 8826
+ 8827
+ 8828
+ 8829
+ 8830
+ 8831
+ 8832
+ 8833
+ 8834
+ 8835
+ 8836
+ 8837
+ 8838
+ 8839
+ 8840
+ 8841
+ 8842
+ 8843
+ 8844
+ 8845
+ 8846
+ 8847
+ 8848
+ 8849
+ 8850
+ 8851
+ 8852
+ 8853
+ 8854
+ 8855
+ 8856
+ 8857
+ 8858
+ 8859
+ 8860
+ 8861
+ 8862
+ 8863
+ 8864
+ 8865
+ 8866
+ 8867
+ 8868
+ 8869
+ 8870
+ 8871
+ 8872
+ 8873
+ 8874
+ 8875
+ 8876
+ 8877
+ 8878
+ 8879
+ 8880
+ 8881
+ 8882
+ 8883
+ 8884
+ 8885
+ 8886
+ 8887
+ 8888
+ 8889
+ 8890
+ 8891
+ 8892
+ 8893
+ 8894
+ 8895
+ 8896
+ 8897
+ 8898
+ 8899
+ 8900
+ 8901
+ 8902
+ 8903
+ 8904
+ 8905
+ 8906
+ 8907
+ 8908
+ 8909
+ 8910
+ 8911
+ 8912
+ 8913
+ 8914
+ 8915
+ 8916
+ 8917
+ 8918
+ 8919
+ 8920
+ 8921
+ 8922
+ 8923
+ 8924
+ 8925
+ 8926
+ 8927
+ 8928
+ 8929
+ 8930
+ 8931
+ 8932
+ 8933
+ 8934
+ 8935
+ 8936
+ 8937
+ 8938
+ 8939
+ 8940
+ 8941
+ 8942
+ 8943
+ 8944
+ 8945
+ 8946
+ 8947
+ 8948
+ 8949
+ 8950
+ 8951
+ 8952
+ 8953
+ 8954
+ 8955
+ 8956
+ 8957
+ 8958
+ 8959
+ 8960
+ 8961
+ 8962
+ 8963
+ 8964
+ 8965
+ 8966
+ 8967
+ 8968
+ 8969
+ 8970
+ 8971
+ 8972
+ 8973
+ 8974
+ 8975
+ 8976
+ 8977
+ 8978
+ 8979
+ 8980
+ 8981
+ 8982
+ 8983
+ 8984
+ 8985
+ 8986
+ 8987
+ 8988
+ 8989
+ 8990
+ 8991
+ 8992
+ 8993
+ 8994
+ 8995
+ 8996
+ 8997
+ 8998
+ 8999
+ 9000
+ 9001
+ 9002
+ 9003
+ 9004
+ 9005
+ 9006
+ 9007
+ 9008
+ 9009
+ 9010
+ 9011
+ 9012
+ 9013
+ 9014
+ 9015
+ 9016
+ 9017
+ 9018
+ 9019
+ 9020
+ 9021
+ 9022
+ 9023
+ 9024
+ 9025
+ 9026
+ 9027
+ 9028
+ 9029
+ 9030
+ 9031
+ 9032
+ 9033
+ 9034
+ 9035
+ 9036
+ 9037
+ 9038
+ 9039
+ 9040
+ 9041
+ 9042
+ 9043
+ 9044
+ 9045
+ 9046
+ 9047
+ 9048
+ 9049
+ 9050
+ 9051
+ 9052
+ 9053
+ 9054
+ 9055
+ 9056
+ 9057
+ 9058
+ 9059
+ 9060
+ 9061
+ 9062
+ 9063
+ 9064
+ 9065
+ 9066
+ 9067
+ 9068
+ 9069
+ 9070
+ 9071
+ 9072
+ 9073
+ 9074
+ 9075
+ 9076
+ 9077
+ 9078
+ 9079
+ 9080
+ 9081
+ 9082
+ 9083
+ 9084
+ 9085
+ 9086
+ 9087
+ 9088
+ 9089
+ 9090
+ 9091
+ 9092
+ 9093
+ 9094
+ 9095
+ 9096
+ 9097
+ 9098
+ 9099
+ 9100
+ 9101
+ 9102
+ 9103
+ 9104
+ 9105
+ 9106
+ 9107
+ 9108
+ 9109
+ 9110
+ 9111
+ 9112
+ 9113
+ 9114
+ 9115
+ 9116
+ 9117
+ 9118
+ 9119
+ 9120
+ 9121
+ 9122
+ 9123
+ 9124
+ 9125
+ 9126
+ 9127
+ 9128
+ 9129
+ 9130
+ 9131
+ 9132
+ 9133
+ 9134
+ 9135
+ 9136
+ 9137
+ 9138
+ 9139
+ 9140
+ 9141
+ 9142
+ 9143
+ 9144
+ 9145
+ 9146
+ 9147
+ 9148
+ 9149
+ 9150
+ 9151
+ 9152
+ 9153
+ 9154
+ 9155
+ 9156
+ 9157
+ 9158
+ 9159
+ 9160
+ 9161
+ 9162
+ 9163
+ 9164
+ 9165
+ 9166
+ 9167
+ 9168
+ 9169
+ 9170
+ 9171
+ 9172
+ 9173
+ 9174
+ 9175
+ 9176
+ 9177
+ 9178
+ 9179
+ 9180
+ 9181
+ 9182
+ 9183
+ 9184
+ 9185
+ 9186
+ 9187
+ 9188
+ 9189
+ 9190
+ 9191
+ 9192
+ 9193
+ 9194
+ 9195
+ 9196
+ 9197
+ 9198
+ 9199
+ 9200
+ 9201
+ 9202
+ 9203
+ 9204
+ 9205
+ 9206
+ 9207
+ 9208
+ 9209
+ 9210
+ 9211
+ 9212
+ 9213
+ 9214
+ 9215
+ 9216
+ 9217
+ 9218
+ 9219
+ 9220
+ 9221
+ 9222
+ 9223
+ 9224
+ 9225
+ 9226
+ 9227
+ 9228
+ 9229
+ 9230
+ 9231
+ 9232
+ 9233
+ 9234
+ 9235
+ 9236
+ 9237
+ 9238
+ 9239
+ 9240
+ 9241
+ 9242
+ 9243
+ 9244
+ 9245
+ 9246
+ 9247
+ 9248
+ 9249
+ 9250
+ 9251
+ 9252
+ 9253
+ 9254
+ 9255
+ 9256
+ 9257
+ 9258
+ 9259
+ 9260
+ 9261
+ 9262
+ 9263
+ 9264
+ 9265
+ 9266
+ 9267
+ 9268
+ 9269
+ 9270
+ 9271
+ 9272
+ 9273
+ 9274
+ 9275
+ 9276
+ 9277
+ 9278
+ 9279
+ 9280
+ 9281
+ 9282
+ 9283
+ 9284
+ 9285
+ 9286
+ 9287
+ 9288
+ 9289
+ 9290
+ 9291
+ 9292
+ 9293
+ 9294
+ 9295
+ 9296
+ 9297
+ 9298
+ 9299
+ 9300
+ 9301
+ 9302
+ 9303
+ 9304
+ 9305
+ 9306
+ 9307
+ 9308
+ 9309
+ 9310
+ 9311
+ 9312
+ 9313
+ 9314
+ 9315
+ 9316
+ 9317
+ 9318
+ 9319
+ 9320
+ 9321
+ 9322
+ 9323
+ 9324
+ 9325
+ 9326
+ 9327
+ 9328
+ 9329
+ 9330
+ 9331
+ 9332
+ 9333
+ 9334
+ 9335
+ 9336
+ 9337
+ 9338
+ 9339
+ 9340
+ 9341
+ 9342
+ 9343
+ 9344
+ 9345
+ 9346
+ 9347
+ 9348
+ 9349
+ 9350
+ 9351
+ 9352
+ 9353
+ 9354
+ 9355
+ 9356
+ 9357
+ 9358
+ 9359
+ 9360
+ 9361
+ 9362
+ 9363
+ 9364
+ 9365
+ 9366
+ 9367
+ 9368
+ 9369
+ 9370
+ 9371
+ 9372
+ 9373
+ 9374
+ 9375
+ 9376
+ 9377
+ 9378
+ 9379
+ 9380
+ 9381
+ 9382
+ 9383
+ 9384
+ 9385
+ 9386
+ 9387
+ 9388
+ 9389
+ 9390
+ 9391
+ 9392
+ 9393
+ 9394
+ 9395
+ 9396
+ 9397
+ 9398
+ 9399
+ 9400
+ 9401
+ 9402
+ 9403
+ 9404
+ 9405
+ 9406
+ 9407
+ 9408
+ 9409
+ 9410
+ 9411
+ 9412
+ 9413
+ 9414
+ 9415
+ 9416
+ 9417
+ 9418
+ 9419
+ 9420
+ 9421
+ 9422
+ 9423
+ 9424
+ 9425
+ 9426
+ 9427
+ 9428
+ 9429
+ 9430
+ 9431
+ 9432
+ 9433
+ 9434
+ 9435
+ 9436
+ 9437
+ 9438
+ 9439
+ 9440
+ 9441
+ 9442
+ 9443
+ 9444
+ 9445
+ 9446
+ 9447
+ 9448
+ 9449
+ 9450
+ 9451
+ 9452
+ 9453
+ 9454
+ 9455
+ 9456
+ 9457
+ 9458
+ 9459
+ 9460
+ 9461
+ 9462
+ 9463
+ 9464
+ 9465
+ 9466
+ 9467
+ 9468
+ 9469
+ 9470
+ 9471
+ 9472
+ 9473
+ 9474
+ 9475
+ 9476
+ 9477
+ 9478
+ 9479
+ 9480
+ 9481
+ 9482
+ 9483
+ 9484
+ 9485
+ 9486
+ 9487
+ 9488
+ 9489
+ 9490
+ 9491
+ 9492
+ 9493
+ 9494
+ 9495
+ 9496
+ 9497
+ 9498
+ 9499
+ 9500
+ 9501
+ 9502
+ 9503
+ 9504
+ 9505
+ 9506
+ 9507
+ 9508
+ 9509
+ 9510
+ 9511
+ 9512
+ 9513
+ 9514
+ 9515
+ 9516
+ 9517
+ 9518
+ 9519
+ 9520
+ 9521
+ 9522
+ 9523
+ 9524
+ 9525
+ 9526
+ 9527
+ 9528
+ 9529
+ 9530
+ 9531
+ 9532
+ 9533
+ 9534
+ 9535
+ 9536
+ 9537
+ 9538
+ 9539
+ 9540
+ 9541
+ 9542
+ 9543
+ 9544
+ 9545
+ 9546
+ 9547
+ 9548
+ 9549
+ 9550
+ 9551
+ 9552
+ 9553
+ 9554
+ 9555
+ 9556
+ 9557
+ 9558
+ 9559
+ 9560
+ 9561
+ 9562
+ 9563
+ 9564
+ 9565
+ 9566
+ 9567
+ 9568
+ 9569
+ 9570
+ 9571
+ 9572
+ 9573
+ 9574
+ 9575
+ 9576
+ 9577
+ 9578
+ 9579
+ 9580
+ 9581
+ 9582
+ 9583
+ 9584
+ 9585
+ 9586
+ 9587
+ 9588
+ 9589
+ 9590
+ 9591
+ 9592
+ 9593
+ 9594
+ 9595
+ 9596
+ 9597
+ 9598
+ 9599
+ 9600
+ 9601
+ 9602
+ 9603
+ 9604
+ 9605
+ 9606
+ 9607
+ 9608
+ 9609
+ 9610
+ 9611
+ 9612
+ 9613
+ 9614
+ 9615
+ 9616
+ 9617
+ 9618
+ 9619
+ 9620
+ 9621
+ 9622
+ 9623
+ 9624
+ 9625
+ 9626
+ 9627
+ 9628
+ 9629
+ 9630
+ 9631
+ 9632
+ 9633
+ 9634
+ 9635
+ 9636
+ 9637
+ 9638
+ 9639
+ 9640
+ 9641
+ 9642
+ 9643
+ 9644
+ 9645
+ 9646
+ 9647
+ 9648
+ 9649
+ 9650
+ 9651
+ 9652
+ 9653
+ 9654
+ 9655
+ 9656
+ 9657
+ 9658
+ 9659
+ 9660
+ 9661
+ 9662
+ 9663
+ 9664
+ 9665
+ 9666
+ 9667
+ 9668
+ 9669
+ 9670
+ 9671
+ 9672
+ 9673
+ 9674
+ 9675
+ 9676
+ 9677
+ 9678
+ 9679
+ 9680
+ 9681
+ 9682
+ 9683
+ 9684
+ 9685
+ 9686
+ 9687
+ 9688
+ 9689
+ 9690
+ 9691
+ 9692
+ 9693
+ 9694
+ 9695
+ 9696
+ 9697
+ 9698
+ 9699
+ 9700
+ 9701
+ 9702
+ 9703
+ 9704
+ 9705
+ 9706
+ 9707
+ 9708
+ 9709
+ 9710
+ 9711
+ 9712
+ 9713
+ 9714
+ 9715
+ 9716
+ 9717
+ 9718
+ 9719
+ 9720
+ 9721
+ 9722
+ 9723
+ 9724
+ 9725
+ 9726
+ 9727
+ 9728
+ 9729
+ 9730
+ 9731
+ 9732
+ 9733
+ 9734
+ 9735
+ 9736
+ 9737
+ 9738
+ 9739
+ 9740
+ 9741
+ 9742
+ 9743
+ 9744
+ 9745
+ 9746
+ 9747
+ 9748
+ 9749
+ 9750
+ 9751
+ 9752
+ 9753
+ 9754
+ 9755
+ 9756
+ 9757
+ 9758
+ 9759
+ 9760
+ 9761
+ 9762
+ 9763
+ 9764
+ 9765
+ 9766
+ 9767
+ 9768
+ 9769
+ 9770
+ 9771
+ 9772
+ 9773
+ 9774
+ 9775
+ 9776
+ 9777
+ 9778
+ 9779
+ 9780
+ 9781
+ 9782
+ 9783
+ 9784
+ 9785
+ 9786
+ 9787
+ 9788
+ 9789
+ 9790
+ 9791
+ 9792
+ 9793
+ 9794
+ 9795
+ 9796
+ 9797
+ 9798
+ 9799
+ 9800
+ 9801
+ 9802
+ 9803
+ 9804
+ 9805
+ 9806
+ 9807
+ 9808
+ 9809
+ 9810
+ 9811
+ 9812
+ 9813
+ 9814
+ 9815
+ 9816
+ 9817
+ 9818
+ 9819
+ 9820
+ 9821
+ 9822
+ 9823
+ 9824
+ 9825
+ 9826
+ 9827
+ 9828
+ 9829
+ 9830
+ 9831
+ 9832
+ 9833
+ 9834
+ 9835
+ 9836
+ 9837
+ 9838
+ 9839
+ 9840
+ 9841
+ 9842
+ 9843
+ 9844
+ 9845
+ 9846
+ 9847
+ 9848
+ 9849
+ 9850
+ 9851
+ 9852
+ 9853
+ 9854
+ 9855
+ 9856
+ 9857
+ 9858
+ 9859
+ 9860
+ 9861
+ 9862
+ 9863
+ 9864
+ 9865
+ 9866
+ 9867
+ 9868
+ 9869
+ 9870
+ 9871
+ 9872
+ 9873
+ 9874
+ 9875
+ 9876
+ 9877
+ 9878
+ 9879
+ 9880
+ 9881
+ 9882
+ 9883
+ 9884
+ 9885
+ 9886
+ 9887
+ 9888
+ 9889
+ 9890
+ 9891
+ 9892
+ 9893
+ 9894
+ 9895
+ 9896
+ 9897
+ 9898
+ 9899
+ 9900
+ 9901
+ 9902
+ 9903
+ 9904
+ 9905
+ 9906
+ 9907
+ 9908
+ 9909
+ 9910
+ 9911
+ 9912
+ 9913
+ 9914
+ 9915
+ 9916
+ 9917
+ 9918
+ 9919
+ 9920
+ 9921
+ 9922
+ 9923
+ 9924
+ 9925
+ 9926
+ 9927
+ 9928
+ 9929
+ 9930
+ 9931
+ 9932
+ 9933
+ 9934
+ 9935
+ 9936
+ 9937
+ 9938
+ 9939
+ 9940
+ 9941
+ 9942
+ 9943
+ 9944
+ 9945
+ 9946
+ 9947
+ 9948
+ 9949
+ 9950
+ 9951
+ 9952
+ 9953
+ 9954
+ 9955
+ 9956
+ 9957
+ 9958
+ 9959
+ 9960
+ 9961
+ 9962
+ 9963
+ 9964
+ 9965
+ 9966
+ 9967
+ 9968
+ 9969
+ 9970
+ 9971
+ 9972
+ 9973
+ 9974
+ 9975
+ 9976
+ 9977
+ 9978
+ 9979
+ 9980
+ 9981
+ 9982
+ 9983
+ 9984
+ 9985
+ 9986
+ 9987
+ 9988
+ 9989
+ 9990
+ 9991
+ 9992
+ 9993
+ 9994
+ 9995
+ 9996
+ 9997
+ 9998
+ 9999
+10000
+10001
+10002
+10003
+10004
+10005
+10006
+10007
+10008
+10009
+10010
+10011
+10012
+10013
+10014
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
+10032
+10033
+10034
+10035
+10036
+10037
+10038
+10039
+10040
+10041
+10042
+10043
+10044
+10045
+10046
+10047
+10048
+10049
+10050
+10051
+10052
+10053
+10054
+10055
+10056
+10057
+10058
+10059
+10060
+10061
+10062
+10063
+10064
+10065
+10066
+10067
+10068
+10069
+10070
+10071
+10072
+10073
+10074
+10075
+10076
+10077
+10078
+10079
+10080
+10081
+10082
+10083
+10084
+10085
+10086
+10087
+10088
+10089
+10090
+10091
+10092
+10093
+10094
+10095
+10096
+10097
+10098
+10099
+10100
+10101
+10102
+10103
+10104
+10105
+10106
+10107
+10108
+10109
+10110
+10111
+10112
+10113
+10114
+10115
+10116
+10117
+10118
+10119
+10120
+10121
+10122
+10123
+10124
+10125
+10126
+10127
+10128
+10129
+10130
+10131
+10132
+10133
+10134
+10135
+10136
+10137
+10138
+10139
+10140
+10141
+10142
+10143
+10144
+10145
+10146
+10147
+10148
+10149
+10150
+10151
+10152
+10153
+10154
+10155
+10156
+10157
+10158
+10159
+10160
+10161
+10162
+10163
+10164
+10165
+10166
+10167
+10168
+10169
+10170
+10171
+10172
+10173
+10174
+10175
+10176
+10177
+10178
+10179
+10180
+10181
+10182
+10183
+10184
+10185
+10186
+10187
+10188
+10189
+10190
+10191
+10192
+10193
+10194
+10195
+10196
+10197
+10198
+10199
+10200
+10201
+10202
+10203
+10204
+10205
+10206
+10207
+10208
+10209
+10210
+10211
+10212
+10213
+10214
+10215
+10216
+10217
+10218
+10219
+10220
+10221
+10222
+10223
+10224
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+10255
+10256
+10257
+10258
+10259
+10260
+10261
+10262
+10263
+10264
+10265
+10266
+10267
+10268
+10269
+10270
+10271
+10272
+10273
+10274
+10275
+10276
+10277
+10278
+10279
+10280
+10281
+10282
+10283
+10284
+10285
+10286
+10287
+10288
+10289
+10290
+10291
+10292
+10293
+10294
+10295
+10296
+10297
+10298
+10299
+10300
+10301
+10302
+10303
+10304
+10305
+10306
+10307
+10308
+10309
+10310
+10311
+10312
+10313
+10314
+10315
+10316
+10317
+10318
+10319
+10320
+10321
+10322
+10323
+10324
+10325
+10326
+10327
+10328
+10329
+10330
+10331
+10332
+10333
+10334
+10335
+10336
+10337
+10338
+10339
+10340
+10341
+10342
+10343
+10344
+10345
+10346
+10347
+10348
+10349
+10350
+10351
+10352
+10353
+10354
+10355
+10356
+10357
+10358
+10359
+10360
+10361
+10362
+10363
+10364
+10365
+10366
+10367
+10368
+10369
+10370
+10371
+10372
+10373
+10374
+10375
+10376
+10377
+10378
+10379
+10380
+10381
+10382
+10383
+10384
+10385
+10386
+10387
+10388
+10389
+10390
+10391
+10392
+10393
+10394
+10395
+10396
+10397
+10398
+10399
+10400
+10401
+10402
+10403
+10404
+10405
+10406
+10407
+10408
+10409
+10410
+10411
+10412
+10413
+10414
+10415
+10416
+10417
+10418
+10419
+10420
+10421
+10422
+10423
+10424
+10425
+10426
+10427
+10428
+10429
+10430
+10431
+10432
+10433
+10434
+10435
+10436
+10437
+10438
+10439
+10440
+10441
+10442
+10443
+10444
+10445
+10446
+10447
+10448
+10449
+10450
+10451
+10452
+10453
+10454
+10455
+10456
+10457
+10458
+10459
+10460
+10461
+10462
+10463
+10464
+10465
+10466
+10467
+10468
+10469
+10470
+10471
+10472
+10473
+10474
+10475
+10476
+10477
+10478
+10479
+10480
+10481
+10482
+10483
+10484
+10485
+10486
+10487
+10488
+10489
+10490
+10491
+10492
+10493
+10494
+10495
+10496
+10497
+10498
+10499
+10500
+10501
+10502
+10503
+10504
+10505
+10506
+10507
+10508
+10509
+10510
+10511
+10512
+10513
+10514
+10515
+10516
+10517
+10518
+10519
+10520
+10521
+10522
+10523
+10524
+10525
+10526
+10527
+10528
+10529
+10530
+10531
+10532
+10533
+10534
+10535
+10536
+10537
+10538
+10539
+10540
+10541
+10542
+10543
+10544
+10545
+10546
+10547
+10548
+10549
+10550
+10551
+10552
+10553
+10554
+10555
+10556
+10557
+10558
+10559
+10560
+10561
+10562
+10563
+10564
+10565
+10566
+10567
+10568
+10569
+10570
+10571
+10572
+10573
+10574
+10575
+10576
+10577
+10578
+10579
+10580
+10581
+10582
+10583
+10584
+10585
+10586
+10587
+10588
+10589
+10590
+10591
+10592
+10593
+10594
+10595
+10596
+10597
+10598
+10599
+10600
+10601
+10602
+10603
+10604
+10605
+10606
+10607
+10608
+10609
+10610
+10611
+10612
+10613
+10614
+10615
+10616
+10617
+10618
+10619
+10620
+10621
+10622
+10623
+10624
+10625
+10626
+10627
+10628
+10629
+10630
+10631
+10632
+10633
+10634
+10635
+10636
+10637
+10638
+10639
+10640
+10641
+10642
+10643
+10644
+10645
+10646
+10647
+10648
+10649
+10650
+10651
+10652
+10653
+10654
+10655
+10656
+10657
+10658
+10659
+10660
+10661
+10662
+10663
+10664
+10665
+10666
+10667
+10668
+10669
+10670
+10671
+10672
+10673
+10674
+10675
+10676
+10677
+10678
+10679
+10680
+10681
+10682
+10683
+10684
+10685
+10686
+10687
+10688
+10689
+10690
+10691
+10692
+10693
+10694
+10695
+10696
+10697
+10698
+10699
+10700
+10701
+10702
+10703
+10704
+10705
+10706
+10707
+10708
+10709
+10710
+10711
+10712
+10713
+10714
+10715
+10716
+10717
+10718
+10719
+10720
+10721
+10722
+10723
+10724
+10725
+10726
+10727
+10728
+10729
+10730
+10731
+10732
+10733
+10734
+10735
+10736
+10737
+10738
+10739
+10740
+10741
+10742
+10743
+10744
+10745
+10746
+10747
+10748
+10749
+10750
+10751
+10752
+10753
+10754
+10755
+10756
+10757
+10758
+10759
+10760
+10761
+10762
+10763
+10764
+10765
+10766
+10767
+10768
+10769
+10770
+10771
+10772
+10773
+10774
+10775
+10776
+10777
+10778
+10779
+10780
+10781
+10782
+10783
+10784
+10785
+10786
+10787
+10788
+10789
+10790
+10791
+10792
+10793
+10794
+10795
+10796
+10797
+10798
+10799
+10800
+10801
+10802
+10803
+10804
+10805
+10806
+10807
+10808
+10809
+10810
+10811
+10812
+10813
+10814
+10815
+10816
+10817
+10818
+10819
+10820
+10821
+10822
+10823
+10824
+10825
+10826
+10827
+10828
+10829
+10830
+10831
+10832
+10833
+10834
+10835
+10836
+10837
+10838
+10839
+10840
+10841
+10842
+10843
+10844
+10845
+10846
+10847
+10848
+10849
+10850
+10851
+10852
+10853
+10854
+10855
+10856
+10857
+10858
+10859
+10860
+10861
+10862
+10863
+10864
+10865
+10866
+10867
+10868
+10869
+10870
+10871
+10872
+10873
+10874
+10875
+10876
+10877
+10878
+10879
+10880
+10881
+10882
+10883
+10884
+10885
+10886
+10887
+10888
+10889
+10890
+10891
+10892
+10893
+10894
+10895
+10896
+10897
+10898
+10899
+10900
+10901
+10902
+10903
+10904
+10905
+10906
+10907
+10908
+10909
+10910
+10911
+10912
+10913
+10914
+10915
+10916
+10917
+10918
+10919
+10920
+10921
+10922
+10923
+10924
+10925
+10926
+10927
+10928
+10929
+10930
+10931
+10932
+10933
+10934
+10935
+10936
+10937
+10938
+10939
+10940
+10941
+10942
+10943
+10944
+10945
+10946
+10947
+10948
+10949
+10950
+10951
+10952
+10953
+10954
+10955
+10956
+10957
+10958
+10959
+10960
+10961
+10962
+10963
+10964
+10965
+10966
+10967
+10968
+10969
+10970
+10971
+10972
+10973
+10974
+10975
+10976
+10977
+10978
+10979
+10980
+10981
+10982
+10983
+10984
+10985
+10986
+10987
+10988
+10989
+10990
+10991
+10992
+10993
+10994
+10995
+10996
+10997
+10998
+10999
+11000
+11001
+11002
+11003
+11004
+11005
+11006
+11007
+11008
+11009
+11010
+11011
+11012
+11013
+11014
+11015
+11016
+11017
+11018
+11019
+11020
+11021
+11022
+11023
+11024
+11025
+11026
+11027
+11028
+11029
+11030
+11031
+11032
+11033
+11034
+11035
+11036
+11037
+11038
+11039
+11040
+11041
+11042
+11043
+11044
+11045
+11046
+11047
+11048
+11049
+11050
+11051
+11052
+11053
+11054
+11055
+11056
+11057
+11058
+11059
+11060
+11061
+11062
+11063
+11064
+11065
+11066
+11067
+11068
+11069
+11070
+11071
+11072
+11073
+11074
+11075
+11076
+11077
+11078
+11079
+11080
+11081
+11082
+11083
+11084
+11085
+11086
+11087
+11088
+11089
+11090
+11091
+11092
+11093
+11094
+11095
+11096
+11097
+11098
+11099
+11100
+11101
+11102
+11103
+11104
+11105
+11106
+11107
+11108
+11109
+11110
+11111
+11112
+11113
+11114
+11115
+11116
+11117
+11118
+11119
+11120
+11121
+11122
+11123
+11124
+11125
+11126
+11127
+11128
+11129
+11130
+11131
+11132
+11133
+11134
+11135
+11136
+11137
+11138
+11139
+11140
+11141
+11142
+11143
+11144
+11145
+11146
+11147
+11148
+11149
+11150
+11151
+11152
+11153
+11154
+11155
+11156
+11157
+11158
+11159
+11160
+11161
+11162
+11163
+11164
+11165
+11166
+11167
+11168
+11169
+11170
+11171
+11172
+11173
+11174
+11175
+11176
+11177
+11178
+11179
+11180
+11181
+11182
+11183
+11184
+11185
+11186
+11187
+11188
+11189
+11190
+11191
+11192
+11193
+11194
+11195
+11196
+11197
+11198
+11199
+11200
+11201
+11202
+11203
+11204
+11205
+11206
+11207
+11208
+11209
+11210
+11211
+11212
+11213
+11214
+11215
+11216
+11217
+11218
+11219
+11220
+11221
+11222
+11223
+11224
+11225
+11226
+11227
+11228
+11229
+11230
+11231
+11232
+11233
+11234
+11235
+11236
+11237
+11238
+11239
+11240
+11241
+11242
+11243
+11244
+11245
+11246
+11247
+11248
+11249
+11250
+11251
+11252
+11253
+11254
+11255
+11256
+11257
+11258
+11259
+11260
+11261
+11262
+11263
+11264
+11265
+11266
+11267
+11268
+11269
+11270
+11271
+11272
+11273
+11274
+11275
+11276
+
+
(*
+This module is the backend of the Motoko compiler. It takes a program in
+the intermediate representation (ir.ml), and produces a WebAssembly module,
+with Internet Computer extensions (customModule.ml). An important helper module is
+instrList.ml, which provides a more convenient way of assembling WebAssembly
+instruction lists, as it takes care of (1) source locations and (2) labels.
+
+This file is split up in a number of modules, purely for namespacing and
+grouping. Every module has a high-level prose comment explaining the concept;
+this keeps documentation close to the code (a lesson learned from Simon PJ).
+*)
+
+open Ir_def
+open Mo_values
+open Mo_types
+open Mo_config
+
+open Wasm_exts.Ast
+open Wasm.Types
+open Source
+(* Re-shadow Source.(@@), to get Stdlib.(@@) *)
+let (@@) = Stdlib.(@@)
+
+module G = InstrList
+let (^^) = G.(^^) (* is this how we import a single operator from a module that we otherwise use qualified? *)
+
+(* WebAssembly pages are 64kb. *)
+let page_size = Int32.of_int (64*1024)
+let page_size64 = Int64.of_int32 page_size
+let page_size_bits = 16
+
+(*
+Pointers are skewed (translated) -1 relative to the actual offset.
+See documentation of module BitTagged for more detail.
+*)
+let ptr_skew = -1l
+let ptr_unskew = 1l
+
+(* Generating function names for functions parametrized by prim types *)
+let prim_fun_name p stem = Printf.sprintf "%s<%s>" stem (Type.string_of_prim p)
+
+(* Helper functions to produce annotated terms (Wasm.AST) *)
+let nr x = Wasm.Source.{ it = x; at = no_region }
+
+let todo fn se x = Printf.eprintf "%s: %s" fn (Wasm.Sexpr.to_string 80 se); x
+
+exception CodegenError of string
+let fatal fmt = Printf.ksprintf (fun s -> raise (CodegenError s)) fmt
+
+module StaticBytes = struct
+  (* A very simple DSL to describe static memory *)
+
+  type t_ =
+    | I32 of int32
+    | I64 of int64
+    | Seq of t
+    | Bytes of string
+
+  and t = t_ list
+
+  let i32s is = Seq (List.map (fun i -> I32 i) is)
+
+  let rec add : Buffer.t -> t_ -> unit = fun buf -> function
+    | I32 i -> Buffer.add_int32_le buf i
+    | I64 i -> Buffer.add_int64_le buf i
+    | Seq xs -> List.iter (add buf) xs
+    | Bytes b -> Buffer.add_string buf b
+
+  let as_bytes : t -> string = fun xs ->
+    let buf = Buffer.create 16 in
+    List.iter (add buf) xs;
+    Buffer.contents buf
+
+end (* StaticBytes *)
+
+module Const = struct
+
+  (* Literals, as used in constant values. This is a projection of Ir.Lit,
+     combining cases whose details we no longer care about.
+     Should be still precise enough to map to the cases supported by SR.t.
+
+     In other words: It is the smallest type that allows these three functions:
+
+       (* projection of Ir.list. NB: pure, no access to env *)
+       const_lit_of_lit : Ir.lit -> Const.lit (* NB: pure, no access to env *)
+
+       (* creates vanilla representation (e.g. to put in static data structures *)
+       vanilla_lit : E.env -> Const.lit -> i32
+
+       (* creates efficient stack representation *)
+       compile_lit : E.env -> Const.lit -> (SR.t, code)
+
+  *)
+
+  type lit =
+    | Vanilla of int32 (* small words, no static data, already in vanilla format *)
+    | BigInt of Big_int.big_int
+    | Bool of bool
+    | Word32 of int32
+    | Word64 of int64
+    | Float64 of Numerics.Float.t
+    | Blob of string
+    | Null
+
+  let lit_eq = function
+    | Vanilla i, Vanilla j -> i = j
+    | BigInt i, BigInt j -> Big_int.eq_big_int i j
+    | Word32 i, Word32 j -> i = j
+    | Word64 i, Word64 j -> i = j
+    | Float64 i, Float64 j -> i = j
+    | Bool i, Bool j -> i = j
+    | Blob s, Blob t -> s = t
+    | Null, Null -> true
+    | _ -> false
+
+  (* Inlineable functions
+
+     The prelude/prim.mo is full of functions simply wrapping a prim, e.g.
+
+        func int64ToNat64(n : Int64) : Nat64 = (prim "num_wrap_Int64_Nat64" : Int64 -> Nat64) n;
+
+     generating a Wasm function for them and calling them is absurdly expensive
+     when the prim is just a simple Wasm instruction. Also, it requires boxing
+     and unboxing arguments and results.
+
+     So we recognize such functions when creating the `const` summary, and use the prim
+     directly when calling such function.
+
+     Can be extended to cover more forms of inlineable functions.
+  *)
+  type fun_rhs =
+    | Complicated (* no inlining possible *)
+    | PrimWrapper of Ir.prim
+
+  (* Constant known values.
+
+     These are values that
+     * are completely known constantly
+     * do not require Wasm code to be executed (e.g. in `start`)
+     * can be used directly (e.g. Call, not CallIndirect)
+     * can be turned into Vanilla heap data on demand
+
+     See ir_passes/const.ml for what precisely we can compile as const now.
+  *)
+
+  type v =
+    | Fun of (unit -> int32) * fun_rhs (* function pointer calculated upon first use *)
+    | Message of int32 (* anonymous message, only temporary *)
+    | Obj of (string * t) list
+    | Unit
+    | Array of t list (* also tuples, but not nullary *)
+    | Tag of (string * t)
+    | Opt of t
+    | Lit of lit
+
+  (* A constant known value together with a vanilla pointer.
+     Typically a static memory location, could be an unboxed scalar.
+     Filled on demand.
+   *)
+  and t = (int32 Lib.Promise.t * v)
+
+  let t_of_v v = (Lib.Promise.make (), v)
+
+end (* Const *)
+
+module SR = struct
+  (* This goes with the StackRep module, but we need the types earlier *)
+
+  (* Value representation on the stack:
+
+     Compiling an expression means putting its value on the stack. But
+     there are various ways of putting a value onto the stack -- unboxed,
+     tupled etc.
+   *)
+  type t =
+    | Vanilla
+    | UnboxedTuple of int
+    | UnboxedWord64
+    | UnboxedWord32
+    | UnboxedFloat64
+    | Unreachable
+    | Const of Const.t
+
+  let unit = UnboxedTuple 0
+
+  let bool = Vanilla
+
+  (* Because t contains Const.t, and that contains Const.v, and that contains
+     Const.lit, and that contains Big_int, we cannot just use normal `=`. So we
+     have to write our own equality.
+
+     This equalty is, I believe, used when joining branches. So for Const, we
+     just compare the promises, and do not descend into the Const.v. This is
+     conservative; the only downside is that if a branch returns different
+     Const.t with (semantically) the same Const.v we do not propagate that as
+     Const, but materialize before the branch.
+     Which is not really expected or important.
+  *)
+  let eq (t1 : t) (t2 : t) = match t1, t2 with
+    | Const (p1, _), Const (p2, _) -> p1 == p2
+    | _ -> t1 = t2
+
+  let to_var_type : t -> value_type = function
+    | Vanilla -> I32Type
+    | UnboxedWord64 -> I64Type
+    | UnboxedWord32 -> I32Type
+    | UnboxedFloat64 -> F64Type
+    | UnboxedTuple n -> fatal "to_var_type: UnboxedTuple"
+    | Const _ -> fatal "to_var_type: Const"
+    | Unreachable -> fatal "to_var_type: Unreachable"
+
+end (* SR *)
+
+(*
+
+** The compiler environment.
+
+Of course, as we go through the code we have to track a few things; these are
+put in the compiler environment, type `E.t`. Some fields are valid globally, some
+only make sense locally, i.e. within a single function (but we still put them
+in one big record, for convenience).
+
+The fields fall into the following categories:
+
+ 1. Static global fields. Never change.
+    Example: whether we are compiling with -no-system-api
+
+ 2. Mutable global fields. Change only monotonically.
+    These are used to register things like functions. This should be monotone
+    in the sense that entries are only added, and that the order should not
+    matter in a significant way. In some instances, the list contains futures
+    so that we can reserve and know the _position_ of the thing before we have
+    to actually fill it in.
+
+ 3. Static local fields. Never change within a function.
+    Example: number of parameters and return values
+
+ 4. Mutable local fields. See above
+    Example: Name and type of locals.
+
+**)
+
+(* Before we can define the environment, we need some auxillary types *)
+
+module E = struct
+
+  (* Utilities, internal to E *)
+  let reg (ref : 'a list ref) (x : 'a) : int32 =
+      let i = Wasm.I32.of_int_u (List.length !ref) in
+      ref := !ref @ [ x ];
+      i
+
+  let reserve_promise (ref : 'a Lib.Promise.t list ref) _s : (int32 * ('a -> unit)) =
+      let p = Lib.Promise.make () in (* For debugging with named promises, use s here *)
+      let i = Wasm.I32.of_int_u (List.length !ref) in
+      ref := !ref @ [ p ];
+      (i, Lib.Promise.fulfill p)
+
+
+  (* The environment type *)
+  module NameEnv = Env.Make(String)
+  module StringEnv = Env.Make(String)
+  module LabSet = Set.Make(String)
+
+  module FunEnv = Env.Make(Int32)
+  type local_names = (int32 * string) list (* For the debug section: Names of locals *)
+  type func_with_names = func * local_names
+  type lazy_function = (int32, func_with_names) Lib.AllocOnUse.t
+  type t = {
+    (* Global fields *)
+    (* Static *)
+    mode : Flags.compile_mode;
+    rts : Wasm_exts.CustomModule.extended_module option; (* The rts. Re-used when compiling actors *)
+    trap_with : t -> string -> G.t;
+      (* Trap with message; in the env for dependency injection *)
+
+    (* Per module fields (only valid/used inside a module) *)
+    (* Immutable *)
+
+    (* Mutable *)
+    func_types : func_type list ref;
+    func_imports : import list ref;
+    other_imports : import list ref;
+    exports : export list ref;
+    funcs : (func * string * local_names) Lib.Promise.t list ref;
+    func_ptrs : int32 FunEnv.t ref;
+    end_of_table : int32 ref;
+    globals : (global Lib.Promise.t * string) list ref;
+    global_names : int32 NameEnv.t ref;
+    named_imports : int32 NameEnv.t ref;
+    built_in_funcs : lazy_function NameEnv.t ref;
+    static_strings : int32 StringEnv.t ref;
+      (* Pool for shared static objects. Their lookup needs to be specifically
+         handled by using the tag and the payload without the forwarding pointer.
+         This is because the forwarding pointer depends on the allocation adddress.
+         The lookup is different to `static_string` that has no such
+         allocation-dependent content and can thus be immediately looked up by
+         the string value. *)
+    object_pool : int32 StringEnv.t ref;
+    end_of_static_memory : int32 ref; (* End of statically allocated memory *)
+    static_memory : (int32 * string) list ref; (* Content of static memory *)
+    static_memory_frozen : bool ref;
+      (* Sanity check: Nothing should bump end_of_static_memory once it has been read *)
+    static_roots : int32 list ref;
+      (* GC roots in static memory. (Everything that may be mutable.) *)
+
+    (* Types accumulated in global typtbl (for candid subtype checks)
+       See Note [Candid subtype checks]
+    *)
+    typtbl_typs : Type.typ list ref;
+
+    (* Metadata *)
+    args : (bool * string) option ref;
+    service : (bool * string) option ref;
+    stable_types : (bool * string) option ref;
+    labs : LabSet.t ref; (* Used labels (fields and variants),
+                            collected for Motoko custom section 0 *)
+
+    (* Local fields (only valid/used inside a function) *)
+    (* Static *)
+    n_param : int32; (* Number of parameters (to calculate indices of locals) *)
+    return_arity : int; (* Number of return values (for type of Return) *)
+
+    (* Mutable *)
+    locals : value_type list ref; (* Types of locals *)
+    local_names : (int32 * string) list ref; (* Names of locals *)
+  }
+
+
+  (* The initial global environment *)
+  let mk_global mode rts trap_with dyn_mem : t = {
+    mode;
+    rts;
+    trap_with;
+    func_types = ref [];
+    func_imports = ref [];
+    other_imports = ref [];
+    exports = ref [];
+    funcs = ref [];
+    func_ptrs = ref FunEnv.empty;
+    end_of_table = ref 0l;
+    globals = ref [];
+    global_names = ref NameEnv.empty;
+    named_imports = ref NameEnv.empty;
+    built_in_funcs = ref NameEnv.empty;
+    static_strings = ref StringEnv.empty;
+    object_pool = ref StringEnv.empty;
+    end_of_static_memory = ref dyn_mem;
+    static_memory = ref [];
+    static_memory_frozen = ref false;
+    static_roots = ref [];
+    typtbl_typs = ref [];
+    (* Metadata *)
+    args = ref None;
+    service = ref None;
+    stable_types = ref None;
+    labs = ref LabSet.empty;
+    (* Actually unused outside mk_fun_env: *)
+    n_param = 0l;
+    return_arity = 0;
+    locals = ref [];
+    local_names = ref [];
+  }
+
+  (* This wraps Mo_types.Hash.hash to also record which labels we have seen,
+      so that that data can be put in a custom section, useful for debugging.
+      Thus Mo_types.Hash.hash should not be called directly!
+   *)
+  let hash (env : t) lab =
+    env.labs := LabSet.add lab (!(env.labs));
+    Mo_types.Hash.hash lab
+
+  let get_labs env = LabSet.elements (!(env.labs))
+
+  let mk_fun_env env n_param return_arity =
+    { env with
+      n_param;
+      return_arity;
+      locals = ref [];
+      local_names = ref [];
+    }
+
+  (* We avoid accessing the fields of t directly from outside of E, so here are a
+     bunch of accessors. *)
+
+  let mode (env : t) = env.mode
+
+  let add_anon_local (env : t) ty =
+    let i = reg env.locals ty in
+    Wasm.I32.add env.n_param i
+
+  let add_local_name (env : t) li name =
+    let _ = reg env.local_names (li, name) in ()
+
+  let get_locals (env : t) = !(env.locals)
+  let get_local_names (env : t) : (int32 * string) list = !(env.local_names)
+
+  let _add_other_import (env : t) m =
+    ignore (reg env.other_imports m)
+
+  let add_export (env : t) e =
+    ignore (reg env.exports e)
+
+  let add_global (env : t) name g =
+    assert (not (NameEnv.mem name !(env.global_names)));
+    let gi = reg env.globals (g, name) in
+    env.global_names := NameEnv.add name gi !(env.global_names)
+
+  let add_global32_delayed (env : t) name mut : int32 -> unit =
+    let p = Lib.Promise.make () in
+    add_global env name p;
+    (fun init ->
+      Lib.Promise.fulfill p (nr {
+        gtype = GlobalType (I32Type, mut);
+        value = nr (G.to_instr_list (G.i (Const (nr (Wasm.Values.I32 init)))))
+      })
+    )
+
+  let add_global32 (env : t) name mut init =
+    add_global32_delayed env name mut init
+
+  (* TODO, refactor with previous two *)
+  let add_global64_delayed (env : t) name mut : int64 -> unit =
+    let p = Lib.Promise.make () in
+    add_global env name p;
+    (fun init ->
+      Lib.Promise.fulfill p (nr {
+        gtype = GlobalType (I64Type, mut);
+        value = nr (G.to_instr_list (G.i (Const (nr (Wasm.Values.I64 init)))))
+      })
+    )
+  let add_global64 (env : t) name mut init =
+    add_global64_delayed env name mut init
+
+  let get_global (env : t) name : int32 =
+    match NameEnv.find_opt name !(env.global_names) with
+    | Some gi -> gi
+    | None -> raise (Invalid_argument (Printf.sprintf "No global named %s declared" name))
+
+  let get_global32_lazy (env : t) name mut init : int32 =
+    match NameEnv.find_opt name !(env.global_names) with
+    | Some gi -> gi
+    | None -> add_global32 env name mut init; get_global env name
+
+  let export_global env name =
+    add_export env (nr {
+      name = Lib.Utf8.decode name;
+      edesc = nr (GlobalExport (nr (get_global env name)))
+    })
+
+  let get_globals (env : t) = List.map (fun (g,n) -> Lib.Promise.value g) !(env.globals)
+
+  let reserve_fun (env : t) name =
+    let (j, fill) = reserve_promise env.funcs name in
+    let n = Int32.of_int (List.length !(env.func_imports)) in
+    let fi = Int32.add j n in
+    let fill_ (f, local_names) = fill (f, name, local_names) in
+    (fi, fill_)
+
+  let add_fun (env : t) name (f, local_names) =
+    let (fi, fill) = reserve_fun env name in
+    fill (f, local_names);
+    fi
+
+  let make_lazy_function env name : lazy_function =
+    Lib.AllocOnUse.make (fun () -> reserve_fun env name)
+
+  let lookup_built_in (env : t) name : lazy_function =
+    match NameEnv.find_opt name !(env.built_in_funcs) with
+    | None ->
+      let lf = make_lazy_function env name in
+      env.built_in_funcs := NameEnv.add name lf !(env.built_in_funcs);
+      lf
+    | Some lf -> lf
+
+  let built_in (env : t) name : int32 =
+    Lib.AllocOnUse.use (lookup_built_in env name)
+
+  let define_built_in (env : t) name mk_fun : unit =
+    Lib.AllocOnUse.def  (lookup_built_in env name) mk_fun
+
+  let get_return_arity (env : t) = env.return_arity
+
+  let get_func_imports (env : t) = !(env.func_imports)
+  let get_other_imports (env : t) = !(env.other_imports)
+  let get_exports (env : t) = !(env.exports)
+  let get_funcs (env : t) = List.map Lib.Promise.value !(env.funcs)
+
+  let func_type (env : t) ty =
+    let rec go i = function
+      | [] -> env.func_types := !(env.func_types) @ [ ty ]; Int32.of_int i
+      | ty'::tys when ty = ty' -> Int32.of_int i
+      | _ :: tys -> go (i+1) tys
+       in
+    go 0 !(env.func_types)
+
+  let get_types (env : t) = !(env.func_types)
+
+  let add_func_import (env : t) modname funcname arg_tys ret_tys =
+    if !(env.funcs) <> [] then
+      raise (CodegenError "Add all imports before all functions!");
+
+    let i = {
+      module_name = Lib.Utf8.decode modname;
+      item_name = Lib.Utf8.decode funcname;
+      idesc = nr (FuncImport (nr (func_type env (FuncType (arg_tys, ret_tys)))))
+    } in
+    let fi = reg env.func_imports (nr i) in
+    let name = modname ^ "." ^ funcname in
+    assert (not (NameEnv.mem name !(env.named_imports)));
+    env.named_imports := NameEnv.add name fi !(env.named_imports)
+
+  let call_import (env : t) modname funcname =
+    let name = modname ^ "." ^ funcname in
+    match NameEnv.find_opt name !(env.named_imports) with
+      | Some fi -> G.i (Call (nr fi))
+      | _ ->
+        raise (Invalid_argument (Printf.sprintf "Function import not declared: %s\n" name))
+
+  let reuse_import (env : t) modname funcname =
+    let name = modname ^ "." ^ funcname in
+    match NameEnv.find_opt name !(env.named_imports) with
+      | Some fi -> fi
+      | _ ->
+        raise (Invalid_argument (Printf.sprintf "Function import not declared: %s\n" name))
+
+  let get_rts (env : t) = env.rts
+
+  let as_block_type env : stack_type -> block_type = function
+    | [] -> ValBlockType None
+    | [t] -> ValBlockType (Some t)
+    | ts -> VarBlockType (nr (func_type env (FuncType ([], ts))))
+
+  let if_ env tys thn els = G.if_ (as_block_type env tys) thn els
+  let block_ env tys bdy = G.block_ (as_block_type env tys) bdy
+
+  let trap_with env msg = env.trap_with env msg
+  let then_trap_with env msg = G.if0 (trap_with env msg) G.nop
+  let else_trap_with env msg = G.if0 G.nop (trap_with env msg)
+
+  let reserve_static_memory (env : t) size : int32 =
+    if !(env.static_memory_frozen) then raise (Invalid_argument "Static memory frozen");
+    let ptr = !(env.end_of_static_memory) in
+    let aligned = Int32.logand (Int32.add size 3l) (Int32.lognot 3l) in
+    env.end_of_static_memory := Int32.add ptr aligned;
+    ptr
+
+  let write_static_memory (env : t) ptr data =
+    env.static_memory := !(env.static_memory) @ [ (ptr, data) ];
+    ()
+
+  let add_mutable_static_bytes (env : t) data : int32 =
+    let ptr = reserve_static_memory env (Int32.of_int (String.length data)) in
+    env.static_memory := !(env.static_memory) @ [ (ptr, data) ];
+    Int32.(add ptr ptr_skew) (* Return a skewed pointer *)
+
+  let add_fun_ptr (env : t) fi : int32 =
+    match FunEnv.find_opt fi !(env.func_ptrs) with
+    | Some fp -> fp
+    | None ->
+      let fp = !(env.end_of_table) in
+      env.func_ptrs := FunEnv.add fi fp !(env.func_ptrs);
+      env.end_of_table := Int32.add !(env.end_of_table) 1l;
+      fp
+
+  let get_elems env =
+    FunEnv.bindings !(env.func_ptrs)
+
+  let get_end_of_table env : int32 =
+    !(env.end_of_table)
+
+  let add_static (env : t) (data : StaticBytes.t) : int32 =
+    let b = StaticBytes.as_bytes data in
+    match StringEnv.find_opt b !(env.static_strings)  with
+    | Some ptr -> ptr
+    | None ->
+      let ptr = add_mutable_static_bytes env b  in
+      env.static_strings := StringEnv.add b ptr !(env.static_strings);
+      ptr
+
+  let object_pool_find (env: t) (key: string) : int32 option =
+    StringEnv.find_opt key !(env.object_pool)
+
+  let object_pool_add (env: t) (key: string) (ptr : int32)  : unit =
+    env.object_pool := StringEnv.add key ptr !(env.object_pool);
+    ()
+
+  let add_static_unskewed (env : t) (data : StaticBytes.t) : int32 =
+    Int32.add (add_static env data) ptr_unskew
+
+  let get_end_of_static_memory env : int32 =
+    env.static_memory_frozen := true;
+    !(env.end_of_static_memory)
+
+  let add_static_root (env : t) ptr =
+    env.static_roots := ptr :: !(env.static_roots)
+
+  let get_static_roots (env : t) =
+    !(env.static_roots)
+
+  let get_static_memory env =
+    !(env.static_memory)
+
+  let mem_size env =
+    Int32.(add (div (get_end_of_static_memory env) page_size) 1l)
+
+  let gc_strategy_name gc_strategy = match gc_strategy with
+    | Flags.MarkCompact -> "compacting"
+    | Flags.Copying -> "copying"
+    | Flags.Generational -> "generational"
+    | Flags.Incremental -> "incremental"
+
+  let collect_garbage env =
+    (* GC function name = "schedule_"? ("compacting" | "copying" | "generational" | "incremental") "_gc" *)
+    let name = gc_strategy_name !Flags.gc_strategy in
+    let gc_fn = if !Flags.force_gc then name else "schedule_" ^ name in
+    call_import env "rts" (gc_fn ^ "_gc")
+
+  (* See Note [Candid subtype checks] *)
+  (* NB: we don't bother detecting duplicate registrations here because the code sharing machinery
+     ensures that `add_typtbl_typ t` is called at most once for any `t` with a distinct type hash *)
+  let add_typtbl_typ (env : t) ty : Int32.t =
+    reg env.typtbl_typs ty
+
+  let get_typtbl_typs (env : t) : Type.typ list =
+    !(env.typtbl_typs)
+
+end
+
+
+(* General code generation functions:
+   Rule of thumb: Here goes stuff that independent of the Motoko AST.
+*)
+
+(* Function called compile_* return a list of instructions (and maybe other stuff) *)
+
+let compile_unboxed_const i = G.i (Const (nr (Wasm.Values.I32 i)))
+let compile_const_64 i = G.i (Const (nr (Wasm.Values.I64 i)))
+let compile_unboxed_zero = compile_unboxed_const 0l
+let compile_unboxed_one = compile_unboxed_const 1l
+
+(* Some common arithmetic, used for pointer and index arithmetic *)
+let compile_op_const op i =
+    compile_unboxed_const i ^^
+    G.i (Binary (Wasm.Values.I32 op))
+let compile_add_const = compile_op_const I32Op.Add
+let compile_sub_const = compile_op_const I32Op.Sub
+let compile_mul_const = compile_op_const I32Op.Mul
+let compile_divU_const = compile_op_const I32Op.DivU
+let compile_shrU_const = compile_op_const I32Op.ShrU
+let compile_shrS_const = compile_op_const I32Op.ShrS
+let compile_shl_const = compile_op_const I32Op.Shl
+let compile_rotl_const = compile_op_const I32Op.Rotl
+let compile_rotr_const = compile_op_const I32Op.Rotr
+let compile_bitand_const = compile_op_const I32Op.And
+let compile_bitor_const = function
+  | 0l -> G.nop | n -> compile_op_const I32Op.Or n
+let compile_rel_const rel i =
+  compile_unboxed_const i ^^
+  G.i (Compare (Wasm.Values.I32 rel))
+let compile_eq_const = function
+  | 0l -> G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | i -> compile_rel_const I32Op.Eq i
+
+let compile_op64_const op i =
+    compile_const_64 i ^^
+    G.i (Binary (Wasm.Values.I64 op))
+let compile_add64_const = compile_op64_const I64Op.Add
+let compile_sub64_const = compile_op64_const I64Op.Sub
+let compile_mul64_const = compile_op64_const I64Op.Mul
+let _compile_divU64_const = compile_op64_const I64Op.DivU
+let compile_shrU64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.ShrU n
+let compile_shrS64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.ShrS n
+let compile_shl64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Shl n
+let compile_bitand64_const = compile_op64_const I64Op.And
+let _compile_bitor64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Or n
+let compile_xor64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Xor n
+let compile_eq64_const i =
+  compile_const_64 i ^^
+  G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+
+(* more random utilities *)
+
+let bytes_of_int32 (i : int32) : string =
+  let b = Buffer.create 4 in
+  let i = Int32.to_int i in
+  Buffer.add_char b (Char.chr (i land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 8) land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 16) land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 24) land 0xff));
+  Buffer.contents b
+
+(* A common variant of todo *)
+
+let todo_trap env fn se = todo fn se (E.trap_with env ("TODO: " ^ fn))
+let _todo_trap_SR env fn se = todo fn se (SR.Unreachable, E.trap_with env ("TODO: " ^ fn))
+
+(* Locals *)
+
+let new_local_ env t name =
+  let i = E.add_anon_local env t in
+  E.add_local_name env i name;
+  ( G.i (LocalSet (nr i))
+  , G.i (LocalGet (nr i))
+  , i
+  )
+
+let new_local env name =
+  let (set_i, get_i, _) = new_local_ env I32Type name
+  in (set_i, get_i)
+
+let new_local64 env name =
+  let (set_i, get_i, _) = new_local_ env I64Type name
+  in (set_i, get_i)
+
+(* Some common code macros *)
+
+(* Iterates while cond is true. *)
+let compile_while env cond body =
+    G.loop0 (
+      cond ^^ G.if0 (body ^^ G.i (Br (nr 1l))) G.nop
+    )
+
+(* Expects a number n on the stack. Iterates from m to below that number. *)
+let from_m_to_n env m mk_body =
+    let (set_n, get_n) = new_local env "n" in
+    let (set_i, get_i) = new_local env "i" in
+    set_n ^^
+    compile_unboxed_const m ^^
+    set_i ^^
+
+    compile_while env
+      ( get_i ^^
+        get_n ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+      ) (
+        mk_body get_i ^^
+
+        get_i ^^
+        compile_add_const 1l ^^
+        set_i
+      )
+
+(* Expects a number on the stack. Iterates from zero to below that number. *)
+let from_0_to_n env mk_body = from_m_to_n env 0l mk_body
+
+(* Pointer reference and dereference  *)
+
+let load_unskewed_ptr : G.t =
+  G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None})
+
+let store_unskewed_ptr : G.t =
+  G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None})
+
+let load_ptr : G.t =
+  G.i (Load {ty = I32Type; align = 2; offset = ptr_unskew; sz = None})
+
+let store_ptr : G.t =
+  G.i (Store {ty = I32Type; align = 2; offset = ptr_unskew; sz = None})
+
+module FakeMultiVal = struct
+  (* For some use-cases (e.g. processing the compiler output with analysis
+     tools) it is useful to avoid the multi-value extension.
+
+     This module provides mostly transparent wrappers that put multiple values
+     in statically allocated globals and pull them off again.
+
+     So far only does I32Type (but that could be changed).
+
+     If the multi_value flag is on, these do not do anything.
+  *)
+  let ty tys =
+    if !Flags.multi_value || List.length tys <= 1
+    then tys
+    else []
+
+  let global env i =
+    E.get_global32_lazy env (Printf.sprintf "multi_val_%d" i) Mutable 0l
+
+  let store env tys =
+    if !Flags.multi_value || List.length tys <= 1 then G.nop else
+    G.concat_mapi (fun i ty ->
+      assert(ty = I32Type);
+      G.i (GlobalSet (nr (global env i)))
+    ) tys
+
+  let load env tys =
+    if !Flags.multi_value || List.length tys <= 1 then G.nop else
+    let n = List.length tys - 1 in
+    G.concat_mapi (fun i ty ->
+      assert(ty = I32Type);
+      G.i (GlobalGet (nr (global env (n - i))))
+    ) tys
+
+  (* A drop-in replacement for E.if_ *)
+  let if_ env bt thn els =
+    E.if_ env (ty bt) (thn ^^ store env bt) (els ^^ store env bt) ^^
+    load env bt
+
+  (* A block that can be exited from *)
+  let block_ env bt body =
+    E.block_ env (ty bt) (G.with_current_depth (fun depth ->
+      body (store env bt ^^ G.branch_to_ depth)
+    )) ^^
+    load env bt
+
+end (* FakeMultiVal *)
+
+module Func = struct
+  (* This module contains basic bookkeeping functionality to define functions,
+     in particular creating the environment, and finally adding it to the environment.
+  *)
+
+  let of_body env params retty mk_body =
+    let env1 = E.mk_fun_env env (Int32.of_int (List.length params)) (List.length retty) in
+    List.iteri (fun i (n,_t) -> E.add_local_name env1 (Int32.of_int i) n) params;
+    let ty = FuncType (List.map snd params, FakeMultiVal.ty retty) in
+    let body = G.to_instr_list (
+      mk_body env1 ^^ FakeMultiVal.store env1 retty
+    ) in
+    (nr { ftype = nr (E.func_type env ty);
+          locals = E.get_locals env1;
+          body }
+    , E.get_local_names env1)
+
+  let define_built_in env name params retty mk_body =
+    E.define_built_in env name (lazy (of_body env params retty mk_body))
+
+  (* (Almost) transparently lift code into a function and call this function. *)
+  (* Also add a hack to support multiple return values *)
+  let share_code env name params retty mk_body =
+    define_built_in env name params retty mk_body;
+    G.i (Call (nr (E.built_in env name))) ^^
+    FakeMultiVal.load env retty
+
+
+  (* Shorthands for various arities *)
+  let share_code0 env name retty mk_body =
+    share_code env name [] retty (fun env -> mk_body env)
+  let share_code1 env name p1 retty mk_body =
+    share_code env name [p1] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+    )
+  let share_code2 env name (p1,p2) retty mk_body =
+    share_code env name [p1; p2] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+    )
+  let share_code3 env name (p1, p2, p3) retty mk_body =
+    share_code env name [p1; p2; p3] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+        (G.i (LocalGet (nr 2l)))
+    )
+  let _share_code4 env name (p1, p2, p3, p4) retty mk_body =
+    share_code env name [p1; p2; p3; p4] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+        (G.i (LocalGet (nr 2l)))
+        (G.i (LocalGet (nr 3l)))
+    )
+  let share_code6 env name (p1, p2, p3, p4, p5, p6) retty mk_body =
+    share_code env name [p1; p2; p3; p4; p5; p6] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+        (G.i (LocalGet (nr 2l)))
+        (G.i (LocalGet (nr 3l)))
+        (G.i (LocalGet (nr 4l)))
+        (G.i (LocalGet (nr 5l)))
+    )
+  let _share_code7 env name (p1, p2, p3, p4, p5, p6, p7) retty mk_body =
+    share_code env name [p1; p2; p3; p4; p5; p6; p7] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+        (G.i (LocalGet (nr 2l)))
+        (G.i (LocalGet (nr 3l)))
+        (G.i (LocalGet (nr 4l)))
+        (G.i (LocalGet (nr 5l)))
+        (G.i (LocalGet (nr 6l)))
+    )
+  let _share_code9 env name (p1, p2, p3, p4, p5, p6, p7, p8, p9) retty mk_body =
+    share_code env name [p1; p2; p3; p4; p5; p6; p7; p8; p9] retty (fun env -> mk_body env
+        (G.i (LocalGet (nr 0l)))
+        (G.i (LocalGet (nr 1l)))
+        (G.i (LocalGet (nr 2l)))
+        (G.i (LocalGet (nr 3l)))
+        (G.i (LocalGet (nr 4l)))
+        (G.i (LocalGet (nr 5l)))
+        (G.i (LocalGet (nr 6l)))
+        (G.i (LocalGet (nr 7l)))
+        (G.i (LocalGet (nr 8l)))
+    )
+
+end (* Func *)
+
+module RTS = struct
+  let incremental_gc_imports env =
+    E.add_func_import env "rts" "initialize_incremental_gc" [] [];
+    E.add_func_import env "rts" "schedule_incremental_gc" [] [];
+    E.add_func_import env "rts" "incremental_gc" [] [];
+    E.add_func_import env "rts" "write_with_barrier" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "allocation_barrier" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stop_gc_on_upgrade" [] [];
+    E.add_func_import env "rts" "running_gc" [] [I32Type];
+    ()
+
+  let non_incremental_gc_imports env =
+    E.add_func_import env "rts" "initialize_copying_gc" [] [];
+    E.add_func_import env "rts" "initialize_compacting_gc" [] [];
+    E.add_func_import env "rts" "initialize_generational_gc" [] [];
+    E.add_func_import env "rts" "schedule_copying_gc" [] [];
+    E.add_func_import env "rts" "schedule_compacting_gc" [] [];
+    E.add_func_import env "rts" "schedule_generational_gc" [] [];
+    E.add_func_import env "rts" "copying_gc" [] [];
+    E.add_func_import env "rts" "compacting_gc" [] [];
+    E.add_func_import env "rts" "generational_gc" [] [];
+    E.add_func_import env "rts" "post_write_barrier" [I32Type] [];
+    ()
+
+  (* The connection to the C and Rust parts of the RTS *)
+  let system_imports env =
+    E.add_func_import env "rts" "memcpy" [I32Type; I32Type; I32Type] [I32Type]; (* standard libc memcpy *)
+    E.add_func_import env "rts" "memcmp" [I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "version" [] [I32Type];
+    E.add_func_import env "rts" "parse_idl_header" [I32Type; I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "idl_sub_buf_words" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "idl_sub_buf_init" [I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "idl_sub"
+      [I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "leb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "sleb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_word32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_int32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_wrap" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_trap" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_trap_with" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_word64" [I64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_int64" [I64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_float64" [F64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_float64" [I32Type] [F64Type];
+    E.add_func_import env "rts" "bigint_to_word64_wrap" [I32Type] [I64Type];
+    E.add_func_import env "rts" "bigint_to_word64_trap" [I32Type] [I64Type];
+    E.add_func_import env "rts" "bigint_eq" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_isneg" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_count_bits" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_2complement_bits" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_lt" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_gt" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_le" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_ge" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_add" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sub" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_mul" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_rem" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_div" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_pow" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_neg" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_lsh" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_rsh" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_abs" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_leb128_stream_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_leb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_decode_word64" [I64Type; I64Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_sleb128_stream_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_sleb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_decode_word64" [I64Type; I64Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "leb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "sleb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "utf8_valid" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "utf8_validate" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "skip_leb128" [I32Type] [];
+    E.add_func_import env "rts" "skip_any" [I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "find_field" [I32Type; I32Type; I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "skip_fields" [I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "remember_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "recall_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "peek_future_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "continuation_count" [] [I32Type];
+    E.add_func_import env "rts" "continuation_table_size" [] [I32Type];
+    E.add_func_import env "rts" "blob_of_text" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_compare" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_concat" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter_done" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter_next" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_len" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_of_ptr_size" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_singleton" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_to_buf" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "blob_of_principal" [I32Type] [I32Type];
+    E.add_func_import env "rts" "principal_of_blob" [I32Type] [I32Type];
+    E.add_func_import env "rts" "compute_crc32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter_done" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter_next" [I32Type] [I32Type];
+    E.add_func_import env "rts" "pow" [F64Type; F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "sin" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "cos" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "tan" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "asin" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "acos" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "atan" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "atan2" [F64Type; F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "exp" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "log" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "fmod" [F64Type; F64Type] [F64Type]; (* remainder, musl *)
+    E.add_func_import env "rts" "float_fmt" [F64Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "char_to_upper" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_to_lower" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_whitespace" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_lowercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_uppercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_alphabetic" [I32Type] [I32Type];
+    E.add_func_import env "rts" "get_max_live_size" [] [I32Type];
+    E.add_func_import env "rts" "get_reclaimed" [] [I64Type];
+    E.add_func_import env "rts" "alloc_words" [I32Type] [I32Type];
+    E.add_func_import env "rts" "get_total_allocations" [] [I64Type];
+    E.add_func_import env "rts" "get_heap_size" [] [I32Type];
+    E.add_func_import env "rts" "alloc_blob" [I32Type] [I32Type];
+    E.add_func_import env "rts" "alloc_array" [I32Type] [I32Type];
+    E.add_func_import env "rts" "alloc_stream" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_write" [I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_write_byte" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_write_text" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_split" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_shutdown" [I32Type] [];
+    E.add_func_import env "rts" "stream_reserve" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_stable_dest" [I32Type; I64Type; I64Type] [];
+    if !Flags.gc_strategy = Flags.Incremental then
+      incremental_gc_imports env
+    else
+      non_incremental_gc_imports env;
+    ()
+
+end (* RTS *)
+
+module GC = struct
+  (* Record mutator/gc instructions counts *)
+
+  let instruction_counter env =
+    compile_unboxed_zero ^^
+    E.call_import env "ic0" "performance_counter"
+
+  let register_globals env =
+    E.add_global64 env "__mutator_instructions" Mutable 0L;
+    E.add_global64 env "__collector_instructions" Mutable 0L;
+    if !Flags.gc_strategy <> Flags.Incremental then
+      E.add_global32 env "_HP" Mutable 0l
+
+  let get_mutator_instructions env =
+    G.i (GlobalGet (nr (E.get_global env "__mutator_instructions")))
+  let set_mutator_instructions env =
+    G.i (GlobalSet (nr (E.get_global env "__mutator_instructions")))
+
+  let get_collector_instructions env =
+    G.i (GlobalGet (nr (E.get_global env "__collector_instructions")))
+  let set_collector_instructions env =
+    G.i (GlobalSet (nr (E.get_global env "__collector_instructions")))
+
+  let get_heap_pointer env =
+    if !Flags.gc_strategy <> Flags.Incremental then
+      G.i (GlobalGet (nr (E.get_global env "_HP")))
+    else
+      assert false
+  let set_heap_pointer env =
+    if !Flags.gc_strategy <> Flags.Incremental then
+      G.i (GlobalSet (nr (E.get_global env "_HP")))
+    else
+      assert false
+
+  let record_mutator_instructions env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode)  ->
+      instruction_counter env ^^
+      set_mutator_instructions env
+    | _ -> G.nop
+
+  let record_collector_instructions env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode)  ->
+      instruction_counter env ^^
+      get_mutator_instructions env ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      set_collector_instructions env
+    | _ -> G.nop
+
+  let collect_garbage env =
+    record_mutator_instructions env ^^
+    E.collect_garbage env ^^
+    record_collector_instructions env
+
+end (* GC *)
+
+module Heap = struct
+  (* General heap object functionality (allocation, setting fields, reading fields) *)
+
+  (* Memory addresses are 32 bit (I32Type). *)
+  let word_size = 4l
+
+  (* The heap base global can only be used late, see conclude_module
+     and GHC.register *)
+  let get_heap_base env =
+    G.i (GlobalGet (nr (E.get_global env "__heap_base")))
+
+  let get_total_allocation env =
+    E.call_import env "rts" "get_total_allocations"
+
+  let get_reclaimed env =
+    E.call_import env "rts" "get_reclaimed"
+
+  let get_memory_size =
+    G.i MemorySize ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+    compile_mul64_const page_size64
+
+  let get_max_live_size env =
+    E.call_import env "rts" "get_max_live_size"
+
+  (* Static allocation (always words)
+     (uses dynamic allocation for smaller and more readable code) *)
+  let alloc env (n : int32) : G.t =
+    compile_unboxed_const n ^^
+    E.call_import env "rts" "alloc_words"
+
+  let ensure_allocated env =
+    alloc env 0l ^^ G.i Drop (* dummy allocation, ensures that the page HP points into is backed *)
+    
+  (* Heap objects *)
+
+  (* At this level of abstraction, heap objects are just flat arrays of words *)
+
+  let load_field_unskewed (i : int32) : G.t =
+    let offset = Int32.mul word_size i in
+    G.i (Load {ty = I32Type; align = 2; offset; sz = None})
+
+  let load_field (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = I32Type; align = 2; offset; sz = None})
+
+  let store_field (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = I32Type; align = 2; offset; sz = None})
+
+  (* Although we occasionally want to treat two consecutive
+     32 bit fields as one 64 bit number *)
+  
+  (* Requires little-endian encoding, see also `Stream` in `types.rs` *)
+  let load_field64_unskewed (i : int32) : G.t =
+    let offset = Int32.mul word_size i in
+    G.i (Load {ty = I64Type; align = 2; offset; sz = None})
+
+  let load_field64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = I64Type; align = 2; offset; sz = None})
+
+  let store_field64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = I64Type; align = 2; offset; sz = None})
+
+  (* Or even as a single 64 bit float *)
+
+  let load_field_float64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = F64Type; align = 2; offset; sz = None})
+
+  let store_field_float64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = F64Type; align = 2; offset; sz = None})
+
+  (* Convenience functions related to memory *)
+  (* Copying bytes (works on unskewed memory addresses) *)
+  let memcpy env = E.call_import env "rts" "memcpy" ^^ G.i Drop
+  (* Comparing bytes (works on unskewed memory addresses) *)
+  let memcmp env = E.call_import env "rts" "memcmp"
+
+  let register env =
+    let get_heap_base_fn = E.add_fun env "get_heap_base" (Func.of_body env [] [I32Type] (fun env ->
+      get_heap_base env
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "get_heap_base";
+      edesc = nr (FuncExport (nr get_heap_base_fn))
+    })
+
+  let get_heap_size env =
+    E.call_import env "rts" "get_heap_size"
+
+end (* Heap *)
+
+module Stack = struct
+  (* The RTS includes C code which requires a shadow stack in linear memory.
+     We reserve some space for it at the beginning of memory space (just like
+     wasm-l would), this way stack overflow would cause out-of-memory, and not
+     just overwrite static data.
+
+     We sometimes use the stack space if we need small amounts of scratch space.
+
+     All pointers here are unskewed.
+
+     (We report logical stack overflow as "RTS Stack underflow" as the stack
+     grows downwards.)
+  *)
+
+  let end_ () = Int32.mul (Int32.of_int (!Flags.rts_stack_pages)) page_size
+
+  let register_globals env =
+    (* stack pointer *)
+    E.add_global32 env "__stack_pointer" Mutable (end_());
+    (* frame pointer *)
+    E.add_global32 env "__frame_pointer" Mutable (end_());
+    (* low watermark *)
+    if !Flags.measure_rts_stack then
+      E.add_global32 env "__stack_min" Mutable (end_());
+    E.export_global env "__stack_pointer"
+
+  let get_stack_ptr env =
+    G.i (GlobalGet (nr (E.get_global env "__stack_pointer")))
+  let set_stack_ptr env =
+    G.i (GlobalSet (nr (E.get_global env "__stack_pointer")))
+
+  let get_min env =
+    G.i (GlobalGet (nr (E.get_global env "__stack_min")))
+  let set_min env =
+    G.i (GlobalSet (nr (E.get_global env "__stack_min")))
+
+  let get_max_stack_size env =
+    if !Flags.measure_rts_stack then
+      compile_unboxed_const (end_()) ^^
+      get_min env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+    else (* report max available *)
+      compile_unboxed_const (end_())
+
+  let update_stack_min env =
+    if !Flags.measure_rts_stack then
+    get_stack_ptr env ^^
+    get_min env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+    (G.if0
+       (get_stack_ptr env ^^
+        set_min env)
+      G.nop)
+    else G.nop
+
+  let stack_overflow env =
+    Func.share_code0 env "stack_overflow" [] (fun env ->
+      (* read last word of reserved page to force trap *)
+      compile_unboxed_const 0xFFFF_FFFCl ^^
+      G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+      G.i Unreachable
+    )
+
+  let alloc_words env n =
+    let n_bytes = Int32.mul n Heap.word_size in
+    (* avoid absurd allocations *)
+    assert Int32.(to_int n_bytes < !Flags.rts_stack_pages * to_int page_size);
+    (* alloc words *)
+    get_stack_ptr env ^^
+    compile_unboxed_const n_bytes ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    set_stack_ptr env ^^
+    update_stack_min env ^^
+    get_stack_ptr env ^^
+    (* check for stack overflow, if necessary *)
+    if n_bytes >= page_size then
+      get_stack_ptr env ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Clz)) ^^
+      G.if0
+        G.nop (* we found leading zeros, i.e. no wraparound *)
+        (stack_overflow env)
+    else
+      G.nop
+
+  let free_words env n =
+    get_stack_ptr env ^^
+    compile_unboxed_const (Int32.mul n Heap.word_size) ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_stack_ptr env
+
+  (* TODO: why not just remember and reset the stack pointer, instead of calling free_words? Also below *)
+  let with_words env name n f =
+    let (set_x, get_x) = new_local env name in
+    alloc_words env n ^^ set_x ^^
+    f get_x ^^
+    free_words env n
+
+
+  let dynamic_alloc_words env get_n =
+    get_stack_ptr env ^^
+    compile_divU_const Heap.word_size ^^
+    get_n ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+    (G.if0
+      (stack_overflow env)
+      G.nop) ^^
+    get_stack_ptr env ^^
+    get_n ^^
+    compile_mul_const Heap.word_size ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    set_stack_ptr env ^^
+    update_stack_min env ^^
+    get_stack_ptr env
+
+  let dynamic_free_words env get_n =
+    get_stack_ptr env ^^
+    get_n ^^
+    compile_mul_const Heap.word_size ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_stack_ptr env
+
+  (* TODO: why not just remember and reset the stack pointer, instead of calling free_words? Also above*)
+  let dynamic_with_words env name f =
+    let (set_n, get_n) = new_local env "n" in
+    let (set_x, get_x) = new_local env name in
+    set_n ^^
+    dynamic_alloc_words env get_n ^^ set_x ^^
+    f get_x ^^
+    dynamic_free_words env get_n
+
+  (* Stack Frames *)
+
+  (* Traditional frame pointer for accessing statically allocated locals/args (all words)
+     Used (sofar) only in serialization to compress Wasm stack
+     at cost of expanding Rust/C Stack (whose size we control)*)
+  let get_frame_ptr env =
+    G.i (GlobalGet (nr (E.get_global env "__frame_pointer")))
+  let set_frame_ptr env =
+    G.i (GlobalSet (nr (E.get_global env "__frame_pointer")))
+
+  (* Frame pointer operations *)
+
+  (* Enter/exit a new frame of `n` words, saving and restoring prev frame pointer *)
+  let with_frame env name n f =
+    (* reserve space for n words + saved frame_ptr *)
+    alloc_words env (Int32.add n 1l) ^^
+    (* store the current frame_ptr at offset 0*)
+    get_frame_ptr env ^^
+    G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    get_stack_ptr env ^^
+    (* set_frame_ptr to stack_ptr *)
+    set_frame_ptr env ^^
+    (* do as f *)
+    f () ^^
+    (* assert frame_ptr == stack_ptr *)
+    get_frame_ptr env ^^
+    get_stack_ptr env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.else_trap_with env "frame_ptr <> stack_ptr" ^^
+    (* restore the saved frame_ptr *)
+    get_frame_ptr env ^^
+    G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    set_frame_ptr env ^^
+    (* free the frame *)
+    free_words env (Int32.add n 1l)
+
+  (* read local n of current frame *)
+  let get_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    get_frame_ptr env ^^
+      G.i (Load { ty = I32Type; align = 2; offset; sz = None})
+
+  (* read local n of previous frame *)
+  let get_prev_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    (* indirect through save frame_ptr at offset 0 *)
+    get_frame_ptr env ^^
+    G.i (Load { ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    G.i (Load { ty = I32Type; align = 2; offset; sz = None})
+
+  (* set local n of current frame *)
+  let set_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    Func.share_code1 env ("set_local %i" ^ Int32.to_string n) ("val", I32Type) []
+      (fun env get_val ->
+         get_frame_ptr env ^^
+         get_val ^^
+         G.i (Store { ty = I32Type; align = 2; offset; sz = None}))
+
+end (* Stack *)
+
+
+module ContinuationTable = struct
+  (* See rts/motoko-rts/src/closure_table.rs *)
+  let remember env : G.t = E.call_import env "rts" "remember_continuation"
+  let recall env : G.t = E.call_import env "rts" "recall_continuation"
+  let peek_future env : G.t = E.call_import env "rts" "peek_future_continuation"
+  let count env : G.t = E.call_import env "rts" "continuation_count"
+  let size env : G.t = E.call_import env "rts" "continuation_table_size"
+end (* ContinuationTable *)
+
+module Bool = struct
+  (* Boolean literals are either 0 or 1, at StackRep Vanilla
+     They need not be shifted before put in the heap,
+     because the "zero page" never contains GC-ed objects
+  *)
+
+  let vanilla_lit = function
+    | false -> 0l
+    | true -> 1l
+
+  let lit b = compile_unboxed_const (vanilla_lit b)
+
+  let neg = G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+
+end (* Bool *)
+
+module BitTagged = struct
+
+  (* This module takes care of pointer tagging:
+
+     A pointer to an object at offset `i` on the heap is represented as
+     `i-1`, so the low two bits of the pointer are always set (0b…11).
+     We call `i-1` a *skewed* pointer, in a feeble attempt to avoid the term
+     shifted, which may sound like a logical shift.
+
+     We use the constants ptr_skew and ptr_unskew to change a pointer as a
+     signpost where we switch between raw pointers to skewed ones.
+
+     This means we can store a small unboxed scalar x as (x `lsl` 1), and still
+     tell it apart from a pointer by looking at the last bits: if set, it is a
+     pointer.
+
+     Small here means -2^30 ≤ x < 2^30, and untagging needs to happen with an
+     _arithmetic_ right shift. This is the right thing to do for signed
+     numbers, and because we want to apply a consistent logic for all types,
+     especially as there is only one wasm type, we use the same range for
+     signed numbers as well.
+
+     Boolean false is a non-pointer by construction.
+     Boolean true (1) needs not be shifted as GC will not consider it.
+
+     Summary:
+
+       0b…11: A pointer
+       0b…x0: A shifted scalar
+       0b000: `false`
+       0b001: `true`
+
+     Note that {Nat,Int}{8,16} do not need to be explicitly bit-tagged:
+     The bytes are stored in the _most_ significant byte(s) of the `i32`,
+     thus lowest two bits are always 0.
+     All arithmetic is implemented directly on that representation, see
+     module TaggedSmallWord.
+  *)
+  let is_true_literal env =
+    compile_eq_const 1l
+
+  (* Note: `true` is not handled here, needs specific check where needed. *)
+  let if_tagged_scalar env retty is1 is2 =
+    compile_bitand_const 0x1l ^^
+    E.if_ env retty is2 is1
+
+  (* With two bit-tagged pointers on the stack, decide
+     whether both are scalars and invoke is1 (the fast path)
+     if so, and otherwise is2 (the slow path).
+     Note: `true` is not handled here, needs specific check where needed.
+  *)
+  let if_both_tagged_scalar env retty is1 is2 =
+    G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+    compile_bitand_const 0x1l ^^
+    E.if_ env retty is2 is1
+
+  (* 64 bit numbers *)
+
+  (* static *)
+  let can_tag_const (n : int64) =
+    let lower_bound = Int64.(neg (shift_left 1L 30)) in
+    let upper_bound = Int64.shift_left 1L 30 in
+    lower_bound <= n && n < upper_bound
+
+  let tag_const i = Int32.shift_left (Int64.to_int32 i) 1
+
+
+  (* dynamic *)
+  let if_can_tag_i64 env retty is1 is2 =
+    Func.share_code1 env "can_tag_i64" ("x", I64Type) [I32Type] (fun env get_x ->
+      (* checks that all but the low 30 bits are either all 0 or all 1 *)
+      get_x ^^ compile_shl64_const 1L ^^
+      get_x ^^ G.i (Binary (Wasm.Values.I64 I32Op.Xor)) ^^
+      compile_shrU64_const 31L ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz))
+    ) ^^
+    E.if_ env retty is1 is2
+
+  let if_can_tag_u64 env retty is1 is2 =
+    compile_shrU64_const 30L ^^
+    G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+    E.if_ env retty is1 is2
+
+  let tag =
+    G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+    compile_shl_const 1l
+
+  let untag env =
+    compile_shrS_const 1l ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32))
+
+  (* 32 bit numbers, dynamic, w.r.t `Int` *)
+
+  let if_can_tag_i32 env retty is1 is2 =
+    Func.share_code1 env "cannot_tag_i32" ("x", I32Type) [I32Type] (fun env get_x ->
+      (* checks that all but the low 30 bits are both either 0 or 1 *)
+      get_x ^^ compile_shrU_const 30l ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Ctz))
+    ) ^^
+    E.if_ env retty is1 is2
+
+  let if_can_tag_u32 env retty is1 is2 =
+    compile_shrU_const 30l ^^
+    E.if_ env retty is2 is1 (* NB: swapped branches *)
+
+  let tag_i32 = compile_shl_const 1l
+  let untag_i32 = compile_shrS_const 1l
+
+end (* BitTagged *)
+
+module Tagged = struct
+  (* Tagged objects all have an object header consisting of a tag and a forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+     The tag is to describe their runtime type and serves to traverse the heap
+     (serialization, GC), but also for objectification of arrays.
+
+     The tag is a word at the beginning of the object.
+
+     The (skewed) forwarding pointer supports object moving in the incremental garbage collection.
+
+         obj header
+     ┌──────┬─────────┬──
+     │ tag  │ fwd ptr │ ...
+     └──────┴─────────┴──
+
+     The copying GC requires that all tagged objects in the dynamic heap space have at least
+     two words in order to replace them by `Indirection`. This condition is except for `Null`
+     that only lives in static heap space and is therefore not replaced by `Indirection` during
+     copying GC.
+
+     Attention: This mapping is duplicated in these places
+       * here
+       * motoko-rts/src/types.rs
+       * motoko-rts/src/stream.rs
+       * motoko-rts/src/text.rs
+       * motoko-rts/src/memory.rs
+       * motoko-rts/src/bigint.rs
+       * motoko-rts/src/blob-iter.rs
+       * motoko-rts/src/static-checks.rs
+       * In all GC implementations in motoko-rts/src/gc/
+     so update all!
+   *)
+
+  type [@warning "-37"] tag  =
+    | Object
+    | ObjInd (* The indirection used for object fields *)
+    | Array (* Also a tuple *)
+    | Bits64 (* Contains a 64 bit number *)
+    | MutBox (* used for mutable heap-allocated variables *)
+    | Closure
+    | Some (* For opt *)
+    | Variant
+    | Blob
+    | Indirection (* Only used by the GC *)
+    | Bits32 (* Contains a 32 bit unsigned number *)
+    | BigInt
+    | Concat (* String concatenation, used by rts/text.c *)
+    | Null (* For opt. Static singleton! *)
+    | OneWordFiller (* Only used by the RTS *)
+    | FreeSpace (* Only used by the RTS *)
+    | ArraySliceMinimum (* Used by the GC for incremental array marking *)
+    | StableSeen (* Marker that we have seen this thing before *)
+    | CoercionFailure (* Used in the Candid decoder. Static singleton! *)
+
+  (* Tags needs to have the lowest bit set, to allow distinguishing object
+     headers from heap locations (object or field addresses).
+
+     (Reminder: objects and fields are word-aligned so will have the lowest two
+     bits unset) *)
+  let int_of_tag = function
+    | Object -> 1l
+    | ObjInd -> 3l
+    | Array -> 5l
+    | Bits64 -> 7l
+    | MutBox -> 9l
+    | Closure -> 11l
+    | Some -> 13l
+    | Variant -> 15l
+    | Blob -> 17l
+    | Indirection -> 19l
+    | Bits32 -> 21l
+    | BigInt -> 23l
+    | Concat -> 25l
+    | Null -> 27l
+    | OneWordFiller -> 29l
+    | FreeSpace -> 31l
+    | ArraySliceMinimum -> 32l
+    (* Next two tags won't be seen by the GC, so no need to set the lowest bit
+       for `CoercionFailure` and `StableSeen` *)
+    | CoercionFailure -> 0xfffffffel
+    | StableSeen -> 0xffffffffl
+
+  (* Declare `env` for lazy computation of the header size when the compile environment with compile flags are defined *)
+  let header_size env = 
+    if !Flags.gc_strategy = Flags.Incremental then 2l else 1l
+  
+  (* The tag *)
+  let tag_field = 0l
+  let forwarding_pointer_field env = 
+    assert (!Flags.gc_strategy = Flags.Incremental);
+    1l
+
+  (* Note: post-allocation barrier must be applied after initialization *)
+  let alloc env size tag =
+    assert (size > 1l);
+    let name = Printf.sprintf "alloc_size<%d>_tag<%d>" (Int32.to_int size) (Int32.to_int (int_of_tag tag)) in
+    (* Computes a (conservative) mask for the bumped HP, so that the existence of non-zero bits under it
+       guarantees that a page boundary crossing didn't happen (i.e. no ripple-carry). *)
+    let overflow_mask increment =
+      let n = Int32.to_int increment in
+      assert (n > 0 && n < 0x8000);
+      let page_mask = Int32.sub page_size 1l in
+      (* We can extend the mask to the right if the bump increment is a power of two. *)
+      let ext = if Numerics.Nat16.(to_int (popcnt (of_int n))) = 1 then increment else 0l in
+      Int32.(logor ext (logand page_mask (shift_left minus_one (16 - Numerics.Nat16.(to_int (clz (of_int n))))))) in
+
+    Func.share_code0 env name [I32Type] (fun env ->
+      let set_object, get_object = new_local env "new_object" in
+      let size_in_bytes = Int32.(mul size Heap.word_size) in
+      let half_page_size = Int32.div page_size 2l in
+      (if !Flags.gc_strategy <> Flags.Incremental && size_in_bytes < half_page_size then
+         GC.get_heap_pointer env ^^
+         GC.get_heap_pointer env ^^
+         compile_add_const size_in_bytes ^^
+         GC.set_heap_pointer env ^^
+         GC.get_heap_pointer env ^^
+         compile_bitand_const (overflow_mask size_in_bytes) ^^
+         G.if0
+           G.nop (* no page crossing *)
+           (Heap.ensure_allocated env) (* ensure that HP's page is allocated *)
+       else
+         Heap.alloc env size) ^^
+      set_object ^^ get_object ^^
+      compile_unboxed_const (int_of_tag tag) ^^
+      Heap.store_field tag_field ^^
+      (if !Flags.gc_strategy = Flags.Incremental then
+        get_object ^^ (* object pointer *)
+        get_object ^^ (* forwarding pointer *)
+        Heap.store_field (forwarding_pointer_field env)
+      else 
+        G.nop) ^^
+      get_object
+    )
+
+  let load_forwarding_pointer env =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      Heap.load_field (forwarding_pointer_field env)
+    else
+      G.nop)
+
+  let store_tag env tag =
+    load_forwarding_pointer env ^^
+    compile_unboxed_const (int_of_tag tag) ^^
+    Heap.store_field tag_field
+
+  let load_tag env =
+    load_forwarding_pointer env ^^
+    Heap.load_field tag_field
+
+  let check_forwarding env unskewed =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let name = "check_forwarding_" ^ if unskewed then "unskewed" else "skewed" in
+      Func.share_code1 env name ("object", I32Type) [I32Type] (fun env get_object ->
+        let set_object = G.setter_for get_object in
+        (if unskewed then
+          get_object ^^
+          compile_unboxed_const ptr_skew ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          set_object
+        else G.nop) ^^
+        get_object ^^
+        load_forwarding_pointer env ^^
+        get_object ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        E.else_trap_with env "missing object forwarding" ^^
+        get_object ^^
+        (if unskewed then
+          compile_unboxed_const ptr_unskew ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add))
+        else G.nop))
+    else G.nop)
+
+  let check_forwarding_for_store env typ =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let (set_value, get_value, _) = new_local_ env typ "value" in
+      set_value ^^ check_forwarding env false ^^ get_value
+    else G.nop)
+
+  let load_field env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field index
+
+  let store_field env index =
+    (if !Flags.sanity then check_forwarding_for_store env I32Type else G.nop) ^^
+    Heap.store_field index
+
+  let load_field_unskewed env index =
+    (if !Flags.sanity then check_forwarding env true else G.nop) ^^
+    Heap.load_field_unskewed index
+
+  let load_field64_unskewed env index =
+    (if !Flags.sanity then check_forwarding env true else G.nop) ^^
+    Heap.load_field64_unskewed index
+
+  let load_field64 env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field64 index
+
+  let store_field64 env index =
+    (if !Flags.sanity then check_forwarding_for_store env I64Type else G.nop) ^^
+    Heap.store_field64 index
+
+  let load_field_float64 env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field_float64 index
+
+  let store_field_float64 env index =
+    (if !Flags.sanity then check_forwarding_for_store env F64Type else G.nop) ^^
+    Heap.store_field_float64 index
+
+  (* Branches based on the tag of the object pointed to,
+     leaving the object on the stack afterwards. *)
+  let branch_default env retty def (cases : (tag * G.t) list) : G.t =
+    let (set_tag, get_tag) = new_local env "tag" in
+
+    let rec go = function
+      | [] -> def
+      | ((tag, code) :: cases) ->
+        get_tag ^^
+        compile_eq_const (int_of_tag tag) ^^
+        E.if_ env retty code (go cases)
+    in
+    load_tag env ^^
+    set_tag ^^
+    go cases
+
+  (* like branch_default but also pushes the scrutinee on the stack for the
+   * branch's consumption *)
+  let _branch_default_with env retty def cases =
+    let (set_o, get_o) = new_local env "o" in
+    let prep (t, code) = (t, get_o ^^ code)
+    in set_o ^^ get_o ^^ branch_default env retty def (List.map prep cases)
+
+  (* like branch_default_with but the tag is known statically *)
+  let branch_with env retty = function
+    | [] -> G.i Unreachable
+    | [_, code] -> code
+    | (_, code) :: cases ->
+       let (set_o, get_o) = new_local env "o" in
+       let prep (t, code) = (t, get_o ^^ code)
+       in set_o ^^ get_o ^^ branch_default env retty (get_o ^^ code) (List.map prep cases)
+
+  (* Can a value of this type be represented by a heap object with this tag? *)
+  (* Needs to be conservative, i.e. return `true` if unsure *)
+  (* This function can also be used as assertions in a lint mode, e.g. in compile_exp *)
+  let can_have_tag ty tag =
+    let open Mo_types.Type in
+    match (tag : tag) with
+    | Array ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Array _ | Tup _) -> true
+      | (Prim _ |  Obj _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | Blob ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Prim (Text|Blob|Principal)) -> true
+      | (Prim _ | Obj _ | Array _ | Tup _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | Object ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Obj _) -> true
+      | (Prim _ | Array _ | Tup _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | _ -> true
+
+  (* like branch_with but with type information to statically skip some branches *)
+  let _branch_typed_with env ty retty branches =
+    branch_with env retty (List.filter (fun (tag,c) -> can_have_tag ty tag) branches)
+
+  let allocation_barrier env =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      E.call_import env "rts" "allocation_barrier"
+    else
+      G.nop)
+
+  let write_with_barrier env =
+    let (set_value, get_value) = new_local env "written_value" in
+    let (set_location, get_location) = new_local env "write_location" in
+    set_value ^^ set_location ^^
+    (* performance gain by first checking the GC state *)
+    E.call_import env "rts" "running_gc" ^^
+    G.if0 (
+      get_location ^^ get_value ^^
+      E.call_import env "rts" "write_with_barrier"
+    ) (
+      get_location ^^ get_value ^^
+      store_unskewed_ptr
+    )
+
+  let obj env tag element_instructions : G.t =
+    let n = List.length element_instructions in
+    let size = (Int32.add (Wasm.I32.of_int_u n) (header_size env)) in
+    let (set_object, get_object) = new_local env "new_object" in
+    alloc env size tag ^^
+    set_object ^^
+    let init_elem idx instrs : G.t =
+      get_object ^^
+      instrs ^^
+      Heap.store_field (Int32.add (Wasm.I32.of_int_u idx) (header_size env))
+    in
+    G.concat_mapi init_elem element_instructions ^^
+    get_object ^^
+    allocation_barrier env
+
+  let new_static_obj env tag payload =
+    let payload = StaticBytes.as_bytes payload in
+    let header_size = Int32.(mul Heap.word_size (header_size env)) in
+    let size = Int32.(add header_size (Int32.of_int (String.length payload))) in
+    let unskewed_ptr = E.reserve_static_memory env size in
+    let skewed_ptr = Int32.(add unskewed_ptr ptr_skew) in
+    let tag = bytes_of_int32 (int_of_tag tag) in
+    let forward = bytes_of_int32 skewed_ptr in (* forwarding pointer *)
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let incremental_gc_data = tag ^ forward ^ payload in
+      E.write_static_memory env unskewed_ptr incremental_gc_data
+    else
+      let non_incremental_gc_data = tag ^ payload in
+      E.write_static_memory env unskewed_ptr non_incremental_gc_data
+    );
+    skewed_ptr
+
+  let shared_static_obj env tag payload =
+    let tag_word = bytes_of_int32 (int_of_tag tag) in
+    let payload_bytes = StaticBytes.as_bytes payload in
+    let key = tag_word ^ payload_bytes in
+    match E.object_pool_find env key with
+    | Some ptr -> ptr (* no forwarding pointer dereferencing needed as static objects do not move *)
+    | None ->
+      let ptr = new_static_obj env tag payload in
+      E.object_pool_add env key ptr;
+      ptr
+
+end (* Tagged *)
+
+module MutBox = struct
+  (*
+      Mutable heap objects
+
+       ┌──────┬─────┬─────────┐
+       │ obj header │ payload │
+       └──────┴─────┴─────────┘
+
+     The object header includes the obj tag (MutBox) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let field = Tagged.header_size
+
+  let alloc env =
+    Tagged.obj env Tagged.MutBox [ compile_unboxed_zero ]
+
+  let static env =
+    let ptr = Tagged.new_static_obj env Tagged.MutBox StaticBytes.[
+      I32 0l; (* zero *)
+    ] in
+    E.add_static_root env ptr;
+    ptr
+
+  let load_field env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (field env)
+
+  let store_field env =
+    let (set_mutbox_value, get_mutbox_value) = new_local env "mutbox_value" in
+    set_mutbox_value ^^
+    Tagged.load_forwarding_pointer env ^^
+    get_mutbox_value ^^
+    Tagged.store_field env (field env)
+end
+
+
+module Opt = struct
+  (* The Option type. Optional values are represented as
+
+    1. ┌──────┐
+       │ null │
+       └──────┘
+
+       A special null value. It is fully static, and because it is unique, can
+       be recognized by pointer comparison (only the GC will care about the heap
+       tag).
+
+
+    2. ┌──────┬─────────┐
+       │ some │ payload │
+       └──────┴─────────┘
+
+       A heap-allocated box for `?v` values. Should only ever contain null or
+       another such box.
+
+    3. Anything else (pointer or unboxed scalar): Constituent value, implicitly
+       injected into the opt type.
+
+    This way, `?t` is represented without allocation, with the only exception of
+    the value `?ⁿnull` for n>0.
+
+    NB: `?ⁿnull` is essentially represented by the unary encoding of the number
+    of n. This could be optimized further, by storing `n` in the Some payload,
+    instead of a pointer, but unlikely worth it.
+
+  *)
+
+  let some_payload_field = Tagged.header_size
+
+  (* This relies on the fact that add_static deduplicates *)
+  let null_vanilla_lit env : int32 =
+    Tagged.shared_static_obj env Tagged.Null []
+
+  let null_lit env =
+    compile_unboxed_const (null_vanilla_lit env)
+
+  let vanilla_lit env ptr : int32 =
+    Tagged.shared_static_obj env Tagged.Some StaticBytes.[
+      I32 ptr
+    ]
+
+ let is_some env =
+    null_lit env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Ne))
+
+  let inject env e =
+    e ^^
+    Func.share_code1 env "opt_inject" ("x", I32Type) [I32Type] (fun env get_x ->
+      get_x ^^ BitTagged.if_tagged_scalar env [I32Type]
+        ( get_x ) (* scalar, no wrapping *)
+        ( get_x ^^ BitTagged.is_true_literal env ^^ (* exclude true literal since `branch_default` follows the forwarding pointer *)
+          E.if_ env [I32Type]
+            ( get_x ) (* true literal, no wrapping *)
+            ( get_x ^^ Tagged.branch_default env [I32Type]
+              ( get_x ) (* default tag, no wrapping *)
+              [ Tagged.Null,
+                (* NB: even ?null does not require allocation: We use a static
+                  singleton for that: *)
+                compile_unboxed_const (vanilla_lit env (null_vanilla_lit env))
+              ; Tagged.Some,
+                Tagged.obj env Tagged.Some [get_x]
+              ]
+            )
+        )
+    )
+
+  (* This function is used where conceptually, Opt.inject should be used, but
+  we know for sure that it wouldn’t do anything anyways, except dereferencing the forwarding pointer *)
+  let inject_simple env e =
+    e ^^ Tagged.load_forwarding_pointer env
+
+  let load_some_payload_field env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (some_payload_field env)
+
+  let project env =
+    Func.share_code1 env "opt_project" ("x", I32Type) [I32Type] (fun env get_x ->
+      get_x ^^ BitTagged.if_tagged_scalar env [I32Type]
+        ( get_x ) (* scalar, no wrapping *)
+        ( get_x ^^ BitTagged.is_true_literal env ^^ (* exclude true literal since `branch_default` follows the forwarding pointer *)
+          E.if_ env [I32Type]
+            ( get_x ) (* true literal, no wrapping *)
+            ( get_x ^^ Tagged.branch_default env [I32Type]
+              ( get_x ) (* default tag, no wrapping *)
+              [ Tagged.Some,
+                get_x ^^ load_some_payload_field env
+              ; Tagged.Null,
+                E.trap_with env "Internal error: opt_project: null!"
+              ]
+            )
+        )
+    )
+
+end (* Opt *)
+
+module Variant = struct
+  (* The Variant type. We store the variant tag in a first word; we can later
+     optimize and squeeze it in the Tagged tag. We can also later support unboxing
+     variants with an argument of type ().
+
+       ┌──────┬─────┬────────────┬─────────┐
+       │ obj header │ varianttag │ payload │
+       └──────┴─────┴────────────┴─────────┘
+
+     The object header includes the obj tag (TAG_VARIANT) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let variant_tag_field = Tagged.header_size
+  let payload_field env = Int32.add (variant_tag_field env) 1l
+
+  let hash_variant_label env : Mo_types.Type.lab -> int32 =
+    E.hash env
+
+  let inject env l e =
+    Tagged.obj env Tagged.Variant [compile_unboxed_const (hash_variant_label env l); e]
+
+  let get_variant_tag env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (variant_tag_field env)
+
+  let project env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (payload_field env)
+
+  (* Test if the top of the stack points to a variant with this label *)
+  let test_is env l =
+    get_variant_tag env ^^
+    compile_eq_const (hash_variant_label env l)
+
+  let vanilla_lit env i ptr =
+    Tagged.shared_static_obj env Tagged.Variant StaticBytes.[
+      I32 (hash_variant_label env i);
+      I32 ptr
+    ]
+
+end (* Variant *)
+
+
+module Closure = struct
+  (* In this module, we deal with closures, i.e. functions that capture parts
+     of their environment.
+
+     The structure of a closure is:
+
+       ┌──────┬─────┬───────┬──────┬──────────────┐
+       │ obj header │ funid │ size │ captured ... │
+       └──────┴─────┴───────┴──────┴──────────────┘
+
+     The object header includes the object tag (TAG_CLOSURE) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+  let header_size env = Int32.add (Tagged.header_size env) 2l
+
+  let funptr_field = Tagged.header_size
+  let len_field env = Int32.add 1l (Tagged.header_size env)
+
+  let load_data env i =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (Int32.add (header_size env) i)
+
+  let store_data env i =
+    let (set_closure_data, get_closure_data) = new_local env "closure_data" in
+    set_closure_data ^^
+    Tagged.load_forwarding_pointer env ^^
+    get_closure_data ^^
+    Tagged.store_field env (Int32.add (header_size env) i)
+
+  let prepare_closure_call env =
+    Tagged.load_forwarding_pointer env
+
+  (* Expect on the stack
+     * the function closure (using prepare_closure_call)
+     * and arguments (n-ary!)
+     * the function closure again!
+  *)
+  let call_closure env n_args n_res =
+    (* Calculate the wasm type for a given calling convention.
+       An extra first argument for the closure! *)
+    let ty = E.func_type env (FuncType (
+      I32Type :: Lib.List.make n_args I32Type,
+      FakeMultiVal.ty (Lib.List.make n_res I32Type))) in
+    (* get the table index *)
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (funptr_field env) ^^
+    (* All done: Call! *)
+    G.i (CallIndirect (nr ty)) ^^
+    FakeMultiVal.load env (Lib.List.make n_res I32Type)
+
+  let static_closure env fi : int32 =
+    Tagged.shared_static_obj env Tagged.Closure StaticBytes.[
+      I32 (E.add_fun_ptr env fi);
+      I32 0l
+    ]
+
+end (* Closure *)
+
+
+module BoxedWord64 = struct
+  (* We store large word64s, nat64s and int64s in immutable boxed 64bit heap objects.
+
+     Small values are stored unboxed, tagged, see BitTagged. The bit-tagging logic is
+     contained in BitTagged; here we just do the boxing.
+
+     The heap layout of a BoxedWord64 is:
+
+       ┌──────┬─────┬─────┬─────┐
+       │ obj header │    i64    │
+       └──────┴─────┴─────┴─────┘
+
+     The object header includes the object tag (Bits64) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+
+  let payload_field = Tagged.header_size
+
+  let vanilla_lit env i =
+    if BitTagged.can_tag_const i
+    then BitTagged.tag_const i
+    else
+      Tagged.shared_static_obj env Tagged.Bits64 StaticBytes.[
+        I64 i
+      ]
+
+  let compile_box env compile_elem : G.t =
+    let (set_i, get_i) = new_local env "boxed_i64" in
+    let size = if !Flags.gc_strategy = Flags.Incremental then 4l else 3l in
+    Tagged.alloc env size Tagged.Bits64 ^^
+    set_i ^^
+    get_i ^^ compile_elem ^^ Tagged.store_field64 env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+
+  let box env = Func.share_code1 env "box_i64" ("n", I64Type) [I32Type] (fun env get_n ->
+      get_n ^^ BitTagged.if_can_tag_i64 env [I32Type]
+        (get_n ^^ BitTagged.tag)
+        (compile_box env get_n)
+    )
+
+  let unbox env = Func.share_code1 env "unbox_i64" ("n", I32Type) [I64Type] (fun env get_n ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I64Type]
+        ( get_n ^^ BitTagged.untag env)
+        ( get_n ^^ Tagged.load_forwarding_pointer env ^^ Tagged.load_field64 env (payload_field env))
+    )
+end (* BoxedWord64 *)
+
+module Word64 = struct
+
+  let compile_add env = G.i (Binary (Wasm.Values.I64 I64Op.Add))
+  let compile_signed_sub env = G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+  let compile_mul env = G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+  let compile_signed_div env = G.i (Binary (Wasm.Values.I64 I64Op.DivS))
+  let compile_signed_mod env = G.i (Binary (Wasm.Values.I64 I64Op.RemS))
+  let compile_unsigned_div env = G.i (Binary (Wasm.Values.I64 I64Op.DivU))
+  let compile_unsigned_rem env = G.i (Binary (Wasm.Values.I64 I64Op.RemU))
+  let compile_unsigned_sub env =
+    Func.share_code2 env "nat_sub" (("n1", I64Type), ("n2", I64Type)) [I64Type] (fun env get_n1 get_n2 ->
+      get_n1 ^^ get_n2 ^^ G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+      E.then_trap_with env "Natural subtraction underflow" ^^
+      get_n1 ^^ get_n2 ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+    )
+
+  let compile_unsigned_pow env =
+    let name = prim_fun_name Type.Nat64 "wpow_nat" in
+    Func.share_code2 env name (("n", I64Type), ("exp", I64Type)) [I64Type]
+      (fun env get_n get_exp ->
+        let set_n = G.setter_for get_n in
+        let set_exp = G.setter_for get_exp in
+        let (set_acc, get_acc) = new_local64 env "acc" in
+
+        (* start with result = 1 *)
+        compile_const_64 1L ^^ set_acc ^^
+
+        (* handle exp == 0 *)
+        get_exp ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+        G.if1 I64Type get_acc (* done *)
+        begin
+          G.loop0 begin
+            (* Are we done? *)
+            get_exp ^^ compile_const_64 1L ^^ G.i (Compare (Wasm.Values.I64 I64Op.LeU)) ^^
+            G.if0 G.nop (* done *)
+            begin
+              (* Check low bit of exp to see if we need to multiply *)
+              get_exp ^^ compile_shl64_const 63L ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+              G.if0 G.nop
+              begin
+                (* Multiply! *)
+                get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ set_acc
+              end ^^
+              (* Square n, and shift exponent *)
+              get_n ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ set_n ^^
+              get_exp ^^ compile_shrU64_const 1L ^^ set_exp ^^
+              (* And loop *)
+              G.i (Br (nr 1l))
+            end
+          end ^^
+          (* Multiply a last time *)
+          get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+        end
+      )
+
+
+  let compile_signed_wpow env =
+    Func.share_code2 env "wrap_pow_Int64" (("n", I64Type), ("exp", I64Type)) [I64Type]
+      (fun env get_n get_exp ->
+        get_exp ^^
+        compile_const_64 0L ^^
+        G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+        E.else_trap_with env "negative power" ^^
+        get_n ^^ get_exp ^^ compile_unsigned_pow env
+      )
+
+  let _compile_eq env = G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+  let compile_relop env i64op = G.i (Compare (Wasm.Values.I64 i64op))
+
+end (* BoxedWord64 *)
+
+
+module BoxedSmallWord = struct
+  (* We store proper 32bit Word32 in immutable boxed 32bit heap objects.
+
+     Small values are stored unboxed, tagged, see BitTagged.
+
+     The heap layout of a BoxedSmallWord is:
+
+       ┌──────┬─────┬─────┐
+       │ obj header │ i32 │
+       └──────┴─────┴─────┘
+
+     The object header includes the object tag (Bits32) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+
+  let payload_field env = Tagged.header_size env
+
+  let vanilla_lit env i =
+    if BitTagged.can_tag_const (Int64.of_int (Int32.to_int i))
+    then BitTagged.tag_const (Int64.of_int (Int32.to_int i))
+    else
+      Tagged.shared_static_obj env Tagged.Bits32 StaticBytes.[
+        I32 i
+      ]
+
+  let compile_box env compile_elem : G.t =
+    let (set_i, get_i) = new_local env "boxed_i32" in
+    let size = if !Flags.gc_strategy = Flags.Incremental then 3l else 2l in
+    Tagged.alloc env size Tagged.Bits32 ^^
+    set_i ^^
+    get_i ^^ compile_elem ^^ Tagged.store_field env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+
+  let box env = Func.share_code1 env "box_i32" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ compile_shrU_const 30l ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Ctz)) ^^
+      G.if1 I32Type
+        (get_n ^^ BitTagged.tag_i32)
+        (compile_box env get_n)
+    )
+
+  let unbox env = Func.share_code1 env "unbox_i32" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        (get_n ^^ BitTagged.untag_i32)
+        (get_n ^^ Tagged.load_forwarding_pointer env ^^ Tagged.load_field env (payload_field env))
+    )
+
+  let _lit env n = compile_unboxed_const n ^^ box env
+
+end (* BoxedSmallWord *)
+
+module TaggedSmallWord = struct
+  (* While smaller-than-32bit words are treated as i32 from the WebAssembly
+     perspective, there are certain differences that are type based. This module
+     provides helpers to abstract over those.
+
+     Caution: Some functions here are also used for Nat32/Int32, while others
+     are _only_ used for the small ones. Check call-sites!
+  *)
+
+  let bits_of_type = function
+    | Type.(Int8|Nat8) -> 8
+    | Type.(Int16|Nat16) -> 16
+    | _ -> 32
+
+  let shift_of_type ty = Int32.of_int (32 - bits_of_type ty)
+
+  let bitwidth_mask_of_type = function
+    | Type.(Int8|Nat8) -> 0b111l
+    | Type.(Int16|Nat16) -> 0b1111l
+    | p -> todo "bitwidth_mask_of_type" (Arrange_type.prim p) 0l
+
+  let const_of_type ty n = Int32.(shift_left n (to_int (shift_of_type ty)))
+
+  let padding_of_type ty = Int32.(sub (const_of_type ty 1l) one)
+
+  let mask_of_type ty = Int32.lognot (padding_of_type ty)
+
+  (* Makes sure that we only shift/rotate the maximum number of bits available in the word. *)
+  let clamp_shift_amount = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitand_const (bitwidth_mask_of_type ty)
+
+  let shift_leftWordNtoI32 = compile_shl_const
+
+  (* Makes sure that the word payload (e.g. shift/rotate amount) is in the LSB bits of the word. *)
+  let lsb_adjust = function
+    | Type.(Int32|Nat32) -> G.nop
+    | Type.(Nat8|Nat16) as ty -> compile_shrU_const (shift_of_type ty)
+    | Type.(Int8|Int16) as ty -> compile_shrS_const (shift_of_type ty)
+    | _ -> assert false
+
+  (* Makes sure that the word payload (e.g. operation result) is in the MSB bits of the word. *)
+  let msb_adjust = function
+    | Type.(Int32|Nat32) -> G.nop
+    | ty -> shift_leftWordNtoI32 (shift_of_type ty)
+
+  (* Makes sure that the word representation invariant is restored. *)
+  let sanitize_word_result = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitand_const (mask_of_type ty)
+
+  (* Sets the number (according to the type's word invariant) of LSBs. *)
+  let compile_word_padding = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitor_const (padding_of_type ty)
+
+  (* Kernel for counting leading zeros, according to the word invariant. *)
+  let clz_kernel ty =
+    compile_word_padding ty ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Clz)) ^^
+    msb_adjust ty
+
+  (* Kernel for counting trailing zeros, according to the word invariant. *)
+  let ctz_kernel ty =
+    compile_word_padding ty ^^
+    compile_rotr_const (shift_of_type ty) ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Ctz)) ^^
+    msb_adjust ty
+
+  (* Kernel for testing a bit position, according to the word invariant. *)
+  let btst_kernel env ty =
+    let (set_b, get_b) = new_local env "b"
+    in lsb_adjust ty ^^ set_b ^^ lsb_adjust ty ^^
+       compile_unboxed_one ^^ get_b ^^ clamp_shift_amount ty ^^
+       G.i (Binary (Wasm.Values.I32 I32Op.Shl)) ^^
+       G.i (Binary (Wasm.Values.I32 I32Op.And))
+
+  (* Code points occupy 21 bits, so can always be tagged scalars *)
+  let untag_codepoint = compile_shrU_const 8l
+  let tag_codepoint = compile_shl_const 8l
+
+  (* Checks (n < 0xD800 || 0xE000 ≤ n ≤ 0x10FFFF),
+     ensuring the codepoint range and the absence of surrogates. *)
+  let check_and_tag_codepoint env =
+    Func.share_code1 env "Nat32->Char" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ compile_unboxed_const 0xD800l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^
+      get_n ^^ compile_unboxed_const 0xE000l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+      get_n ^^ compile_unboxed_const 0x10FFFFl ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+      E.then_trap_with env "codepoint out of range" ^^
+      get_n ^^ tag_codepoint
+    )
+
+  let vanilla_lit ty v =
+    Int32.(shift_left (of_int v) (to_int (shift_of_type ty)))
+
+  (* Wrapping implementation for multiplication and exponentiation. *)
+
+  let compile_word_mul env ty =
+    lsb_adjust ty ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Mul))
+
+  let compile_nat_power env ty =
+    (* Square- and multiply exponentiation *)
+    let name = prim_fun_name ty "wpow_nat" in
+    Func.share_code2 env name (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let set_n = G.setter_for get_n in
+        let set_exp = G.setter_for get_exp in
+        let (set_acc, get_acc) = new_local env "acc" in
+
+        (* unshift arguments *)
+        get_exp ^^ compile_shrU_const (shift_of_type ty) ^^ set_exp ^^
+        get_n ^^ compile_shrU_const (shift_of_type ty) ^^ set_n ^^
+
+        (* The accumulator starts with and stays shifted, so no other shifts needed. *)
+        compile_unboxed_const (const_of_type ty 1l) ^^ set_acc ^^
+
+        (* handle exp == 0 *)
+        get_exp ^^ G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+        G.if1 I32Type get_acc (* done *)
+        begin
+          G.loop0 begin
+            (* Are we done? *)
+            get_exp ^^ compile_unboxed_const 1l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+            G.if0 G.nop (* done *)
+            begin
+              (* Check low bit of exp to see if we need to multiply *)
+              get_exp ^^ compile_shl_const 31l ^^ G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+              G.if0 G.nop
+              begin
+                (* Multiply! *)
+                get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^ set_acc
+              end ^^
+              (* Square n, and shift exponent *)
+              get_n ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^ set_n ^^
+              get_exp ^^ compile_shrU_const 1l ^^ set_exp ^^
+              (* And loop *)
+              G.i (Br (nr 1l))
+            end
+          end ^^
+          (* Multiply a last time *)
+          get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul))
+          (* Accumulator was shifted, so no further shift needed here *)
+        end
+      )
+
+  let compile_int_power env ty =
+    let name = prim_fun_name ty "wpow_int" in
+    Func.share_code2 env name (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        get_exp ^^
+        compile_unboxed_const 0l ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        E.else_trap_with env "negative power" ^^
+        get_n ^^ get_exp ^^ compile_nat_power env ty
+      )
+
+
+  (* To rotate, first rotate a copy by bits_of_type into the other direction *)
+  let rotl env ty =
+     Func.share_code2 env (prim_fun_name ty "rotl") (("n", I32Type), ("by", I32Type)) [I32Type]
+       (fun env get_n get_by ->
+        let open Wasm.Values in
+        let beside_adjust = compile_rotr_const (Int32.of_int (bits_of_type ty)) in
+        get_n ^^ get_n ^^ beside_adjust ^^ G.i (Binary (I32 I32Op.Or)) ^^
+        get_by ^^ lsb_adjust ty ^^ clamp_shift_amount ty ^^ G.i (Binary (I32 I32Op.Rotl)) ^^
+        sanitize_word_result ty
+       )
+
+  let rotr env ty =
+     Func.share_code2 env (prim_fun_name ty "rotr") (("n", I32Type), ("by", I32Type)) [I32Type]
+       (fun env get_n get_by ->
+        let open Wasm.Values in
+        let beside_adjust = compile_rotl_const (Int32.of_int (bits_of_type ty)) in
+        get_n ^^ get_n ^^ beside_adjust ^^ G.i (Binary (I32 I32Op.Or)) ^^
+        get_by ^^ lsb_adjust ty ^^ clamp_shift_amount ty ^^ G.i (Binary (I32 I32Op.Rotr)) ^^
+        sanitize_word_result ty
+       )
+
+end (* TaggedSmallWord *)
+
+
+module Float = struct
+  (* We store floats (C doubles) in immutable boxed 64bit heap objects.
+
+     The heap layout of a Float is:
+
+       ┌──────┬─────┬─────┬─────┐
+       │ obj header │    f64    │
+       └──────┴─────┴─────┴─────┘
+
+     For now the tag stored is that of a Bits64, because the payload is
+     treated opaquely by the RTS. We'll introduce a separate tag when the need of
+     debug inspection (or GC representation change) arises.
+
+     The object header includes the object tag (Bits64) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let payload_field env = Tagged.header_size env
+
+  let compile_unboxed_const f = G.i (Const (nr (Wasm.Values.F64 f)))
+
+  let vanilla_lit env f =
+    Tagged.shared_static_obj env Tagged.Bits64 StaticBytes.[
+      I64 (Wasm.F64.to_bits f)
+    ]
+
+  let box env = Func.share_code1 env "box_f64" ("f", F64Type) [I32Type] (fun env get_f ->
+    let (set_i, get_i) = new_local env "boxed_f64" in
+    let size = Int32.add (Tagged.header_size env)  2l in
+    Tagged.alloc env size Tagged.Bits64 ^^
+    set_i ^^
+    get_i ^^ get_f ^^ Tagged.store_field_float64 env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+  )
+
+  let unbox env = Tagged.load_forwarding_pointer env ^^ Tagged.load_field_float64 env (payload_field env)
+
+end (* Float *)
+
+
+module ReadBuf = struct
+  (*
+  Combinators to safely read from a dynamic buffer.
+
+  We represent a buffer by a pointer to two words in memory (usually allocated
+  on the shadow stack): The first is a pointer to the current position of the buffer,
+  the second one a pointer to the end (to check out-of-bounds).
+
+  Code that reads from this buffer will update the former, i.e. it is mutable.
+
+  The format is compatible with C (pointer to a struct) and avoids the need for the
+  multi-value extension that we used before to return both parse result _and_
+  updated pointer.
+
+  All pointers here are unskewed!
+
+  This module is mostly for serialization, but because there are bits of
+  serialization code in the BigNumType implementations, we put it here.
+  *)
+
+  let get_ptr get_buf =
+    get_buf ^^ G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None})
+  let get_end get_buf =
+    get_buf ^^ G.i (Load {ty = I32Type; align = 2; offset = Heap.word_size; sz = None})
+  let set_ptr get_buf new_val =
+    get_buf ^^ new_val ^^ G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None})
+  let set_end get_buf new_val =
+    get_buf ^^ new_val ^^ G.i (Store {ty = I32Type; align = 2; offset = Heap.word_size; sz = None})
+  let set_size get_buf get_size =
+    set_end get_buf
+      (get_ptr get_buf ^^ get_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)))
+
+  let alloc env f = Stack.with_words env "buf" 2l f
+
+  let advance get_buf get_delta =
+    set_ptr get_buf (get_ptr get_buf ^^ get_delta ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)))
+
+  let read_leb128 env get_buf =
+    get_buf ^^ E.call_import env "rts" "leb128_decode"
+
+  let read_sleb128 env get_buf =
+    get_buf ^^ E.call_import env "rts" "sleb128_decode"
+
+  let check_space env get_buf get_delta =
+    get_delta ^^
+    get_end get_buf ^^ get_ptr get_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    G.i (Compare (Wasm.Values.I32 I64Op.LeU)) ^^
+    E.else_trap_with env "IDL error: out of bounds read"
+
+  let check_page_end env get_buf incr_delta =
+    get_ptr get_buf ^^ compile_bitand_const 0xFFFFl ^^
+    incr_delta ^^
+    compile_shrU_const 16l
+
+  let is_empty env get_buf =
+    get_end get_buf ^^ get_ptr get_buf ^^
+    G.i (Compare (Wasm.Values.I32 I64Op.Eq))
+
+  let read_byte env get_buf =
+    check_space env get_buf (compile_unboxed_const 1l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+    advance get_buf (compile_unboxed_const 1l)
+
+  let read_word16 env get_buf =
+    check_space env get_buf (compile_unboxed_const 2l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack16, ZX)}) ^^
+    advance get_buf (compile_unboxed_const 2l)
+
+  let read_word32 env get_buf =
+    check_space env get_buf (compile_unboxed_const 4l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 4l)
+
+  let speculative_read_word64 env get_buf =
+    check_page_end env get_buf (compile_add_const 8l) ^^
+    G.if1 I64Type
+      (compile_const_64 (-1L))
+      begin
+        get_ptr get_buf ^^
+        G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None})
+      end
+
+  let read_word64 env get_buf =
+    check_space env get_buf (compile_unboxed_const 8l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 8l)
+
+  let read_float64 env get_buf =
+    check_space env get_buf (compile_unboxed_const 8l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = F64Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 8l)
+
+  let read_blob env get_buf get_len =
+    check_space env get_buf get_len ^^
+    (* Already has destination address on the stack *)
+    get_ptr get_buf ^^
+    get_len ^^
+    Heap.memcpy env ^^
+    advance get_buf get_len
+
+end (* Buf *)
+
+
+type comparator = Lt | Le | Ge | Gt
+
+module type BigNumType =
+sig
+  (* word from SR.Vanilla, trapping, unsigned semantics *)
+  val to_word32 : E.t -> G.t
+  val to_word64 : E.t -> G.t
+  val to_word32_with : E.t -> G.t (* with error message on stack (ptr/len) *)
+
+  (* word from SR.Vanilla, lossy, raw bits *)
+  val truncate_to_word32 : E.t -> G.t
+  val truncate_to_word64 : E.t -> G.t
+
+  (* unsigned word to SR.Vanilla *)
+  val from_word30 : E.t -> G.t
+  val from_word32 : E.t -> G.t
+  val from_word64 : E.t -> G.t
+
+  (* signed word to SR.Vanilla *)
+  val from_signed_word32 : E.t -> G.t
+  val from_signed_word64 : E.t -> G.t
+
+  (* buffers *)
+  (* given a numeric object on stack (vanilla),
+     push the number (i32) of bytes necessary
+     to externalize the numeric object *)
+  val compile_data_size_signed : E.t -> G.t
+  val compile_data_size_unsigned : E.t -> G.t
+  (* given on stack
+     - numeric object (vanilla, TOS)
+     - data buffer
+    store the binary representation of the numeric object into the data buffer,
+    and push the number (i32) of bytes stored onto the stack
+   *)
+  val compile_store_to_data_buf_signed : E.t -> G.t
+  val compile_store_to_data_buf_unsigned : E.t -> G.t
+  (* given on stack
+     - numeric object (vanilla, TOS)
+     - (unskewed) stream
+    store the binary representation of the numeric object into the stream
+   *)
+  val compile_store_to_stream_signed : E.t -> G.t
+  val compile_store_to_stream_unsigned : E.t -> G.t
+  (* given a ReadBuf on stack, consume bytes from it,
+     deserializing to a numeric object
+     and leave it on the stack (vanilla).
+     The boolean argument is true if the value to be read is signed.
+   *)
+  val compile_load_from_data_buf : E.t -> G.t -> bool -> G.t
+
+  (* literals *)
+  val vanilla_lit : E.t -> Big_int.big_int -> int32
+
+  (* arithmetic *)
+  val compile_abs : E.t -> G.t
+  val compile_neg : E.t -> G.t
+  val compile_add : E.t -> G.t
+  val compile_signed_sub : E.t -> G.t
+  val compile_unsigned_sub : E.t -> G.t
+  val compile_mul : E.t -> G.t
+  val compile_signed_div : E.t -> G.t
+  val compile_signed_mod : E.t -> G.t
+  val compile_unsigned_div : E.t -> G.t
+  val compile_unsigned_rem : E.t -> G.t
+  val compile_unsigned_pow : E.t -> G.t
+  val compile_lsh : E.t -> G.t
+  val compile_rsh : E.t -> G.t
+
+  (* comparisons *)
+  val compile_eq : E.t -> G.t
+  val compile_is_negative : E.t -> G.t
+  val compile_relop : E.t -> comparator -> G.t
+
+  (* representation checks *)
+  (* given a numeric object on the stack as skewed pointer, check whether
+     it can be faithfully stored in N bits, including a leading sign bit
+     leaves boolean result on the stack
+     N must be 2..64
+   *)
+  val fits_signed_bits : E.t -> int -> G.t
+  (* given a numeric object on the stack as skewed pointer, check whether
+     it can be faithfully stored in N unsigned bits
+     leaves boolean result on the stack
+     N must be 1..64
+   *)
+  val fits_unsigned_bits : E.t -> int -> G.t
+end
+
+let i64op_from_relop = function
+  | Lt -> I64Op.LtS
+  | Le -> I64Op.LeS
+  | Ge -> I64Op.GeS
+  | Gt -> I64Op.GtS
+
+let name_from_relop = function
+  | Lt -> "B_lt"
+  | Le -> "B_le"
+  | Ge -> "B_ge"
+  | Gt -> "B_gt"
+
+(* helper, measures the dynamics of the unsigned i32, returns (32 - effective bits) *)
+let unsigned_dynamics get_x =
+  get_x ^^
+  G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+
+(* helper, measures the dynamics of the signed i32, returns (32 - effective bits) *)
+let signed_dynamics get_x =
+  get_x ^^ compile_shl_const 1l ^^
+  get_x ^^
+  G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+  G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+
+module I32Leb = struct
+  let compile_size dynamics get_x =
+    get_x ^^ G.if1 I32Type
+      begin
+        compile_unboxed_const 38l ^^
+        dynamics get_x ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+        compile_divU_const 7l
+      end
+      compile_unboxed_one
+
+  let compile_leb128_size get_x = compile_size unsigned_dynamics get_x
+  let compile_sleb128_size get_x = compile_size signed_dynamics get_x
+
+  let compile_store_to_data_buf_unsigned env get_x get_buf =
+    get_x ^^ get_buf ^^ E.call_import env "rts" "leb128_encode" ^^
+    compile_leb128_size get_x
+
+  let compile_store_to_data_buf_signed env get_x get_buf =
+    get_x ^^ get_buf ^^ E.call_import env "rts" "sleb128_encode" ^^
+    compile_sleb128_size get_x
+end
+
+module MakeCompact (Num : BigNumType) : BigNumType = struct
+
+  (* Compact BigNums are a representation of signed 31-bit bignums (of the
+     underlying boxed representation `Num`), that fit into an i32 as per the
+     BitTagged representation.
+
+     Many arithmetic operations can be be performed on this right-zero-padded
+     representation directly. For some operations (e.g. multiplication) the
+     second argument needs to be furthermore right-shifted to avoid overflow.
+     Similarly, for division the result must be left-shifted.
+
+     Generally all operations begin with checking whether both arguments are
+     already tagged scalars. If so, the arithmetic can be performed in machine
+     registers (fast path). Otherwise one or both arguments need boxing and the
+     arithmetic needs to be carried out on the underlying boxed bignum
+     representation (slow path).
+
+     The result appears as a boxed number in the latter case, so a check is
+     performed if it can be a tagged scalar. Conversely in the former case the
+     64-bit result can either be a tagged scalar or needs to be boxed.
+
+     Manipulation of the result is unnecessary for the comparison predicates.
+
+     For the `pow` operation the check that both arguments are tagged scalars
+     is not sufficient. Here we count and multiply effective bitwidths to
+     figure out whether the operation will overflow 64 bits, and if so, we fall
+     back to the slow path.
+   *)
+
+  (* TODO: There is some unnecessary result shifting when the div result needs
+     to be boxed. Is this possible at all to happen? With (/-1) maybe! *)
+
+  (* TODO: Does the result of the rem/mod fast path ever needs boxing? *)
+
+  (* examine the skewed pointer and determine if number fits into 31 bits *)
+  let fits_in_vanilla env = Num.fits_signed_bits env 31
+
+  (* Tagged scalar to right-0-padded signed i64 *)
+  let extend64 = G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32))
+
+  (* A variant of BitTagged.can_tag that works on right-0-tagged 64 bit numbers *)
+  let if_can_tag_padded env retty is1 is2 =
+    compile_shrS64_const 1L ^^ BitTagged.if_can_tag_i64 env retty is1 is2
+
+  (* right-0-padded signed i64 to tagged scalar *)
+  let tag_padded = G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+
+  (* creates a boxed bignum from a right-0-padded signed i64 *)
+  let box64 env = compile_shrS64_const 1L ^^ Num.from_signed_word64 env
+
+  (* creates a boxed bignum from an right-0-padded signed i32 *)
+  let extend_and_box64 env = extend64 ^^ box64 env
+
+  (* check if both arguments are tagged scalars,
+     if so, promote to right-0-padded, signed i64 and perform the fast path.
+     Otherwise make sure that both arguments are in heap representation,
+     and run the slow path on them.
+     In both cases bring the results into normal form.
+   *)
+  let try_unbox2 name fast slow env =
+    Func.share_code2 env name (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        let set_res, get_res = new_local env "res" in
+        let set_res64, get_res64 = new_local64 env "res64" in
+        get_a ^^ get_b ^^
+        BitTagged.if_both_tagged_scalar env [I32Type]
+          begin
+            get_a ^^ extend64 ^^
+            get_b ^^ extend64 ^^
+            fast env ^^ set_res64 ^^
+            get_res64 ^^
+            if_can_tag_padded env [I32Type]
+              (get_res64 ^^ tag_padded)
+              (get_res64 ^^ box64 env)
+          end
+          begin
+            get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_a ^^ extend_and_box64 env)
+              get_a ^^
+            get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_b ^^ extend_and_box64 env)
+              get_b ^^
+            slow env ^^ set_res ^^ get_res ^^
+            fits_in_vanilla env ^^
+            G.if1 I32Type
+              (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32)
+              get_res
+          end)
+
+  let compile_add = try_unbox2 "B_add" Word64.compile_add Num.compile_add
+
+  let adjust_arg2 code env = compile_shrS64_const 1L ^^ code env
+  let adjust_result code env = code env ^^ compile_shl64_const 1L
+
+  let compile_mul = try_unbox2 "B_mul" (adjust_arg2 Word64.compile_mul) Num.compile_mul
+  let compile_signed_sub = try_unbox2 "B+sub" Word64.compile_signed_sub Num.compile_signed_sub
+  let compile_signed_div = try_unbox2 "B+div" (adjust_result Word64.compile_signed_div) Num.compile_signed_div
+  let compile_signed_mod = try_unbox2 "B_mod" Word64.compile_signed_mod Num.compile_signed_mod
+  let compile_unsigned_div = try_unbox2 "B_div" (adjust_result Word64.compile_unsigned_div) Num.compile_unsigned_div
+  let compile_unsigned_rem = try_unbox2 "B_rem" Word64.compile_unsigned_rem Num.compile_unsigned_rem
+  let compile_unsigned_sub = try_unbox2 "B_sub" Word64.compile_unsigned_sub Num.compile_unsigned_sub
+
+  let compile_unsigned_pow env =
+    Func.share_code2 env "B_pow" (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+    let set_res, get_res = new_local env "res" in
+    let set_res64, get_res64 = new_local64 env "res64" in
+    get_a ^^ get_b ^^
+    BitTagged.if_both_tagged_scalar env [I32Type]
+      begin
+        let set_a64, get_a64 = new_local64 env "a64" in
+        let set_b64, get_b64 = new_local64 env "b64" in
+        (* Convert to plain Word64 *)
+        get_a ^^ extend64 ^^ compile_shrS64_const 1L ^^ set_a64 ^^
+        get_b ^^ extend64 ^^ compile_shrS64_const 1L ^^ set_b64 ^^
+
+        (* estimate bitcount of result: `bits(a) * b <= 64` guarantees
+           the absence of overflow in 64-bit arithmetic *)
+        compile_const_64 64L ^^
+        get_a64 ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+        get_b64 ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^
+        compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.LeU)) ^^
+        G.if1 I32Type
+          begin
+            get_a64 ^^ get_b64 ^^ Word64.compile_unsigned_pow env ^^ set_res64 ^^
+            get_res64 ^^ BitTagged.if_can_tag_i64 env [I32Type]
+              (get_res64 ^^ BitTagged.tag)
+              (get_res64 ^^ Num.from_word64 env)
+          end
+          begin
+            get_a64 ^^ Num.from_signed_word64 env ^^
+            get_b64 ^^ Num.from_signed_word64 env ^^
+            Num.compile_unsigned_pow env ^^ set_res ^^
+            get_res ^^ fits_in_vanilla env ^^
+            G.if1 I32Type
+              (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32)
+              get_res
+          end
+      end
+      begin
+        get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+          (get_a ^^ extend_and_box64 env)
+          get_a ^^
+        get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+          (get_b ^^ extend_and_box64 env)
+          get_b ^^
+        Num.compile_unsigned_pow env ^^ set_res ^^
+        get_res ^^ fits_in_vanilla env ^^
+        G.if1 I32Type
+          (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32)
+          get_res
+      end)
+
+  (*
+    Note [left shifting compact Nat]
+    For compact Nats (i.e. non-heap allocated ones) we first try to perform the shift in the i64 domain.
+    for this we extend (signed, but that doesn't really matter) to 64 bits and then perform the left shift.
+    Then we check whether the result will fit back into the compact representation by either
+     - comparing: truncate to i32, then sign-extend back to i64, with the shift result
+     - count leading zeros >= 33 (currently we don't use this idea).
+    If the test works out, we have to ensure that the shift amount was smaller than 64, due to Wasm semantics.
+    If this is the case then the truncated i32 is the result (lowest bit is guaranteed to be clear),
+    otherwise we have to fall back to bignum arithmetic. We have two choices:
+     - reuse the 64-bit shift result going to heap (not currently, amount must be less than 33 for this to work)
+     - convert the original base to bigum and do the shift there.
+
+    N.B. we currently choose the shift cutoff as 42, just because (it must be <64).
+   *)
+
+  let compile_lsh env =
+    Func.share_code2 env "B_lsh" (("n", I32Type), ("amount", I32Type)) [I32Type]
+    (fun env get_n get_amount ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        ( (* see Note [left shifting compact Nat] *)
+          get_n ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+          get_amount ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+          let set_remember, get_remember = new_local64 env "remember" in
+          set_remember ^^ get_remember ^^
+          G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+          let set_res, get_res = new_local env "res" in
+          set_res ^^ get_res ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^ (* exclude sign flip *)
+          get_remember ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.Eq)) ^^
+          get_amount ^^ compile_rel_const I32Op.LeU 42l ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+          G.if1 I32Type
+            get_res
+            (get_n ^^ compile_shrS_const 1l ^^ Num.from_word30 env ^^ get_amount ^^ Num.compile_lsh env)
+        )
+        (get_n ^^ get_amount ^^ Num.compile_lsh env))
+
+  let compile_rsh env =
+    Func.share_code2 env "B_rsh" (("n", I32Type), ("amount", I32Type)) [I32Type]
+    (fun env get_n get_amount ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        begin
+          get_n ^^
+          get_amount ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.ShrU)) ^^
+          compile_bitand_const 0xFFFFFFFEl ^^
+          get_amount ^^ compile_rel_const I32Op.LeU 31l ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Mul)) (* branch-free `if` *)
+        end
+        begin
+          get_n ^^ get_amount ^^ Num.compile_rsh env ^^
+          let set_res, get_res = new_local env "res" in
+          set_res ^^ get_res ^^
+          fits_in_vanilla env ^^
+          G.if1 I32Type
+            (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32)
+            get_res
+        end)
+
+  let compile_is_negative env =
+    let set_n, get_n = new_local env "n" in
+    set_n ^^ get_n ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_n ^^ compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)))
+      (get_n ^^ Num.compile_is_negative env)
+
+  let vanilla_lit env = function
+    | n when Big_int.is_int_big_int n && BitTagged.can_tag_const (Big_int.int64_of_big_int n) ->
+      BitTagged.tag_const (Big_int.int64_of_big_int n)
+    | n -> Num.vanilla_lit env n
+
+  let compile_neg env =
+    Func.share_code1 env "B_neg" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ BitTagged.if_tagged_scalar env [I32Type]
+        begin
+          get_n ^^ compile_eq_const 0x80000000l ^^ (* -2^30 shifted *)
+          G.if1 I32Type
+            (compile_unboxed_const 0x40000000l ^^ Num.from_word32 env)
+            begin
+              compile_unboxed_const 0l ^^
+              get_n ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+            end
+        end
+        (get_n ^^ Num.compile_neg env)
+    )
+
+  let try_comp_unbox2 name fast slow env =
+    Func.share_code2 env name (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        get_a ^^ get_b ^^
+        BitTagged.if_both_tagged_scalar env [I32Type]
+          begin
+            get_a ^^ extend64 ^^
+            get_b ^^ extend64 ^^
+            fast env
+          end
+          begin
+            get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_a ^^ extend_and_box64 env)
+              get_a ^^
+            get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_b ^^ extend_and_box64 env)
+              get_b ^^
+            slow env
+          end)
+
+  let compile_eq env =
+    Func.share_code2 env "B_eq" (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        get_a ^^ get_b ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        G.if1 I32Type
+          (Bool.lit true)
+          (get_a ^^ get_b ^^
+           BitTagged.if_both_tagged_scalar env [I32Type]
+             (Bool.lit false)
+             begin
+               get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+                 (get_a ^^ extend_and_box64 env)
+                 get_a ^^
+               get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+                 (get_b ^^ extend_and_box64 env)
+                 get_b ^^
+               Num.compile_eq env
+             end))
+
+  let compile_relop env bigintop =
+    try_comp_unbox2 (name_from_relop bigintop)
+      (fun env' -> Word64.compile_relop env' (i64op_from_relop bigintop))
+      (fun env' -> Num.compile_relop env' bigintop)
+      env
+
+  let try_unbox iN fast slow env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [iN]
+      (get_a ^^ fast env)
+      (get_a ^^ slow env)
+
+  let fits_unsigned_bits env n =
+    try_unbox I32Type (fun _ -> match n with
+        | 32 | 64 -> G.i Drop ^^ Bool.lit true
+        | 8 | 16 ->
+          compile_bitand_const Int32.(logor 1l (shift_left minus_one (n + 1))) ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+        | _ -> assert false
+      )
+      (fun env -> Num.fits_unsigned_bits env n)
+      env
+
+  let fits_signed_bits env n =
+    let set_a, get_a = new_local env "a" in
+    try_unbox I32Type (fun _ -> match n with
+        | 32 | 64 -> G.i Drop ^^ Bool.lit true
+        | 8 | 16 ->
+           set_a ^^
+           get_a ^^ get_a ^^ compile_shrS_const 1l ^^
+           G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+           compile_bitand_const
+             Int32.(shift_left minus_one n) ^^
+           G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+        | _ -> assert false
+      )
+      (fun env -> Num.fits_signed_bits env n)
+      env
+
+  let compile_abs env =
+    try_unbox I32Type
+      begin
+        fun _ ->
+        let set_a, get_a = new_local env "a" in
+        set_a ^^
+        get_a ^^ compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+        G.if1 I32Type
+          begin
+            get_a ^^
+            (* -2^30 is small enough for compact representation, but 2^30 isn't *)
+            compile_eq_const 0x80000000l ^^ (* i.e. -2^30 shifted *)
+            G.if1 I32Type
+              (compile_unboxed_const 0x40000000l ^^ Num.from_word32 env)
+              begin
+                (* absolute value works directly on shifted representation *)
+                compile_unboxed_const 0l ^^
+                get_a ^^
+                G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+              end
+          end
+          get_a
+      end
+      Num.compile_abs
+      env
+
+  let compile_load_from_word64 env get_data_buf = function
+    | false -> get_data_buf ^^ E.call_import env "rts" "bigint_leb128_decode_word64"
+    | true -> get_data_buf ^^ E.call_import env "rts" "bigint_sleb128_decode_word64"
+
+  let compile_load_from_data_buf env get_data_buf signed =
+    (* see Note [speculating for short (S)LEB encoded bignums] *)
+    ReadBuf.speculative_read_word64 env get_data_buf ^^
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^ get_a ^^
+    compile_xor64_const (-1L) ^^
+    compile_bitand64_const 0b1000000010000000100000001000000010000000L ^^
+    let set_eom, get_eom = new_local64 env "eom" in
+    set_eom ^^ get_eom ^^
+    G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+    G.if1 I32Type
+      begin
+        Num.compile_load_from_data_buf env get_data_buf signed
+      end
+      begin
+        get_a ^^
+        get_eom ^^ G.i (Unary (Wasm.Values.I64 I64Op.Ctz)) ^^
+        compile_load_from_word64 env get_data_buf signed
+      end
+
+  let compile_store_to_data_buf_unsigned env =
+    let set_x, get_x = new_local env "x" in
+    let set_buf, get_buf = new_local env "buf" in
+    set_x ^^ set_buf ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 ^^ set_x ^^
+        I32Leb.compile_store_to_data_buf_unsigned env get_x get_buf
+      )
+      (fun env ->
+        G.i Drop ^^
+        get_buf ^^ get_x ^^ Num.compile_store_to_data_buf_unsigned env)
+      env
+
+  let compile_store_to_data_buf_signed env =
+    let set_x, get_x = new_local env "x" in
+    let set_buf, get_buf = new_local env "buf" in
+    set_x ^^ set_buf ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 ^^ set_x ^^
+        I32Leb.compile_store_to_data_buf_signed env get_x get_buf
+      )
+      (fun env ->
+        G.i Drop ^^
+        get_buf ^^ get_x ^^ Num.compile_store_to_data_buf_signed env)
+      env
+
+  let compile_store_to_stream_unsigned env =
+    let set_x, get_x = new_local env "x" in
+    let set_stream, get_stream = new_local env "stream" in
+    set_x ^^ set_stream ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 ^^ set_x ^^
+        (* get size & reserve & encode *)
+        let dest =
+          get_stream ^^
+          I32Leb.compile_leb128_size get_x ^^
+          E.call_import env "rts" "stream_reserve" in
+        I32Leb.compile_store_to_data_buf_unsigned env get_x dest)
+      (fun env ->
+        G.i Drop ^^
+        get_stream ^^ get_x ^^ Num.compile_store_to_stream_unsigned env ^^
+        compile_unboxed_zero)
+      env ^^
+      G.i Drop
+
+  let compile_store_to_stream_signed env =
+    let set_x, get_x = new_local env "x" in
+    let set_stream, get_stream = new_local env "stream" in
+    set_x ^^ set_stream ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 ^^ set_x ^^
+        (* get size & reserve & encode *)
+        let dest =
+          get_stream ^^
+          I32Leb.compile_sleb128_size get_x ^^
+          E.call_import env "rts" "stream_reserve" in
+        I32Leb.compile_store_to_data_buf_signed env get_x dest)
+      (fun env ->
+        G.i Drop ^^
+        get_stream ^^ get_x ^^ Num.compile_store_to_stream_signed env ^^
+        compile_unboxed_zero)
+      env ^^
+      G.i Drop
+
+  let compile_data_size_unsigned env =
+    try_unbox I32Type
+      (fun _ ->
+        let set_x, get_x = new_local env "x" in
+        BitTagged.untag_i32 ^^ set_x ^^
+        I32Leb.compile_leb128_size get_x
+      )
+      (fun env -> Num.compile_data_size_unsigned env)
+      env
+
+  let compile_data_size_signed env =
+    try_unbox I32Type
+      (fun _ ->
+        let set_x, get_x = new_local env "x" in
+        BitTagged.untag_i32 ^^ set_x ^^
+        I32Leb.compile_sleb128_size get_x
+      )
+      (fun env -> Num.compile_data_size_signed env)
+      env
+
+  let from_signed_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_i32 env  [I32Type]
+      (get_a ^^ BitTagged.tag_i32)
+      (get_a ^^ Num.from_signed_word32 env)
+
+  let from_signed_word64 env =
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_i64 env [I32Type]
+      (get_a ^^ BitTagged.tag)
+      (get_a ^^ Num.from_signed_word64 env)
+
+  let from_word30 env =
+    compile_shl_const 1l
+
+  let from_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_u32 env [I32Type]
+      (get_a ^^ BitTagged.tag_i32)
+      (get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^ Num.from_word64 env)
+
+  let from_word64 env =
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_u64 env [I32Type]
+      (get_a ^^ BitTagged.tag)
+      (get_a ^^ Num.from_word64 env)
+
+  let truncate_to_word64 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I64Type]
+      (get_a ^^ BitTagged.untag env)
+      (get_a ^^ Num.truncate_to_word64 env)
+
+  let truncate_to_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32)
+      (get_a ^^ Num.truncate_to_word32 env)
+
+  let to_word64 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I64Type]
+      (get_a ^^ BitTagged.untag env)
+      (get_a ^^ Num.to_word64 env)
+
+  let to_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32)
+      (get_a ^^ Num.to_word32 env)
+
+  let to_word32_with env =
+    let set_a, get_a = new_local env "a" in
+    let set_err_msg, get_err_msg = new_local env "err_msg" in
+    set_err_msg ^^ set_a ^^
+    get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32)
+      (get_a ^^ get_err_msg ^^ Num.to_word32_with env)
+end
+
+module BigNumLibtommath : BigNumType = struct
+
+  let to_word32 env = E.call_import env "rts" "bigint_to_word32_trap"
+  let to_word64 env = E.call_import env "rts" "bigint_to_word64_trap"
+  let to_word32_with env = E.call_import env "rts" "bigint_to_word32_trap_with"
+
+  let truncate_to_word32 env = E.call_import env "rts" "bigint_to_word32_wrap"
+  let truncate_to_word64 env = E.call_import env "rts" "bigint_to_word64_wrap"
+
+  let from_word30 env = E.call_import env "rts" "bigint_of_word32"
+  let from_word32 env = E.call_import env "rts" "bigint_of_word32"
+  let from_word64 env = E.call_import env "rts" "bigint_of_word64"
+  let from_signed_word32 env = E.call_import env "rts" "bigint_of_int32"
+  let from_signed_word64 env = E.call_import env "rts" "bigint_of_int64"
+
+  let compile_data_size_unsigned env = E.call_import env "rts" "bigint_leb128_size"
+  let compile_data_size_signed env = E.call_import env "rts" "bigint_sleb128_size"
+
+  let compile_store_to_data_buf_unsigned env =
+    let (set_buf, get_buf) = new_local env "buf" in
+    let (set_n, get_n) = new_local env "n" in
+    set_n ^^ set_buf ^^
+    get_n ^^ get_buf ^^ E.call_import env "rts" "bigint_leb128_encode" ^^
+    get_n ^^ E.call_import env "rts" "bigint_leb128_size"
+
+  let compile_store_to_stream_unsigned env =
+    E.call_import env "rts" "bigint_leb128_stream_encode"
+
+  let compile_store_to_data_buf_signed env =
+    let (set_buf, get_buf) = new_local env "buf" in
+    let (set_n, get_n) = new_local env "n" in
+    set_n ^^ set_buf ^^
+    get_n ^^ get_buf ^^ E.call_import env "rts" "bigint_sleb128_encode" ^^
+    get_n ^^ E.call_import env "rts" "bigint_sleb128_size"
+
+  let compile_store_to_stream_signed env =
+    E.call_import env "rts" "bigint_sleb128_stream_encode"
+
+  let compile_load_from_data_buf env get_data_buf = function
+    | false -> get_data_buf ^^ E.call_import env "rts" "bigint_leb128_decode"
+    | true -> get_data_buf ^^ E.call_import env "rts" "bigint_sleb128_decode"
+
+  let vanilla_lit env n =
+    (* See enum mp_sign *)
+    let sign = if Big_int.sign_big_int n >= 0 then 0l else 1l in
+
+    let n = Big_int.abs_big_int n in
+
+    let limbs =
+      (* see MP_DIGIT_BIT *)
+      let twoto28 = Big_int.power_int_positive_int 2 28 in
+      let rec go n =
+        if Big_int.sign_big_int n = 0
+        then []
+        else
+          let (a, b) = Big_int.quomod_big_int n twoto28 in
+          [ Big_int.int32_of_big_int b ] @ go a
+      in go n
+    in
+    (* how many 32 bit digits *)
+    let size = Int32.of_int (List.length limbs) in
+
+    (* cf. mp_int in tommath.h *)
+    let ptr = Tagged.shared_static_obj env Tagged.BigInt StaticBytes.[
+      I32 size; (* used *)
+      I32 size; (* size; relying on Heap.word_size == size_of(mp_digit) *)
+      I32 sign;
+      I32 0l; (* dp; this will be patched in BigInt::mp_int_ptr in the RTS when used *)
+      i32s limbs
+
+    ] in
+    ptr
+
+  let assert_nonneg env =
+    Func.share_code1 env "assert_nonneg" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      E.call_import env "rts" "bigint_isneg" ^^
+      E.then_trap_with env "Natural subtraction underflow" ^^
+      get_n
+    )
+
+  let compile_abs env = E.call_import env "rts" "bigint_abs"
+  let compile_neg env = E.call_import env "rts" "bigint_neg"
+  let compile_add env = E.call_import env "rts" "bigint_add"
+  let compile_mul env = E.call_import env "rts" "bigint_mul"
+  let compile_signed_sub env = E.call_import env "rts" "bigint_sub"
+  let compile_signed_div env = E.call_import env "rts" "bigint_div"
+  let compile_signed_mod env = E.call_import env "rts" "bigint_rem"
+  let compile_unsigned_sub env = E.call_import env "rts" "bigint_sub" ^^ assert_nonneg env
+  let compile_unsigned_rem env = E.call_import env "rts" "bigint_rem"
+  let compile_unsigned_div env = E.call_import env "rts" "bigint_div"
+  let compile_unsigned_pow env = E.call_import env "rts" "bigint_pow"
+  let compile_lsh env = E.call_import env "rts" "bigint_lsh"
+  let compile_rsh env = E.call_import env "rts" "bigint_rsh"
+
+  let compile_eq env = E.call_import env "rts" "bigint_eq"
+  let compile_is_negative env = E.call_import env "rts" "bigint_isneg"
+  let compile_relop env = function
+      | Lt -> E.call_import env "rts" "bigint_lt"
+      | Le -> E.call_import env "rts" "bigint_le"
+      | Ge -> E.call_import env "rts" "bigint_ge"
+      | Gt -> E.call_import env "rts" "bigint_gt"
+
+  let fits_signed_bits env bits =
+    E.call_import env "rts" "bigint_2complement_bits" ^^
+    compile_unboxed_const (Int32.of_int bits) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+  let fits_unsigned_bits env bits =
+    E.call_import env "rts" "bigint_count_bits" ^^
+    compile_unboxed_const (Int32.of_int bits) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+
+end (* BigNumLibtommath *)
+
+module BigNum = MakeCompact(BigNumLibtommath)
+
+(* Primitive functions *)
+module Prim = struct
+  (* The {Nat,Int}{8,16} bits sit in the MSBs of the i32, in this manner
+     we can perform almost all operations, with the exception of
+     - Mul (needs shr of one operand)
+     - Shr (needs masking of result)
+     - Rot (needs duplication into LSBs, masking of amount and masking of result)
+     - ctz (needs shr of operand or sub from result)
+
+     Both {Nat,Int}{8,16} fit into the vanilla stackrep, so no boxing is necessary.
+     This MSB-stored schema is also essentially what the interpreter is using.
+  *)
+  let prim_word32toNat = BigNum.from_word32
+  let prim_shiftWordNtoUnsigned env b =
+    compile_shrU_const b ^^
+    prim_word32toNat env
+  let prim_word32toInt = BigNum.from_signed_word32
+  let prim_shiftWordNtoSigned env b =
+    compile_shrS_const b ^^
+    prim_word32toInt env
+  let prim_intToWord32 = BigNum.truncate_to_word32
+  let prim_intToWordNShifted env b =
+    prim_intToWord32 env ^^
+    TaggedSmallWord.shift_leftWordNtoI32 b
+end (* Prim *)
+
+module Object = struct
+ (* An object with a mutable field1 and immutable field 2 has the following
+    heap layout:
+
+    ┌──────┬─────┬──────────┬──────────┬─────────┬─────────────┬───┐
+    │ obj header │ n_fields │ hash_ptr │ ind_ptr │ field2_data │ … │
+    └──────┴─────┴──────────┴┬─────────┴┬────────┴─────────────┴───┘
+         ┌───────────────────┘          │
+         │   ┌──────────────────────────┘
+         │   ↓
+         │  ╶─┬────────┬─────────────┐
+         │    │ ObjInd │ field1_data │
+         ↓    └────────┴─────────────┘
+        ╶─┬─────────────┬─────────────┬───┐
+          │ field1_hash │ field2_hash │ … │
+          └─────────────┴─────────────┴───┘
+
+    The object header includes the object tag (Object) and the forwarding pointer.
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    The field hash array lives in static memory (so no size header needed).
+    The hash_ptr is skewed.
+
+    The field2_data for immutable fields is a vanilla word.
+
+    The field1_data for mutable fields are pointers to either an ObjInd, or a
+    MutBox (they have the same layout). This indirection is a consequence of
+    how we compile object literals with `await` instructions, as these mutable
+    fields need to be able to alias local mutable variables.
+
+    We could alternatively switch to an allocate-first approach in the
+    await-translation of objects, and get rid of this indirection -- if it were
+    not for the implementing of sharing of mutable stable values.
+  *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 2l
+
+  (* Number of object fields *)
+  let size_field env = Int32.add (Tagged.header_size env) 0l
+  let hash_ptr_field env = Int32.add (Tagged.header_size env) 1l
+
+  module FieldEnv = Env.Make(String)
+
+  (* This is for static objects *)
+  let vanilla_lit env (fs : (string * int32) list) : int32 =
+    let (hashes, ptrs) = fs
+      |> List.map (fun (n, ptr) -> (Mo_types.Hash.hash n,ptr))
+      |> List.sort compare
+      |> List.split
+    in
+
+    let hash_ptr = E.add_static env StaticBytes.[ i32s hashes ] in
+
+    Tagged.shared_static_obj env Tagged.Object StaticBytes.[
+      I32 (Int32.of_int (List.length fs));
+      I32 hash_ptr;
+      i32s ptrs;
+    ]
+
+  (* This is for non-recursive objects, i.e. ObjNewE *)
+  (* The instructions in the field already create the indirection if needed *)
+  let lit_raw env (fs : (string * (unit -> G.t)) list ) =
+    let name_pos_map =
+      fs |>
+      (* We could store only public fields in the object, but
+         then we need to allocate separate boxes for the non-public ones:
+         List.filter (fun (_, vis, f) -> vis.it = Public) |>
+      *)
+      List.map (fun (n,_) -> (E.hash env n, n)) |>
+      List.sort compare |>
+      List.mapi (fun i (_h,n) -> (n,Int32.of_int i)) |>
+      List.fold_left (fun m (n,i) -> FieldEnv.add n i m) FieldEnv.empty in
+
+    let sz = Int32.of_int (FieldEnv.cardinal name_pos_map) in
+
+    (* Create hash array *)
+    let hashes = fs |>
+      List.map (fun (n,_) -> E.hash env n) |>
+      List.sort compare in
+    let hash_ptr = E.add_static env StaticBytes.[ i32s hashes ] in
+
+    (* Allocate memory *)
+    let (set_ri, get_ri, ri) = new_local_ env I32Type "obj" in
+    Tagged.alloc env (Int32.add (header_size env) sz) Tagged.Object ^^
+    set_ri ^^
+
+    (* Set size *)
+    get_ri ^^
+    compile_unboxed_const sz ^^
+    Tagged.store_field env (size_field env) ^^
+
+    (* Set hash_ptr *)
+    get_ri ^^
+    compile_unboxed_const hash_ptr ^^
+    Tagged.store_field env (hash_ptr_field env) ^^
+
+    (* Write all the fields *)
+    let init_field (name, mk_is) : G.t =
+      (* Write the pointer to the indirection *)
+      get_ri ^^
+      mk_is () ^^
+      let i = FieldEnv.find name name_pos_map in
+      let offset = Int32.add (header_size env) i in
+      Tagged.store_field env offset
+    in
+    G.concat_map init_field fs ^^
+
+    (* Return the pointer to the object *)
+    get_ri ^^
+    Tagged.allocation_barrier env
+
+  (* Returns a pointer to the object field (without following the field indirection) *)
+  let idx_hash_raw env low_bound =
+    let name = Printf.sprintf "obj_idx<%d>" low_bound  in
+    Func.share_code2 env name (("x", I32Type), ("hash", I32Type)) [I32Type] (fun env get_x get_hash ->
+      let set_x = G.setter_for get_x in
+      let set_h_ptr, get_h_ptr = new_local env "h_ptr" in
+
+      get_x ^^ Tagged.load_forwarding_pointer env ^^ set_x ^^
+
+      get_x ^^ Tagged.load_field env (hash_ptr_field env) ^^
+
+      (* Linearly scan through the fields (binary search can come later) *)
+      (* unskew h_ptr and advance both to low bound *)
+      compile_add_const Int32.(add ptr_unskew (mul Heap.word_size (of_int low_bound))) ^^
+      set_h_ptr ^^
+      get_x ^^
+      compile_add_const Int32.(mul Heap.word_size (add (header_size env) (of_int low_bound))) ^^
+      set_x ^^
+      G.loop0 (
+          get_h_ptr ^^ load_unskewed_ptr ^^
+          get_hash ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0
+            (get_x ^^ G.i Return)
+            (get_h_ptr ^^ compile_add_const Heap.word_size ^^ set_h_ptr ^^
+             get_x ^^ compile_add_const Heap.word_size ^^ set_x ^^
+             G.i (Br (nr 1l)))
+        ) ^^
+      G.i Unreachable
+    )
+
+  (* Returns a pointer to the object field (possibly following the indirection) *)
+  let idx_hash env low_bound indirect =
+    if indirect
+    then
+      let name = Printf.sprintf "obj_idx_ind<%d>" low_bound in
+      Func.share_code2 env name (("x", I32Type), ("hash", I32Type)) [I32Type] (fun env get_x get_hash ->
+      get_x ^^ get_hash ^^
+      idx_hash_raw env low_bound ^^
+      load_ptr ^^ Tagged.load_forwarding_pointer env ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size)
+    )
+    else idx_hash_raw env low_bound
+
+  let field_type env obj_type s =
+    let _, fields = Type.as_obj_sub [s] obj_type in
+    Type.lookup_val_field s fields
+
+  (* Determines whether the field is mutable (and thus needs an indirection) *)
+  let is_mut_field env obj_type s =
+    let _, fields = Type.as_obj_sub [s] obj_type in
+    Type.is_mut (Type.lookup_val_field s fields)
+
+  (* Computes a lower bound for the positional index of a field in an object *)
+  let field_lower_bound env obj_type s =
+    let open Type in
+    let _, fields = as_obj_sub [s] obj_type in
+    List.iter (function {typ = Typ _; _} -> assert false | _ -> ()) fields;
+    let sorted_by_hash =
+      List.sort
+        (fun (h1, _) (h2, _) -> Lib.Uint32.compare h1 h2)
+        (List.map (fun f -> Lib.Uint32.of_int32 (E.hash env f.lab), f) fields) in
+    match Lib.List.index_of s (List.map (fun (_, {lab; _}) -> lab) sorted_by_hash) with
+    | Some i -> i
+    | _ -> assert false
+
+  (* Returns a pointer to the object field (without following the indirection) *)
+  let idx_raw env f =
+    compile_unboxed_const (E.hash env f) ^^
+    idx_hash_raw env 0
+
+  (* Returns a pointer to the object field (possibly following the indirection) *)
+  let idx env obj_type f =
+    compile_unboxed_const (E.hash env f) ^^
+    idx_hash env (field_lower_bound env obj_type f) (is_mut_field env obj_type f)
+
+  (* load the value (or the mutbox) *)
+  let load_idx_raw env f =
+    idx_raw env f ^^
+    load_ptr
+
+  (* load the actual value (dereferencing the mutbox) *)
+  let load_idx env obj_type f =
+    idx env obj_type f ^^
+    load_ptr
+
+end (* Object *)
+
+module Blob = struct
+  (* The layout of a blob object is
+
+     ┌──────┬─────┬─────────┬──────────────────┐
+     │ obj header │ n_bytes │ bytes (padded) … │
+     └──────┴─────┴─────────┴──────────────────┘
+
+    The object header includes the object tag (Blob) and the forwarding pointer.
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    This heap object is used for various kinds of binary, non-pointer data.
+
+    When used for Text values, the bytes are UTF-8 encoded code points from
+    Unicode.
+  *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 1l
+  let len_field env = Int32.add (Tagged.header_size env) 0l
+
+  let len env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (len_field env)
+
+  let len_nat env =
+    Func.share_code1 env "blob_len" ("text", I32Type) [I32Type] (fun env get ->
+      get ^^
+      len env ^^
+      BigNum.from_word32 env
+    )
+
+  let vanilla_lit env s =
+    Tagged.shared_static_obj env Tagged.Blob StaticBytes.[
+      I32 (Int32.of_int (String.length s));
+      Bytes s;
+    ]
+
+  let lit env s = compile_unboxed_const (vanilla_lit env s)
+
+  let lit_ptr_len env s =
+    compile_unboxed_const (Int32.add ptr_unskew (E.add_static env StaticBytes.[Bytes s])) ^^
+    compile_unboxed_const (Int32.of_int (String.length s))
+
+  let alloc env =
+    E.call_import env "rts" "alloc_blob" ^^
+    (* uninitialized blob payload is allowed by the barrier *)
+    Tagged.allocation_barrier env
+
+  let unskewed_payload_offset env = Int32.(add ptr_unskew (mul Heap.word_size (header_size env)))
+  
+  let payload_ptr_unskewed env =
+    Tagged.load_forwarding_pointer env ^^
+    compile_add_const (unskewed_payload_offset env)
+
+  let as_ptr_len env = Func.share_code1 env "as_ptr_size" ("x", I32Type) [I32Type; I32Type] (
+    fun env get_x ->
+      get_x ^^ payload_ptr_unskewed env ^^
+      get_x ^^ len env
+    )
+
+  let of_ptr_size env = Func.share_code2 env "blob_of_ptr_size" (("ptr", I32Type), ("size" , I32Type)) [I32Type] (
+    fun env get_ptr get_size ->
+      let (set_x, get_x) = new_local env "x" in
+      get_size ^^ alloc env ^^ set_x ^^
+      get_x ^^ payload_ptr_unskewed env ^^
+      get_ptr ^^
+      get_size ^^
+      Heap.memcpy env ^^
+      get_x
+    )
+
+  let of_size_copy env get_size_fun copy_fun offset_fun =
+    let (set_len, get_len) = new_local env "len" in
+    let (set_blob, get_blob) = new_local env "blob" in
+    get_size_fun env ^^ set_len ^^
+
+    get_len ^^ alloc env ^^ set_blob ^^
+    get_blob ^^ payload_ptr_unskewed env ^^
+    offset_fun env ^^
+    get_len ^^
+    copy_fun env ^^
+
+    get_blob
+
+  (* Lexicographic blob comparison. Expects two blobs on the stack.
+     Either specialized to a specific comparison operator, and returns a boolean,
+     or implements the generic comparison, returning -1, 0 or 1 as Int8.
+  *)
+  let rec compare env op =
+    (* return convention for the generic comparison function *)
+    let is_lt = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 (-1)) in
+    let is_gt = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 1) in
+    let is_eq = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 0) in
+    let open Operator in
+    let name = match op with
+        | Some LtOp -> "Blob.compare_lt"
+        | Some LeOp -> "Blob.compare_le"
+        | Some GeOp -> "Blob.compare_ge"
+        | Some GtOp -> "Blob.compare_gt"
+        | Some EqOp -> "Blob.compare_eq"
+        | Some NeqOp -> "Blob.compare_neq"
+        | None -> "Blob.compare" in
+    Func.share_code2 env name (("x", I32Type), ("y", I32Type)) [I32Type] (fun env get_x get_y ->
+      match op with
+        (* Some operators can be reduced to the negation of other operators *)
+        | Some LtOp -> get_x ^^ get_y ^^ compare env (Some GeOp) ^^ Bool.neg
+        | Some GtOp -> get_x ^^ get_y ^^ compare env (Some LeOp) ^^ Bool.neg
+        | Some NeqOp -> get_x ^^ get_y ^^ compare env (Some EqOp) ^^ Bool.neg
+        | _ ->
+      begin
+        let set_x = G.setter_for get_x in
+        let set_y = G.setter_for get_y in
+        get_x ^^ Tagged.load_forwarding_pointer env ^^ set_x ^^
+        get_y ^^ Tagged.load_forwarding_pointer env ^^ set_y ^^
+
+        let (set_len1, get_len1) = new_local env "len1" in
+        let (set_len2, get_len2) = new_local env "len2" in
+        let (set_len, get_len) = new_local env "len" in
+        let (set_a, get_a) = new_local env "a" in
+        let (set_b, get_b) = new_local env "b" in
+
+        get_x ^^ len env ^^ set_len1 ^^
+        get_y ^^ len env ^^ set_len2 ^^
+
+        (* Find minimum length *)
+        begin if op = Some EqOp then
+          (* Early exit for equality *)
+          get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0 G.nop (Bool.lit false ^^ G.i Return) ^^
+
+          get_len1 ^^ set_len
+        else
+          get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+          G.if0
+            (get_len1 ^^ set_len)
+            (get_len2 ^^ set_len)
+        end ^^
+
+        (* We could do word-wise comparisons if we know that the trailing bytes
+           are zeroed *)
+        get_len ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^
+          payload_ptr_unskewed env ^^
+          get_i ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+          set_a ^^
+
+          get_y ^^
+          payload_ptr_unskewed env ^^
+          get_i ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+          set_b ^^
+
+          get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0 G.nop (
+            (* first non-equal elements *)
+            begin match op with
+            | Some LeOp -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+            | Some GeOp -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeU))
+            | Some EqOp -> Bool.lit false
+            | None -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+                      G.if1 I32Type is_lt is_gt
+            | _ -> assert false
+            end ^^
+            G.i Return
+          )
+        ) ^^
+        (* Common prefix is same *)
+        match op with
+        | Some LeOp -> get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+        | Some GeOp -> get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeU))
+        | Some EqOp -> Bool.lit true (* NB: Different length handled above *)
+        | None ->
+            get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+            G.if1 I32Type is_lt (
+              get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+              G.if1 I32Type is_gt is_eq
+            )
+        | _ -> assert false
+      end
+  )
+
+  let iter env =
+    E.call_import env "rts" "blob_iter"
+  let iter_done env =
+    E.call_import env "rts" "blob_iter_done"
+  let iter_next env =
+    E.call_import env "rts" "blob_iter_next" ^^
+    TaggedSmallWord.msb_adjust Type.Nat8
+
+  let dyn_alloc_scratch env = alloc env ^^ payload_ptr_unskewed env
+
+  (* TODO: rewrite using MemoryFill *)
+  let clear env =
+    Func.share_code1 env "blob_clear" ("x", I32Type) [] (fun env get_x ->
+      let (set_ptr, get_ptr) = new_local env "ptr" in
+      let (set_len, get_len) = new_local env "len" in
+      get_x ^^
+      as_ptr_len env ^^
+      set_len ^^
+      set_ptr ^^
+
+      (* round to word size *)
+      get_len ^^
+      compile_add_const (Int32.sub Heap.word_size 1l) ^^
+      compile_divU_const Heap.word_size ^^
+
+      (* clear all words *)
+      from_0_to_n env (fun get_i ->
+        get_ptr ^^
+        compile_unboxed_const 0l ^^
+        store_unskewed_ptr ^^
+        get_ptr ^^
+        compile_add_const Heap.word_size ^^
+        set_ptr))
+
+end (* Blob *)
+
+module Text = struct
+  (*
+  Most of the heavy lifting around text values is in rts/motoko-rts/src/text.rs
+  *)
+
+  (* The layout of a concatenation node is
+
+     ┌──────┬─────┬─────────┬───────┬───────┐
+     │ obj header │ n_bytes │ text1 │ text2 │
+     └──────┴─────┴─────────┴───────┴───────┘
+
+    The object header includes the object tag (TAG_CONCAT defined in rts/types.rs) and the forwarding pointer
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    This is internal to rts/text.c, with the exception of GC-related code.
+  *)
+
+  let of_ptr_size env =
+    E.call_import env "rts" "text_of_ptr_size"
+  let concat env =
+    E.call_import env "rts" "text_concat"
+  let size env =
+    E.call_import env "rts" "text_size"
+  let to_buf env =
+    E.call_import env "rts" "text_to_buf"
+  let len_nat env =
+    Func.share_code1 env "text_len" ("text", I32Type) [I32Type] (fun env get ->
+      get ^^
+      E.call_import env "rts" "text_len" ^^
+      BigNum.from_word32 env
+    )
+  let prim_showChar env =
+    TaggedSmallWord.untag_codepoint ^^
+    E.call_import env "rts" "text_singleton"
+  let to_blob env = E.call_import env "rts" "blob_of_text"
+
+  let of_blob env =
+    let (set_blob, get_blob) = new_local env "blob" in
+    set_blob ^^
+    get_blob ^^ Blob.as_ptr_len env ^^
+    E.call_import env "rts" "utf8_valid" ^^
+    G.if1 I32Type (Opt.inject_simple env get_blob) (Opt.null_lit env)
+
+
+  let iter env =
+    E.call_import env "rts" "text_iter"
+  let iter_done env =
+    E.call_import env "rts" "text_iter_done"
+  let iter_next env =
+    E.call_import env "rts" "text_iter_next" ^^
+    TaggedSmallWord.tag_codepoint
+
+  let compare env op =
+    let open Operator in
+    let name = match op with
+        | LtOp -> "Text.compare_lt"
+        | LeOp -> "Text.compare_le"
+        | GeOp -> "Text.compare_ge"
+        | GtOp -> "Text.compare_gt"
+        | EqOp -> "Text.compare_eq"
+        | NeqOp -> assert false in
+    Func.share_code2 env name (("x", I32Type), ("y", I32Type)) [I32Type] (fun env get_x get_y ->
+      get_x ^^ Tagged.load_forwarding_pointer env ^^
+      get_y ^^ Tagged.load_forwarding_pointer env ^^
+      E.call_import env "rts" "text_compare" ^^
+      compile_unboxed_const 0l ^^
+      match op with
+        | LtOp -> G.i (Compare (Wasm.Values.I32 I32Op.LtS))
+        | LeOp -> G.i (Compare (Wasm.Values.I32 I32Op.LeS))
+        | GtOp -> G.i (Compare (Wasm.Values.I32 I32Op.GtS))
+        | GeOp -> G.i (Compare (Wasm.Values.I32 I32Op.GeS))
+        | EqOp -> G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+        | NeqOp -> assert false
+    )
+
+
+end (* Text *)
+
+module Arr = struct
+  (* Object layout:
+
+     ┌──────┬─────┬──────────┬────────┬───┐
+     │ obj header │ n_fields │ field1 │ … │
+     └──────┴─────┴──────────┴────────┴───┘
+
+     The object  header includes the object tag (Array) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+     No difference between mutable and immutable arrays.
+  *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 1l
+  let element_size = 4l
+  let len_field env = Int32.add (Tagged.header_size env) 0l
+
+  let len env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (len_field env)
+
+  (* Static array access. No checking *)
+  let load_field env n =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env Int32.(add n (header_size env))
+
+  (* Dynamic array access. Returns the address (not the value) of the field.
+     Does no bounds checking *)
+  let unsafe_idx env =
+    Func.share_code2 env "Array.unsafe_idx" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      get_idx ^^
+      compile_add_const (header_size env) ^^
+      compile_mul_const element_size ^^
+      get_array ^^
+      Tagged.load_forwarding_pointer env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+    )
+
+  (* Dynamic array access. Returns the address (not the value) of the field.
+     Does bounds checking *)
+  let idx env =
+    Func.share_code2 env "Array.idx" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      (* No need to check the lower bound, we interpret idx as unsigned *)
+      (* Check the upper bound *)
+      get_idx ^^
+      get_array ^^ len env ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      E.else_trap_with env "Array index out of bounds" ^^
+
+      get_idx ^^
+      compile_add_const (header_size env) ^^
+      compile_mul_const element_size ^^
+      get_array ^^
+      Tagged.load_forwarding_pointer env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+    )
+
+  (* As above, but taking a bigint (Nat), and reporting overflow as out of bounds *)
+  let idx_bigint env =
+    Func.share_code2 env "Array.idx_bigint" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      get_array ^^
+      get_idx ^^
+      Blob.lit env "Array index out of bounds" ^^
+      BigNum.to_word32_with env ^^
+      idx env
+  )
+
+  let element_type env typ = match Type.promote typ with
+     | Type.Array element_type -> element_type
+     | _ -> assert false
+
+  let vanilla_lit env ptrs =
+    Tagged.shared_static_obj env Tagged.Array StaticBytes.[
+      I32 (Int32.of_int (List.length ptrs));
+      i32s ptrs;
+    ]
+
+  (* Compile an array literal. *)
+  let lit env element_instructions =
+    Tagged.obj env Tagged.Array
+     ([ compile_unboxed_const (Wasm.I32.of_int_u (List.length element_instructions))
+      ] @ element_instructions)
+
+  (* Does not initialize the fields! *)
+  (* Note: Post allocation barrier must be applied after initialization *)
+  let alloc env =
+    E.call_import env "rts" "alloc_array"
+
+  let iterate env get_array body =
+    let (set_boundary, get_boundary) = new_local env "boundary" in
+    let (set_pointer, get_pointer) = new_local env "pointer" in
+    let set_array = G.setter_for get_array in
+
+    get_array ^^ Tagged.load_forwarding_pointer env ^^ set_array ^^
+
+    (* Initial element pointer, skewed *)
+    compile_unboxed_const (header_size env) ^^
+    compile_mul_const element_size ^^
+    get_array ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_pointer ^^
+
+    (* Upper pointer boundary, skewed *)
+    get_array ^^
+    Tagged.load_field env (len_field env) ^^
+    compile_mul_const element_size ^^
+    get_pointer ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_boundary ^^
+
+    (* Loop through all elements *)
+    compile_while env
+    ( get_pointer ^^
+      get_boundary ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+    ) (
+      body get_pointer ^^
+
+      (* Next element pointer, skewed *)
+      get_pointer ^^
+      compile_add_const element_size ^^
+      set_pointer
+    )
+
+  (* The primitive operations *)
+  (* No need to wrap them in RTS functions: They occur only once, in the prelude. *)
+  let init env =
+    let (set_x, get_x) = new_local env "x" in
+    let (set_r, get_r) = new_local env "r" in
+    set_x ^^
+
+    (* Allocate *)
+    BigNum.to_word32 env ^^
+    alloc env ^^
+    set_r ^^
+
+    (* Write elements *)
+    iterate env get_r (fun get_pointer ->
+      get_pointer ^^
+      get_x ^^
+      store_ptr
+    ) ^^
+
+    get_r ^^
+    Tagged.allocation_barrier env
+
+  let tabulate env =
+    let (set_f, get_f) = new_local env "f" in
+    let (set_r, get_r) = new_local env "r" in
+    let (set_i, get_i) = new_local env "i" in
+    set_f ^^
+
+    (* Allocate *)
+    BigNum.to_word32 env ^^
+    alloc env ^^
+    set_r ^^
+
+    (* Initial index *)
+    compile_unboxed_const 0l ^^
+    set_i ^^
+
+    (* Write elements *)
+    iterate env get_r (fun get_pointer ->
+      get_pointer ^^
+      (* The closure *)
+      get_f ^^
+      Closure.prepare_closure_call env ^^
+      (* The arg *)
+      get_i ^^
+      BigNum.from_word32 env ^^
+      (* The closure again *)
+      get_f ^^
+      (* Call *)
+      Closure.call_closure env 1 1 ^^
+      store_ptr ^^
+
+      (* Increment index *)
+      get_i ^^
+      compile_add_const 1l ^^
+      set_i
+    ) ^^
+    get_r ^^
+    Tagged.allocation_barrier env
+
+  let ofBlob env =
+    Func.share_code1 env "Arr.ofBlob" ("blob", I32Type) [I32Type] (fun env get_blob ->
+      let (set_len, get_len) = new_local env "len" in
+      let (set_r, get_r) = new_local env "r" in
+
+      get_blob ^^ Blob.len env ^^ set_len ^^
+
+      get_len ^^ alloc env ^^ set_r ^^
+
+      get_len ^^ from_0_to_n env (fun get_i ->
+        get_r ^^ get_i ^^ unsafe_idx env ^^
+        get_blob ^^ Blob.payload_ptr_unskewed env ^^
+        get_i ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+        G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+        TaggedSmallWord.msb_adjust Type.Nat8 ^^
+        store_ptr
+      ) ^^
+      get_r ^^
+      Tagged.allocation_barrier env
+    )
+
+  let toBlob env =
+    Func.share_code1 env "Arr.toBlob" ("array", I32Type) [I32Type] (fun env get_a ->
+      let (set_len, get_len) = new_local env "len" in
+      let (set_r, get_r) = new_local env "r" in
+
+      get_a ^^ len env ^^ set_len ^^
+
+      get_len ^^ Blob.alloc env ^^ set_r ^^
+
+      get_len ^^ from_0_to_n env (fun get_i ->
+        get_r ^^ Blob.payload_ptr_unskewed env ^^
+        get_i ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+        get_a ^^ get_i ^^ unsafe_idx env ^^
+        load_ptr ^^
+        TaggedSmallWord.lsb_adjust Type.Nat8 ^^
+        G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack8})
+      ) ^^
+
+      get_r
+    )
+
+end (* Array *)
+
+module Tuple = struct
+  (* Tuples use the same object representation (and same tag) as arrays.
+     Even though we know the size statically, we still need the size
+     information for the GC.
+
+     One could introduce tags for small tuples, to save one word.
+  *)
+
+  (* We represent the boxed empty tuple as the unboxed scalar 0, i.e. simply as
+     number (but really anything is fine, we never look at this) *)
+  let unit_vanilla_lit = 0l
+  let compile_unit = compile_unboxed_const unit_vanilla_lit
+
+  (* Expects on the stack the pointer to the array. *)
+  let load_n env n =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (Int32.add (Arr.header_size env) n)
+
+  (* Takes n elements of the stack and produces an argument tuple *)
+  let from_stack env n =
+    if n = 0 then compile_unit
+    else
+      let name = Printf.sprintf "to_%i_tuple" n in
+      let args = Lib.List.table n (fun i -> Printf.sprintf "arg%i" i, I32Type) in
+      Func.share_code env name args [I32Type] (fun env ->
+        Arr.lit env (Lib.List.table n (fun i -> G.i (LocalGet (nr (Int32.of_int i)))))
+      )
+
+  (* Takes an argument tuple and puts the elements on the stack: *)
+  let to_stack env n =
+    if n = 0 then G.i Drop else
+    begin
+      let name = Printf.sprintf "from_%i_tuple" n in
+      let retty = Lib.List.make n I32Type in
+      Func.share_code1 env name ("tup", I32Type) retty (fun env get_tup ->
+        G.table n (fun i -> get_tup ^^ load_n env (Int32.of_int i))
+      )
+    end
+
+end (* Tuple *)
+
+module Lifecycle = struct
+  (*
+  This module models the life cycle of a canister as a very simple state machine,
+  keeps track of the current state of the canister, and traps noisily if an
+  unexpected transition happens. Such a transition would either be a bug in the
+  underlying system, or in our RTS.
+  *)
+
+  type state =
+    | PreInit
+  (* We do not use the (start) function when compiling canisters, so skip
+     these two:
+    | InStart
+    | Started (* (start) has run *)
+  *)
+    | InInit (* canister_init *)
+    | Idle (* basic steady state *)
+    | InUpdate
+    | InQuery
+    | PostQuery (* an invalid state *)
+    | InPreUpgrade
+    | PostPreUpgrade (* an invalid state *)
+    | InPostUpgrade
+    | InComposite
+
+  let string_of_state state = match state with
+    | PreInit -> "PreInit"
+    | InInit -> "InInit"
+    | Idle -> "Idle"
+    | InUpdate -> "InUpdate"
+    | InQuery -> "InQuery"
+    | PostQuery -> "PostQuery"
+    | InPreUpgrade -> "InPreUpgrade"
+    | PostPreUpgrade -> "PostPreUpgrade"
+    | InPostUpgrade -> "InPostUpgrade"
+    | InComposite -> "InComposite"
+
+  let int_of_state = function
+    | PreInit -> 0l (* Automatically null *)
+    (*
+    | InStart -> 1l
+    | Started -> 2l
+    *)
+    | InInit -> 3l
+    | Idle -> 4l
+    | InUpdate -> 5l
+    | InQuery -> 6l
+    | PostQuery -> 7l
+    | InPreUpgrade -> 8l
+    | PostPreUpgrade -> 9l
+    | InPostUpgrade -> 10l
+    | InComposite -> 11l
+
+  let ptr () = Stack.end_ ()
+  let end_ () = Int32.add (Stack.end_ ()) Heap.word_size
+
+  (* Which states may come before this *)
+  let pre_states = function
+    | PreInit -> []
+    (*
+    | InStart -> [PreInit]
+    | Started -> [InStart]
+    *)
+    | InInit -> [PreInit]
+    | Idle -> [InInit; InUpdate; InPostUpgrade; InComposite]
+    | InUpdate -> [Idle]
+    | InQuery -> [Idle]
+    | PostQuery -> [InQuery]
+    | InPreUpgrade -> [Idle]
+    | PostPreUpgrade -> [InPreUpgrade]
+    | InPostUpgrade -> [InInit]
+    | InComposite -> [Idle]
+
+  let get env =
+    compile_unboxed_const (ptr ()) ^^
+    load_unskewed_ptr
+
+  let set env new_state =
+    compile_unboxed_const (ptr ()) ^^
+    compile_unboxed_const (int_of_state new_state) ^^
+    store_unskewed_ptr
+
+  let trans env new_state =
+    let name = "trans_state" ^ Int32.to_string (int_of_state new_state) in
+    Func.share_code0 env name [] (fun env ->
+      G.block0 (
+        let rec go = function
+        | [] -> E.trap_with env
+          ("internal error: unexpected state entering " ^ string_of_state new_state)
+        | (s::ss) ->
+          get env ^^ compile_eq_const (int_of_state s) ^^
+          G.if0 (G.i (Br (nr 1l))) G.nop ^^
+          go ss
+        in go (pre_states new_state)
+        ) ^^
+      set env new_state
+    )
+
+end (* Lifecycle *)
+
+
+module IC = struct
+
+  (* IC-specific stuff: System imports, databufs etc. *)
+
+  let register_globals env =
+    (* result of last ic0.call_perform  *)
+    E.add_global32 env "__call_perform_status" Mutable 0l;
+    E.add_global32 env "__call_perform_message" Mutable 0l
+    (* NB: __call_perform_message is not a root so text contents *must* be static *)
+
+  let get_call_perform_status env =
+    G.i (GlobalGet (nr (E.get_global env "__call_perform_status")))
+  let set_call_perform_status env =
+    G.i (GlobalSet (nr (E.get_global env "__call_perform_status")))
+  let get_call_perform_message env =
+    G.i (GlobalGet (nr (E.get_global env "__call_perform_message")))
+  let set_call_perform_message env =
+    G.i (GlobalSet (nr (E.get_global env "__call_perform_message")))
+
+  let init_globals env =
+    Blob.lit env "" ^^
+    set_call_perform_message env
+
+  let i32s n = Lib.List.make n I32Type
+  let i64s n = Lib.List.make n I64Type
+
+  let import_ic0 env =
+      E.add_func_import env "ic0" "accept_message" [] [];
+      E.add_func_import env "ic0" "call_data_append" (i32s 2) [];
+      E.add_func_import env "ic0" "call_cycles_add128" (i64s 2) [];
+      E.add_func_import env "ic0" "call_new" (i32s 8) [];
+      E.add_func_import env "ic0" "call_perform" [] [I32Type];
+      E.add_func_import env "ic0" "call_on_cleanup" (i32s 2) [];
+      E.add_func_import env "ic0" "canister_cycle_balance128" [I32Type] [];
+      E.add_func_import env "ic0" "canister_self_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "canister_self_size" [] [I32Type];
+      E.add_func_import env "ic0" "canister_status" [] [I32Type];
+      E.add_func_import env "ic0" "canister_version" [] [I64Type];
+      E.add_func_import env "ic0" "is_controller" (i32s 2) [I32Type];
+      E.add_func_import env "ic0" "debug_print" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_arg_data_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_arg_data_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_caller_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_caller_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_cycles_available128" [I32Type] [];
+      E.add_func_import env "ic0" "msg_cycles_refunded128" [I32Type] [];
+      E.add_func_import env "ic0" "msg_cycles_accept128" [I64Type; I64Type; I32Type] [];
+      E.add_func_import env "ic0" "certified_data_set" (i32s 2) [];
+      E.add_func_import env "ic0" "data_certificate_present" [] [I32Type];
+      E.add_func_import env "ic0" "data_certificate_size" [] [I32Type];
+      E.add_func_import env "ic0" "data_certificate_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_method_name_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_method_name_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_reject_code" [] [I32Type];
+      E.add_func_import env "ic0" "msg_reject_msg_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_reject_msg_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_reject" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_reply_data_append" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_reply" [] [];
+      E.add_func_import env "ic0" "performance_counter" [I32Type] [I64Type];
+      E.add_func_import env "ic0" "trap" (i32s 2) [];
+      E.add_func_import env "ic0" "stable64_write" (i64s 3) [];
+      E.add_func_import env "ic0" "stable64_read" (i64s 3) [];
+      E.add_func_import env "ic0" "stable64_size" [] [I64Type];
+      E.add_func_import env "ic0" "stable64_grow" [I64Type] [I64Type];
+      E.add_func_import env "ic0" "time" [] [I64Type];
+      if !Flags.global_timer then
+        E.add_func_import env "ic0" "global_timer_set" [I64Type] [I64Type];
+      ()
+
+  let system_imports env =
+    match E.mode env with
+    | Flags.ICMode ->
+      import_ic0 env
+    | Flags.RefMode  ->
+      import_ic0 env
+    | Flags.WASIMode ->
+      E.add_func_import env "wasi_unstable" "fd_write" [I32Type; I32Type; I32Type; I32Type] [I32Type];
+    | Flags.WasmMode -> ()
+
+  let system_call env funcname = E.call_import env "ic0" funcname
+
+  let register env =
+
+      Func.define_built_in env "print_ptr" [("ptr", I32Type); ("len", I32Type)] [] (fun env ->
+        match E.mode env with
+        | Flags.WasmMode -> G.i Nop
+        | Flags.ICMode | Flags.RefMode ->
+            G.i (LocalGet (nr 0l)) ^^
+            G.i (LocalGet (nr 1l)) ^^
+            system_call env "debug_print"
+        | Flags.WASIMode -> begin
+          let get_ptr = G.i (LocalGet (nr 0l)) in
+          let get_len = G.i (LocalGet (nr 1l)) in
+
+          Stack.with_words env "io_vec" 6l (fun get_iovec_ptr ->
+            (* We use the iovec functionality to append a newline *)
+            get_iovec_ptr ^^
+            get_ptr ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            get_len ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 4l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            get_iovec_ptr ^^ compile_add_const 16l ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 8l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            compile_unboxed_const 1l ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 12l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            compile_unboxed_const (Int32.of_int (Char.code '\n')) ^^
+            G.i (Store {ty = I32Type; align = 0; offset = 16l; sz = Some Wasm.Types.Pack8}) ^^
+
+            (* Call fd_write twice to work around
+               https://github.com/bytecodealliance/wasmtime/issues/629
+            *)
+
+            compile_unboxed_const 1l (* stdout *) ^^
+            get_iovec_ptr ^^
+            compile_unboxed_const 1l (* one string segment (2 doesn't work) *) ^^
+            get_iovec_ptr ^^ compile_add_const 20l ^^ (* out for bytes written, we ignore that *)
+            E.call_import env "wasi_unstable" "fd_write" ^^
+            G.i Drop ^^
+
+            compile_unboxed_const 1l (* stdout *) ^^
+            get_iovec_ptr ^^ compile_add_const 8l ^^
+            compile_unboxed_const 1l (* one string segment *) ^^
+            get_iovec_ptr ^^ compile_add_const 20l ^^ (* out for bytes written, we ignore that *)
+            E.call_import env "wasi_unstable" "fd_write" ^^
+            G.i Drop)
+          end);
+
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "print_ptr";
+        edesc = nr (FuncExport (nr (E.built_in env "print_ptr")))
+      })
+
+
+  let ic_system_call call env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode) ->
+      system_call env call
+    | _ ->
+      E.trap_with env Printf.(sprintf "cannot get %s when running locally" call)
+
+  let performance_counter = ic_system_call "performance_counter"
+  let is_controller = ic_system_call "is_controller"
+  let canister_version = ic_system_call "canister_version"
+
+  let print_ptr_len env = G.i (Call (nr (E.built_in env "print_ptr")))
+
+  let print_text env =
+    Func.share_code1 env "print_text" ("str", I32Type) [] (fun env get_str ->
+      let (set_blob, get_blob) = new_local env "blob" in
+      get_str ^^ Text.to_blob env ^^ set_blob ^^
+      get_blob ^^ Blob.payload_ptr_unskewed env ^^
+      get_blob ^^ Blob.len env ^^
+      print_ptr_len env
+    )
+
+  (* For debugging *)
+  let _compile_static_print env s =
+    Blob.lit_ptr_len env s ^^ print_ptr_len env
+
+  let ic_trap env = system_call env "trap"
+
+  let trap_ptr_len env =
+    match E.mode env with
+    | Flags.WasmMode -> G.i Unreachable
+    | Flags.WASIMode -> print_ptr_len env ^^ G.i Unreachable
+    | Flags.ICMode | Flags.RefMode -> ic_trap env ^^ G.i Unreachable
+
+  let trap_with env s =
+    Blob.lit_ptr_len env s ^^ trap_ptr_len env
+
+  let trap_text env  =
+    Text.to_blob env ^^ Blob.as_ptr_len env ^^ trap_ptr_len env
+
+  let default_exports env =
+    (* these exports seem to be wanted by the hypervisor/v8 *)
+    E.add_export env (nr {
+      name = Lib.Utf8.decode (
+        match E.mode env with
+        | Flags.WASIMode -> "memory"
+        | _  -> "mem"
+      );
+      edesc = nr (MemoryExport (nr 0l))
+    });
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "table";
+      edesc = nr (TableExport (nr 0l))
+    })
+
+  let export_init env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let empty_f = Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      GC.collect_garbage env ^^
+
+      Lifecycle.trans env Lifecycle.Idle
+    ) in
+    let fi = E.add_fun env "canister_init" empty_f in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_init";
+      edesc = nr (FuncExport (nr fi))
+      })
+
+  let export_heartbeat env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_heartbeat"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "heartbeat_exp"))) ^^
+        (* TODO(3622)
+           Until DTS is implemented for heartbeats, don't collect garbage here,
+           just record mutator_instructions and leave GC scheduling to the
+           already scheduled async message running `system` function `heartbeat` *)
+        GC.record_mutator_instructions env (* future: GC.collect_garbage env *)))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_heartbeat";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_timer env =
+    assert !Flags.global_timer;
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_global_timer"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "timer_exp"))) ^^
+        (* TODO(3622)
+           Until DTS is implemented for timers, don't collect garbage here,
+           just record mutator_instructions and leave GC scheduling to the
+           already scheduled async message running `system` function `timer` *)
+        GC.record_mutator_instructions env (* future: GC.collect_garbage env *)))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_global_timer";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_inspect env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_inspect_message"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "inspect_exp"))) ^^
+        system_call env "accept_message" (* assumes inspect_exp traps to reject *)
+        (* no need to GC !*)))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_inspect_message";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_wasi_start env =
+    assert (E.mode env = Flags.WASIMode);
+    let fi = E.add_fun env "_start" (Func.of_body env [] [] (fun env1 ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      Lifecycle.trans env Lifecycle.Idle
+    )) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "_start";
+      edesc = nr (FuncExport (nr fi))
+      })
+
+  let export_upgrade_methods env =
+    if E.mode env = Flags.ICMode || E.mode env = Flags.RefMode then
+    let status_stopped = 3l in
+    let pre_upgrade_fi = E.add_fun env "pre_upgrade" (Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InPreUpgrade ^^
+      (* check status is stopped or trap on outstanding callbacks *)
+      system_call env "canister_status" ^^ compile_eq_const status_stopped ^^
+      G.if0
+       (G.nop)
+       (ContinuationTable.count env ^^
+          E.then_trap_with env "canister_pre_upgrade attempted with outstanding message callbacks (try stopping the canister before upgrade)") ^^
+      (* call pre_upgrade expression & any system method *)
+      (G.i (Call (nr (E.built_in env "pre_exp")))) ^^
+      Lifecycle.trans env Lifecycle.PostPreUpgrade
+    )) in
+
+    let post_upgrade_fi = E.add_fun env "post_upgrade" (Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      Lifecycle.trans env Lifecycle.InPostUpgrade ^^
+      G.i (Call (nr (E.built_in env "post_exp"))) ^^
+      Lifecycle.trans env Lifecycle.Idle ^^
+      GC.collect_garbage env
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_pre_upgrade";
+      edesc = nr (FuncExport (nr pre_upgrade_fi))
+    });
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_post_upgrade";
+      edesc = nr (FuncExport (nr post_upgrade_fi))
+    })
+
+
+  let get_self_reference env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code0 env "canister_self" [I32Type] (fun env ->
+        Blob.of_size_copy env
+          (fun env -> system_call env "canister_self_size")
+          (fun env -> system_call env "canister_self_copy")
+          (fun env -> compile_unboxed_const 0l)
+      )
+    | _ ->
+      E.trap_with env "cannot get self-actor-reference when running locally"
+
+  let get_system_time env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      system_call env "time"
+    | _ ->
+      E.trap_with env "cannot get system time when running locally"
+
+  let caller env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_caller_size")
+        (fun env -> system_call env "msg_caller_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get caller when running locally")
+
+  let method_name env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_method_name_size")
+        (fun env -> system_call env "msg_method_name_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get method_name when running locally")
+
+  let arg_data env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_arg_data_size")
+        (fun env -> system_call env "msg_arg_data_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get arg_data when running locally")
+
+  let reject env arg_instrs =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      arg_instrs ^^
+      Text.to_blob env ^^
+      Blob.as_ptr_len env ^^
+      system_call env "msg_reject"
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot reject when running locally")
+
+  let error_code env =
+     Func.share_code0 env "error_code" [I32Type] (fun env ->
+      let (set_code, get_code) = new_local env "code" in
+      system_call env "msg_reject_code" ^^ set_code ^^
+      List.fold_right (fun (tag, const) code ->
+        get_code ^^ compile_unboxed_const const ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        G.if1 I32Type
+          (Variant.inject env tag Tuple.compile_unit)
+          code)
+        ["system_fatal", 1l;
+         "system_transient", 2l;
+         "destination_invalid", 3l;
+         "canister_reject", 4l;
+         "canister_error", 5l]
+        (Variant.inject env "future" (get_code ^^ BoxedSmallWord.box env)))
+
+  let error_message env =
+    Func.share_code0 env "error_message" [I32Type] (fun env ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_reject_msg_size")
+        (fun env -> system_call env "msg_reject_msg_copy")
+        (fun env -> compile_unboxed_const 0l)
+    )
+
+  let error_value env =
+    Func.share_code0 env "error_value" [I32Type] (fun env ->
+      error_code env ^^
+      error_message env ^^
+      Tuple.from_stack env 2
+    )
+
+  let reply_with_data env =
+    Func.share_code2 env "reply_with_data" (("start", I32Type), ("size", I32Type)) [] (
+      fun env get_data_start get_data_size ->
+        get_data_start ^^
+        get_data_size ^^
+        system_call env "msg_reply_data_append" ^^
+        system_call env "msg_reply"
+   )
+
+  (* Actor reference on the stack *)
+  let actor_public_field env name =
+    (* simply tuple canister name and function name *)
+    Blob.lit env name ^^
+    Tuple.from_stack env 2
+
+  let fail_assert env at =
+    let open Source in
+    let at = {
+        left = {at.left with file = Filename.basename at.left.file};
+        right = {at.right with file = Filename.basename at.right.file}
+      }
+    in
+    E.trap_with env (Printf.sprintf "assertion failed at %s" (string_of_region at))
+
+  let async_method_name = Type.(motoko_async_helper_fld.lab)
+
+  let assert_caller_self env =
+    let (set_len1, get_len1) = new_local env "len1" in
+    let (set_len2, get_len2) = new_local env "len2" in
+    let (set_str1, get_str1) = new_local env "str1" in
+    let (set_str2, get_str2) = new_local env "str2" in
+    system_call env "canister_self_size" ^^ set_len1 ^^
+    system_call env "msg_caller_size" ^^ set_len2 ^^
+    get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.else_trap_with env "not a self-call" ^^
+
+    get_len1 ^^ Blob.dyn_alloc_scratch env ^^ set_str1 ^^
+    get_str1 ^^ compile_unboxed_const 0l ^^ get_len1 ^^
+    system_call env "canister_self_copy" ^^
+
+    get_len2 ^^ Blob.dyn_alloc_scratch env ^^ set_str2 ^^
+    get_str2 ^^ compile_unboxed_const 0l ^^ get_len2 ^^
+    system_call env "msg_caller_copy" ^^
+
+
+    get_str1 ^^ get_str2 ^^ get_len1 ^^ Heap.memcmp env ^^
+    compile_eq_const 0l ^^
+    E.else_trap_with env "not a self-call"
+
+  (* Cycles *)
+
+  let cycle_balance env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "canister_cycle_balance128"
+    | _ ->
+      E.trap_with env "cannot read balance when running locally"
+
+  let cycles_add env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "call_cycles_add128"
+    | _ ->
+      E.trap_with env "cannot accept cycles when running locally"
+
+  let cycles_accept env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_accept128"
+    | _ ->
+      E.trap_with env "cannot accept cycles when running locally"
+
+  let cycles_available env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_available128"
+    | _ ->
+      E.trap_with env "cannot get cycles available when running locally"
+
+  let cycles_refunded env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_refunded128"
+    | _ ->
+      E.trap_with env "cannot get cycles refunded when running locally"
+
+  let set_certified_data env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      Blob.as_ptr_len env ^^
+      system_call env "certified_data_set"
+    | _ ->
+      E.trap_with env "cannot set certified data when running locally"
+
+  let get_certificate env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "data_certificate_present" ^^
+      G.if1 I32Type
+      begin
+        Opt.inject_simple env (
+          Blob.of_size_copy env
+            (fun env -> system_call env "data_certificate_size")
+            (fun env -> system_call env "data_certificate_copy")
+            (fun env -> compile_unboxed_const 0l)
+        )
+      end (Opt.null_lit env)
+    | _ ->
+      E.trap_with env "cannot get certificate when running locally"
+
+end (* IC *)
+
+module Cycles = struct
+
+  let from_word128_ptr env = Func.share_code1 env "from_word128_ptr" ("ptr", I32Type) [I32Type]
+    (fun env get_ptr ->
+     let set_lower, get_lower = new_local env "lower" in
+     get_ptr ^^
+     G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None }) ^^
+     BigNum.from_word64 env ^^
+     set_lower ^^
+     get_ptr ^^
+     G.i (Load {ty = I64Type; align = 0; offset = 8l; sz = None }) ^^
+     G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+     G.if1 I32Type
+       get_lower
+       begin
+         get_lower ^^
+         get_ptr ^^
+         G.i (Load {ty = I64Type; align = 0; offset = 8l; sz = None }) ^^
+         BigNum.from_word64 env ^^
+         (* shift left 64 bits *)
+         compile_unboxed_const 64l ^^
+         BigNum.compile_lsh env ^^
+         BigNum.compile_add env
+       end)
+
+  (* takes a bignum from the stack, traps if ≥2^128, and leaves two 64bit words on the stack *)
+  (* only used twice, so ok to not use share_code1; that would require I64Type support in FakeMultiVal *)
+  let to_two_word64 env =
+    let (set_val, get_val) = new_local env "cycles" in
+    set_val ^^
+    get_val ^^
+    compile_unboxed_const (BigNum.vanilla_lit env (Big_int.power_int_positive_int 2 128)) ^^
+    BigNum.compile_relop env Lt ^^
+    E.else_trap_with env "cycles out of bounds" ^^
+
+    get_val ^^
+    (* shift right 64 bits *)
+    compile_unboxed_const 64l ^^
+    BigNum.compile_rsh env ^^
+    BigNum.truncate_to_word64 env ^^
+
+    get_val ^^
+    BigNum.truncate_to_word64 env
+
+  let balance env =
+    Func.share_code0 env "cycle_balance" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycle_balance env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let add env =
+    Func.share_code1 env "cycle_add" ("cycles", I32Type) [] (fun env get_x ->
+      get_x ^^
+      to_two_word64 env ^^
+      IC.cycles_add env
+    )
+
+  let accept env =
+    Func.share_code1 env "cycle_accept" ("cycles", I32Type) [I32Type] (fun env get_x ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_x ^^
+        to_two_word64 env ^^
+        get_dst ^^
+        IC.cycles_accept env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let available env =
+    Func.share_code0 env "cycle_available" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycles_available env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let refunded env =
+    Func.share_code0 env "cycle_refunded" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycles_refunded env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+end (* Cycles *)
+
+
+module StableMem = struct
+
+  (* start from 1 to avoid accidental reads of 0 *)
+  let version = Int32.of_int 1
+
+  let register_globals env =
+    (* size (in pages) *)
+    E.add_global64 env "__stablemem_size" Mutable 0L
+
+  let get_mem_size env =
+    G.i (GlobalGet (nr (E.get_global env "__stablemem_size")))
+  let set_mem_size env =
+    G.i (GlobalSet (nr (E.get_global env "__stablemem_size")))
+
+  (* stable memory bounds check *)
+  let guard env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code1 env "__stablemem_guard"
+        ("offset", I64Type) []
+        (fun env get_offset ->
+          get_offset ^^
+          compile_const_64 (Int64.of_int page_size_bits) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.ShrU)) ^^
+          get_mem_size env ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+          E.else_trap_with env "StableMemory offset out of bounds")
+    | _ -> assert false
+
+  (* check [offset,.., offset + size) within bounds, assumes size > 0 *)
+  let guard_range env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code2 env "__stablemem_guard_range"
+        (("offset", I64Type), ("size", I32Type)) []
+        (fun env get_offset get_size ->
+          let (set_sum, get_sum) = new_local64 env "sum" in
+          get_offset ^^
+          get_size ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+          set_sum ^^
+          get_sum ^^
+          get_offset ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+          E.then_trap_with env "StableMemory range overflow" ^^
+          get_sum
+          ^^
+          get_mem_size env ^^
+          compile_const_64 (Int64.of_int page_size_bits) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LeU)) ^^
+          E.else_trap_with env "StableMemory range out of bounds")
+    | _ -> assert false
+
+  let add_guard env guarded get_offset bytes =
+    if guarded then
+     (get_offset ^^
+      if bytes = 1l then
+        guard env
+      else
+        compile_unboxed_const bytes ^^
+        guard_range env)
+    else G.nop
+
+  let read env guarded name typ bytes load =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code1 env (Printf.sprintf "__stablemem_%sread_%s" (if guarded then "guarded_" else "") name)
+        ("offset", I64Type) [typ]
+        (fun env get_offset ->
+          let words = Int32.div (Int32.add bytes 3l) 4l in
+          add_guard env guarded get_offset bytes ^^
+          Stack.with_words env "temp_ptr" words (fun get_temp_ptr ->
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            get_offset ^^
+            compile_const_64 (Int64.of_int32 bytes) ^^
+            IC.system_call env "stable64_read" ^^
+            get_temp_ptr ^^ load))
+    | _ -> assert false
+
+  let write env guarded name typ bytes store =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code2 env (Printf.sprintf "__stablemem_%swrite_%s" (if guarded then "guarded_" else "") name)
+        (("offset", I64Type), ("value", typ)) []
+        (fun env get_offset get_value ->
+          let words = Int32.div (Int32.add bytes 3l) 4l in
+          add_guard env guarded get_offset bytes ^^
+          Stack.with_words env "temp_ptr" words (fun get_temp_ptr ->
+            get_temp_ptr ^^ get_value ^^ store ^^
+            get_offset ^^
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            compile_const_64 (Int64.of_int32 bytes) ^^
+            IC.system_call env "stable64_write"))
+    | _ -> assert false
+
+  let _read_word32 env =
+    read env false "word32" I32Type 4l load_unskewed_ptr
+  let write_word32 env =
+    write env false "word32" I32Type 4l store_unskewed_ptr
+
+
+  (* read and clear word32 from stable mem offset on stack *)
+  let read_and_clear_word32 env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code1 env "__stablemem_read_and_clear_word32"
+        ("offset", I64Type) [I32Type]
+        (fun env get_offset ->
+          Stack.with_words env "temp_ptr" 1l (fun get_temp_ptr ->
+            let (set_word, get_word) = new_local env "word" in
+            (* read word *)
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            get_offset ^^
+            compile_const_64 4L ^^
+            IC.system_call env "stable64_read" ^^
+            get_temp_ptr ^^ load_unskewed_ptr ^^
+            set_word ^^
+            (* write 0 *)
+            get_temp_ptr ^^ compile_unboxed_const 0l ^^ store_unskewed_ptr ^^
+            get_offset ^^
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            compile_const_64 4L ^^
+            IC.system_call env "stable64_write" ^^
+            (* return word *)
+            get_word
+        ))
+    | _ -> assert false
+
+  (* ensure_pages : ensure at least num pages allocated,
+     growing (real) stable memory if needed *)
+  let ensure_pages env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code1 env "__stablemem_grow"
+        ("pages", I64Type) [I64Type]
+        (fun env get_pages ->
+          let (set_size, get_size) = new_local64 env "size" in
+          let (set_pages_needed, get_pages_needed) = new_local64 env "pages_needed" in
+
+          IC.system_call env "stable64_size" ^^
+          set_size ^^
+
+          get_pages ^^
+          get_size ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+          set_pages_needed ^^
+
+          get_pages_needed ^^
+          compile_const_64 0L ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.GtS)) ^^
+          G.if1 I64Type
+            (get_pages_needed ^^
+             IC.system_call env "stable64_grow")
+            get_size)
+    | _ -> assert false
+
+  (* ensure stable memory includes [offset..offset+size), assumes size > 0 *)
+  let ensure env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code2 env "__stablemem_ensure"
+        (("offset", I64Type), ("size", I64Type)) []
+        (fun env get_offset get_size ->
+          let (set_sum, get_sum) = new_local64 env "sum" in
+          get_offset ^^
+          get_size ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+          set_sum ^^
+          (* check for overflow *)
+          get_sum ^^
+          get_offset ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+          E.then_trap_with env "Range overflow" ^^
+          (* ensure page *)
+          get_sum ^^
+          compile_const_64 (Int64.of_int page_size_bits) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.ShrU)) ^^
+          compile_add64_const 1L ^^
+          ensure_pages env ^^
+          (* Check result *)
+          compile_const_64 0L ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+          E.then_trap_with env "Out of stable memory.")
+    | _ -> assert false
+
+  (* API *)
+
+  let logical_grow env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code1 env "__stablemem_logical_grow"
+        ("pages", I64Type) [I64Type] (fun env get_pages ->
+          let (set_size, get_size) = new_local64 env "size" in
+          get_mem_size env ^^
+          set_size ^^
+
+          (* check within --max-stable-pages *)
+          get_size ^^
+          get_pages ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+          compile_const_64 (Int64.of_int (!Flags.max_stable_pages)) ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.GtU)) ^^
+          G.if1 I64Type
+            begin
+             compile_const_64 (-1L) ^^
+             G.i Return
+            end
+            begin
+              let (set_new_size, get_new_size) = new_local64 env "new_size" in
+              get_size ^^
+              get_pages ^^
+              G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+              set_new_size ^^
+
+              (* physical grow if necessary *)
+              let (set_ensured, get_ensured) = new_local64 env "ensured" in
+              get_new_size ^^
+              ensure_pages env ^^
+              set_ensured ^^
+
+              (* Check result *)
+              get_ensured ^^
+              compile_const_64 0L ^^
+              G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+              G.if1 I64Type
+                ((* propagate failure -1; preserve logical size *)
+                 get_ensured)
+                ((* update logical size *)
+                 get_new_size ^^
+                 set_mem_size env ^^
+                 (* return old logical size *)
+                 get_size)
+            end)
+   | _ -> assert false
+
+  let load_word32 env =
+    read env true "word32" I32Type 4l load_unskewed_ptr
+  let store_word32 env =
+    write env true "word32" I32Type 4l store_unskewed_ptr
+
+  let load_word8 env =
+    read env true "word8" I32Type 1l
+      (G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}))
+  let store_word8 env =
+    write env true "word8" I32Type 1l store_unskewed_ptr
+
+  let load_word16 env =
+    read env true "word16" I32Type 2l
+      (G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack16, ZX)}))
+  let store_word16 env =
+    write env true "word16" I32Type 2l store_unskewed_ptr
+
+  let load_word64 env =
+    read env true "word64" I64Type 8l
+      (G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None }))
+  let store_word64 env =
+    write env true "word64" I64Type 8l
+      (G.i (Store {ty = I64Type; align = 0; offset = 0l; sz = None}))
+
+  let load_float64 env =
+    read env true "float64" F64Type 8l
+      (G.i (Load {ty = F64Type; align = 0; offset = 0l; sz = None }))
+  let store_float64 env =
+    write env true "float64" F64Type 8l
+      (G.i (Store {ty = F64Type; align = 0; offset = 0l; sz = None}))
+
+
+  let load_blob env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code2 env "__stablemem_load_blob"
+        (("offset", I64Type), ("len", I32Type)) [I32Type]
+        (fun env get_offset get_len ->
+          let (set_blob, get_blob) = new_local env "blob" in
+          get_offset ^^
+          get_len ^^
+          guard_range env ^^
+          get_len ^^ Blob.alloc env ^^ set_blob ^^
+          get_blob ^^ Blob.payload_ptr_unskewed env ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          get_offset ^^
+          get_len ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          IC.system_call env "stable64_read" ^^
+          get_blob)
+    | _ -> assert false
+
+  let store_blob env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code2 env "__stablemem_store_blob"
+        (("offset", I64Type), ("blob", I32Type)) []
+        (fun env get_offset get_blob ->
+         let (set_len, get_len) = new_local env "len" in
+          get_blob ^^ Blob.len env ^^ set_len ^^
+          get_offset ^^
+          get_len ^^
+          guard_range env ^^
+          get_offset ^^
+          get_blob ^^ Blob.payload_ptr_unskewed env ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          get_len ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          IC.system_call env "stable64_write")
+    | _ -> assert false
+
+end (* StableMemory *)
+
+module RTS_Exports = struct
+  let system_exports env =
+    let bigint_trap_fi = E.add_fun env "bigint_trap" (
+      Func.of_body env [] [] (fun env ->
+        E.trap_with env "bigint function error"
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "bigint_trap";
+      edesc = nr (FuncExport (nr bigint_trap_fi))
+    });
+
+    let rts_trap_fi = E.add_fun env "rts_trap" (
+      Func.of_body env ["str", I32Type; "len", I32Type] [] (fun env ->
+        let get_str = G.i (LocalGet (nr 0l)) in
+        let get_len = G.i (LocalGet (nr 1l)) in
+        get_str ^^ get_len ^^ IC.trap_ptr_len env
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "rts_trap";
+      edesc = nr (FuncExport (nr rts_trap_fi))
+    });
+
+    if !Flags.gc_strategy <> Flags.Incremental then
+    begin
+      let set_hp_fi =
+        E.add_fun env "__set_hp" (
+        Func.of_body env ["new_hp", I32Type] [] (fun env ->
+          G.i (LocalGet (nr 0l)) ^^
+          GC.set_heap_pointer env
+        )
+      ) in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "setHP";
+        edesc = nr (FuncExport (nr set_hp_fi))
+      });
+
+      let get_hp_fi = E.add_fun env "__get_hp" (
+        Func.of_body env [] [I32Type] (fun env ->
+          GC.get_heap_pointer env
+        )
+      ) in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "getHP";
+        edesc = nr (FuncExport (nr get_hp_fi))
+      })
+    end;
+
+    let stable64_write_moc_fi =
+      if E.mode env = Flags.WASIMode then
+        E.add_fun env "stable64_write_moc" (
+            Func.of_body env ["to", I64Type; "from", I64Type; "len", I64Type] []
+              (fun env ->
+                E.trap_with env "stable64_write_moc is not supposed to be called in WASI"
+              )
+          )
+      else E.reuse_import env "ic0" "stable64_write" in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "stable64_write_moc";
+      edesc = nr (FuncExport (nr stable64_write_moc_fi))
+    })
+
+end (* RTS_Exports *)
+
+
+(* Below signature is needed by the serialiser to supply the
+   methods various formats and auxiliary routines. A stream
+   token refers to the stream itself. Depending on the stream's
+   methodology, the token can be a (bump) pointer or a handle
+   (like a `Blob`). The former needs to be updated at certain
+   points because the token will normally reside in locals that
+   nested functions won't have access to. *)
+module type Stream = sig
+  (* Bottleneck routines for streaming in different formats.
+     The `code` must be used linearly. `token` is a fragment
+     of Wasm that puts the stream token onto the stack.
+     Arguments:    env    token  code *)
+  val write_byte : E.t -> G.t -> G.t -> G.t
+  val write_word_leb : E.t -> G.t -> G.t -> G.t
+  val write_word_32 : E.t -> G.t -> G.t -> G.t
+  val write_blob : E.t -> G.t -> G.t -> G.t
+  val write_text : E.t -> G.t -> G.t -> G.t
+  val write_bignum_leb : E.t -> G.t -> G.t -> G.t
+  val write_bignum_sleb : E.t -> G.t -> G.t -> G.t
+
+  (* Creates a fresh stream with header, storing stream token.
+     Arguments:env    size   setter getter header *)
+  val create : E.t -> G.t -> G.t -> G.t -> string -> G.t
+
+  (* Checks the stream's filling, traps if unexpected
+     Arguments:      env    token  size *)
+  val check_filled : E.t -> G.t -> G.t -> G.t
+
+  (* Pushes the stream's current absolute byte offset on stack.
+     The requirement is that the difference between two uses
+     of this method must give a correct _relative_ offset.
+     Arguments:         env    token *)
+  val absolute_offset : E.t -> G.t -> G.t
+
+  (* Finishes the stream, performing consistency checks.
+     Leaves two words on stack, whose interpretation depends
+     on the Stream.
+     Arguments:   env    token  size   header_size *)
+  val terminate : E.t -> G.t -> G.t -> int32 -> G.t
+
+  (* Executes code to eliminate the residual buffer
+     that `terminate` returns (if at all) *)
+  val finalize_buffer : G.t -> G.t
+
+  (* Builds a unique name for a name seed and a type *)
+  val name_for : string -> Type.typ list -> string
+
+  (* Opportunity to flush or update the token. Stream token is on stack. *)
+  val checkpoint : E.t -> G.t -> G.t
+
+  (* Reserve a small fixed number of bytes in the stream and return an
+     address to it. The address is invalidated by a GC, and as such must
+     be written to in the next few instructions. *)
+  val reserve : E.t -> G.t -> int32 -> G.t
+end
+
+
+module BumpStream : Stream = struct
+  let create env get_data_size set_data_buf get_data_buf header =
+    let header_size = Int32.of_int (String.length header) in
+    get_data_size ^^ compile_add_const header_size ^^
+    Blob.dyn_alloc_scratch env ^^ set_data_buf ^^
+    get_data_buf ^^
+    Blob.lit env header ^^ Blob.payload_ptr_unskewed env ^^
+    compile_unboxed_const header_size ^^
+    Heap.memcpy env ^^
+    get_data_buf ^^ compile_add_const header_size ^^ set_data_buf
+
+  let check_filled env get_data_buf get_data_size =
+    get_data_buf ^^ get_data_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.else_trap_with env "data buffer not filled"
+
+  let terminate env get_data_buf get_data_size header_size =
+    get_data_buf ^^ compile_sub_const header_size ^^
+    get_data_size ^^ compile_add_const header_size
+
+  let finalize_buffer code = code
+
+  let name_for fn_name ts = "@" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+  let advance_data_buf get_data_buf =
+    get_data_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^ G.setter_for get_data_buf
+
+  let absolute_offset _env get_data_buf = get_data_buf
+
+  let checkpoint _env get_data_buf = G.setter_for get_data_buf
+
+  let reserve _env get_data_buf bytes =
+    get_data_buf ^^ get_data_buf ^^ compile_add_const bytes ^^ G.setter_for get_data_buf
+
+  let write_word_leb env get_data_buf code =
+    let set_word, get_word = new_local env "word" in
+    code ^^ set_word ^^
+    I32Leb.compile_store_to_data_buf_unsigned env get_word get_data_buf ^^
+    advance_data_buf get_data_buf
+
+  let write_word_32 env get_data_buf code =
+    get_data_buf ^^ code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = None}) ^^
+    compile_unboxed_const Heap.word_size ^^ advance_data_buf get_data_buf
+
+  let write_byte _env get_data_buf code =
+    get_data_buf ^^ code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack8}) ^^
+    compile_unboxed_const 1l ^^ advance_data_buf get_data_buf
+
+  let write_blob env get_data_buf get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Blob.len env ^^ set_len ^^
+    write_word_leb env get_data_buf get_len ^^
+    get_data_buf ^^
+    get_x ^^ Blob.payload_ptr_unskewed env ^^
+    get_len ^^
+    Heap.memcpy env ^^
+    get_len ^^ advance_data_buf get_data_buf
+
+  let write_text env get_data_buf get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Text.size env ^^ set_len ^^
+    write_word_leb env get_data_buf get_len ^^
+    get_x ^^ get_data_buf ^^ Text.to_buf env ^^
+    get_len ^^ advance_data_buf get_data_buf
+
+  let write_bignum_leb env get_data_buf get_x =
+    get_data_buf ^^
+    get_x ^^
+    BigNum.compile_store_to_data_buf_unsigned env ^^
+    advance_data_buf get_data_buf
+
+  let write_bignum_sleb env get_data_buf get_x =
+    get_data_buf ^^
+    get_x ^^
+    BigNum.compile_store_to_data_buf_signed env ^^
+    advance_data_buf get_data_buf
+
+end
+
+module MakeSerialization (Strm : Stream) = struct
+  (*
+    The general serialization strategy is as follows:
+    * We statically generate the IDL type description header.
+    * We traverse the data to calculate the size needed for the data buffer and the
+      reference buffer.
+    * We allocate memory for the data buffer and the reference buffer
+      (this memory area is not referenced, so will be dead with the next GC)
+    * We copy the IDL type header to the data buffer.
+    * We traverse the data and serialize it into the data buffer.
+      This is type driven, and we use the `share_code` machinery and names that
+      properly encode the type to resolve loops in a convenient way.
+    * We externalize all that new data space into a databuf
+    * We externalize the reference space into a elembuf
+    * We pass both databuf and elembuf to shared functions
+      (this mimicks the future system API)
+
+    The deserialization is analogous:
+    * We allocate some scratch space, and internalize the databuf and elembuf into it.
+    * We parse the data, in a type-driven way, using normal construction and
+      allocation, while keeping tabs on the type description header for subtyping.
+    * At the end, the scratch space is a hole in the heap, and will be reclaimed
+      by the next GC.
+  *)
+
+  module Strm = Strm
+
+  (* Globals recording known Candid types
+     See Note [Candid subtype checks]
+   *)
+  let register_delayed_globals env =
+    (E.add_global32_delayed env "__typtbl" Immutable,
+     E.add_global32_delayed env "__typtbl_end" Immutable,
+     E.add_global32_delayed env "__typtbl_size" Immutable,
+     E.add_global32_delayed env "__typtbl_idltyps" Immutable)
+
+  let get_typtbl env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl")))
+  let get_typtbl_size env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_size")))
+  let get_typtbl_end env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_end")))
+  let get_typtbl_idltyps env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_idltyps")))
+
+  module Registers = struct
+    let register_globals env =
+      E.add_global32 env "@@rel_buf_opt" Mutable 0l;
+      E.add_global32 env "@@data_buf" Mutable 0l;
+      E.add_global32 env "@@ref_buf" Mutable 0l;
+      E.add_global32 env "@@typtbl" Mutable 0l;
+      E.add_global32 env "@@typtbl_end" Mutable 0l;
+      E.add_global32 env "@@typtbl_size" Mutable 0l
+
+    let get_rel_buf_opt env =
+      G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt")))
+    let set_rel_buf_opt env =
+      G.i (GlobalSet (nr (E.get_global env "@@rel_buf_opt")))
+
+    let get_data_buf env =
+      G.i (GlobalGet (nr (E.get_global env "@@data_buf")))
+    let set_data_buf env =
+      G.i (GlobalSet (nr (E.get_global env "@@data_buf")))
+
+    let get_ref_buf env =
+      G.i (GlobalGet (nr (E.get_global env "@@ref_buf")))
+    let set_ref_buf env =
+      G.i (GlobalSet (nr (E.get_global env "@@ref_buf")))
+
+    let get_typtbl env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl")))
+    let set_typtbl env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl")))
+
+    let get_typtbl_end env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl_end")))
+    let set_typtbl_end env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl_end")))
+
+    let get_typtbl_size env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl_size")))
+    let set_typtbl_size env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl_size")))
+  end
+
+  open Typ_hash
+
+  let sort_by_hash fs =
+    List.sort
+      (fun (h1,_) (h2,_) -> Lib.Uint32.compare h1 h2)
+      (List.map (fun f -> (Idllib.Escape.unescape_hash f.Type.lab, f)) fs)
+
+  (* The IDL serialization prefaces the data with a type description.
+     We can statically create the type description in Ocaml code,
+     store it in the program, and just copy it to the beginning of the message.
+
+     At some point this can be factored into a function from Motoko type to IDL,
+     type and a function like this for IDL types. But due to recursion handling
+     it is easier to start like this.
+  *)
+
+  module TM = Map.Make (Type.Ord)
+  let to_idl_prim = let open Type in function
+    | Prim Null | Tup [] -> Some 1l
+    | Prim Bool -> Some 2l
+    | Prim Nat -> Some 3l
+    | Prim Int -> Some 4l
+    | Prim Nat8 -> Some 5l
+    | Prim Nat16 -> Some 6l
+    | Prim (Nat32|Char) -> Some 7l
+    | Prim Nat64 -> Some 8l
+    | Prim Int8 -> Some 9l
+    | Prim Int16 -> Some 10l
+    | Prim Int32 -> Some 11l
+    | Prim Int64 -> Some 12l
+    | Prim Float -> Some 14l
+    | Prim Text -> Some 15l
+    (* NB: Prim Blob does not map to a primitive IDL type *)
+    | Any -> Some 16l
+    | Non -> Some 17l
+    | Prim Principal -> Some 24l
+    | _ -> None
+
+  (* some constants, also see rts/idl.c *)
+  let idl_opt       = -18l
+  let idl_vec       = -19l
+  let idl_record    = -20l
+  let idl_variant   = -21l
+  let idl_func      = -22l
+  let idl_service   = -23l
+  let idl_alias     = 1l (* see Note [mutable stable values] *)
+
+  (* TODO: use record *)
+  let type_desc env ts :
+     string * int list * int32 list  (* type_desc, (relative offsets), indices of ts *)
+    =
+    let open Type in
+
+    (* Type traversal *)
+    (* We do a first traversal to find out the indices of non-primitive types *)
+    let (typs, idx) =
+      let typs = ref [] in
+      let idx = ref TM.empty in
+      let rec go t =
+        let t = Type.normalize t in
+        if to_idl_prim t <> None then () else
+        if TM.mem t !idx then () else begin
+          idx := TM.add t (Lib.List32.length !typs) !idx;
+          typs := !typs @ [ t ];
+          match t with
+          | Tup ts -> List.iter go ts
+          | Obj (_, fs) ->
+            List.iter (fun f -> go f.typ) fs
+          | Array (Mut t) -> go (Array t)
+          | Array t -> go t
+          | Opt t -> go t
+          | Variant vs -> List.iter (fun f -> go f.typ) vs
+          | Func (s, c, tbs, ts1, ts2) ->
+            List.iter go ts1; List.iter go ts2
+          | Prim Blob -> ()
+          | Mut t -> go t
+          | _ ->
+            Printf.eprintf "type_desc: unexpected type %s\n" (string_of_typ t);
+            assert false
+        end
+      in
+      List.iter go ts;
+      (!typs, !idx)
+    in
+
+    (* buffer utilities *)
+    let buf = Buffer.create 16 in
+
+    let add_u8 i =
+      Buffer.add_char buf (Char.chr (i land 0xff)) in
+
+    let rec add_leb128_32 (i : Lib.Uint32.t) =
+      let open Lib.Uint32 in
+      let b = logand i (of_int32 0x7fl) in
+      if of_int32 0l <= i && i < of_int32 128l
+      then add_u8 (to_int b)
+      else begin
+        add_u8 (to_int (logor b (of_int32 0x80l)));
+        add_leb128_32 (shift_right_logical i 7)
+      end in
+
+    let add_leb128 i =
+      assert (i >= 0);
+      add_leb128_32 (Lib.Uint32.of_int i) in
+
+    let rec add_sleb128 (i : int32) =
+      let open Int32 in
+      let b = logand i 0x7fl in
+      if -64l <= i && i < 64l
+      then add_u8 (to_int b)
+      else begin
+        add_u8 (to_int (logor b 0x80l));
+        add_sleb128 (shift_right i 7)
+      end in
+
+    (* Actual binary data *)
+
+    let add_idx t =
+      let t = Type.normalize t in
+      match to_idl_prim t with
+      | Some i -> add_sleb128 (Int32.neg i)
+      | None -> add_sleb128 (TM.find (normalize t) idx) in
+
+    let idx t =
+      let t = Type.normalize t in
+      match to_idl_prim t with
+      | Some i -> Int32.neg i
+      | None -> TM.find (normalize t) idx in
+
+    let rec add_typ t =
+      match t with
+      | Non -> assert false
+      | Prim Blob ->
+        add_typ Type.(Array (Prim Nat8))
+      | Prim _ -> assert false
+      | Tup ts ->
+        add_sleb128 idl_record;
+        add_leb128 (List.length ts);
+        List.iteri (fun i t ->
+          add_leb128 i;
+          add_idx t;
+        ) ts
+      | Obj ((Object | Memory), fs) ->
+        add_sleb128 idl_record;
+        add_leb128 (List.length fs);
+        List.iter (fun (h, f) ->
+          add_leb128_32 h;
+          add_idx f.typ
+        ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        add_sleb128 idl_alias; add_idx (Array t)
+      | Array t ->
+        add_sleb128 idl_vec; add_idx t
+      | Opt t ->
+        add_sleb128 idl_opt; add_idx t
+      | Variant vs ->
+        add_sleb128 idl_variant;
+        add_leb128 (List.length vs);
+        List.iter (fun (h, f) ->
+          add_leb128_32 h;
+          add_idx f.typ
+        ) (sort_by_hash vs)
+      | Func (s, c, tbs, ts1, ts2) ->
+        assert (Type.is_shared_sort s);
+        add_sleb128 idl_func;
+        add_leb128 (List.length ts1);
+        List.iter add_idx ts1;
+        add_leb128 (List.length ts2);
+        List.iter add_idx ts2;
+        begin match s, c with
+          | _, Returns ->
+            add_leb128 1; add_u8 2; (* oneway *)
+          | Shared Write, _ ->
+            add_leb128 0; (* no annotation *)
+          | Shared Query, _ ->
+            add_leb128 1; add_u8 1; (* query *)
+          | Shared Composite, _ ->
+            add_leb128 1; add_u8 3; (* composite *)
+          | _ -> assert false
+        end
+      | Obj (Actor, fs) ->
+        add_sleb128 idl_service;
+        add_leb128 (List.length fs);
+        List.iter (fun f ->
+          add_leb128 (String.length f.lab);
+          Buffer.add_string buf f.lab;
+          add_idx f.typ
+        ) fs
+      | Mut t ->
+        add_sleb128 idl_alias; add_idx t
+      | _ -> assert false in
+
+    Buffer.add_string buf "DIDL";
+    add_leb128 (List.length typs);
+    let offsets = List.map (fun typ ->
+      let offset = Buffer.length buf in
+      add_typ typ;
+      offset)
+      typs
+    in
+    add_leb128 (List.length ts);
+    List.iter add_idx ts;
+    (Buffer.contents buf,
+     offsets,
+     List.map idx ts)
+
+  (* See Note [Candid subtype checks] *)
+  let set_delayed_globals (env : E.t) (set_typtbl, set_typtbl_end, set_typtbl_size, set_typtbl_idltyps) =
+    let typdesc, offsets, idltyps = type_desc env (E.get_typtbl_typs env) in
+    let static_typedesc = E.add_static_unskewed env [StaticBytes.Bytes typdesc] in
+    let static_typtbl =
+      let bytes = StaticBytes.i32s
+        (List.map (fun offset ->
+          Int32.(add static_typedesc (of_int(offset))))
+        offsets)
+      in
+      E.add_static_unskewed env [bytes]
+    in
+    let static_idltyps = E.add_static_unskewed env [StaticBytes.i32s idltyps] in
+    set_typtbl static_typtbl;
+    set_typtbl_end Int32.(add static_typedesc (of_int (String.length typdesc)));
+    set_typtbl_size (Int32.of_int (List.length offsets));
+    set_typtbl_idltyps static_idltyps
+
+  (* Returns data (in bytes) and reference buffer size (in entries) needed *)
+  let rec buffer_size env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = "@buffer_size<" ^ typ_hash t ^ ">" in
+    Func.share_code1 env name ("x", I32Type) [I32Type; I32Type]
+    (fun env get_x ->
+
+      (* Some combinators for writing values *)
+      let (set_data_size, get_data_size) = new_local64 env "data_size" in
+      let (set_ref_size, get_ref_size) = new_local env "ref_size" in
+      compile_const_64 0L ^^ set_data_size ^^
+      compile_unboxed_const 0l ^^ set_ref_size ^^
+
+      let inc_data_size code =
+        get_data_size ^^
+        code ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+        G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+        set_data_size
+      in
+
+      let size_word env code =
+        let (set_word, get_word) = new_local env "word" in
+        code ^^ set_word ^^
+        inc_data_size (I32Leb.compile_leb128_size get_word)
+      in
+
+      let size env t =
+        let (set_inc, get_inc) = new_local env "inc" in
+        buffer_size env t ^^
+        get_ref_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^ set_ref_size ^^
+        set_inc ^^ inc_data_size get_inc
+      in
+
+      (* the incremental GC leaves array slice information in tag,
+         the slice information can be removed and the tag reset to array
+         as the GC can resume marking from the array beginning *)
+      let clear_array_slicing =
+        let (set_temp, get_temp) = new_local env "temp" in
+        set_temp ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag StableSeen) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Ne)) ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag CoercionFailure) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Ne)) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag ArraySliceMinimum) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+        G.if1 I32Type begin
+          (compile_unboxed_const Tagged.(int_of_tag Array))
+        end begin
+          get_temp
+        end
+      in
+
+      let size_alias size_thing =
+        (* see Note [mutable stable values] *)
+        let (set_tag, get_tag) = new_local env "tag" in
+        get_x ^^ Tagged.load_tag env ^^ clear_array_slicing ^^ set_tag ^^
+        (* Sanity check *)
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag MutBox) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag ObjInd) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag Array) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        E.else_trap_with env "object_size/Mut: Unexpected tag" ^^
+        (* Check if we have seen this before *)
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        G.if0 begin
+          (* Seen before *)
+          (* One byte marker, one word offset *)
+          inc_data_size (compile_unboxed_const 5l)
+        end begin
+          (* Not yet seen *)
+          (* One byte marker, two words scratch space *)
+          inc_data_size (compile_unboxed_const 9l) ^^
+          (* Mark it as seen *)
+          get_x ^^ Tagged.(store_tag env StableSeen) ^^
+          (* and descend *)
+          size_thing ()
+        end
+      in
+
+      (* Now the actual type-dependent code *)
+      begin match t with
+      | Prim Nat -> inc_data_size (get_x ^^ BigNum.compile_data_size_unsigned env)
+      | Prim Int -> inc_data_size (get_x ^^ BigNum.compile_data_size_signed env)
+      | Prim (Int8|Nat8) -> inc_data_size (compile_unboxed_const 1l)
+      | Prim (Int16|Nat16) -> inc_data_size (compile_unboxed_const 2l)
+      | Prim (Int32|Nat32|Char) -> inc_data_size (compile_unboxed_const 4l)
+      | Prim (Int64|Nat64|Float) -> inc_data_size (compile_unboxed_const 8l)
+      | Prim Bool -> inc_data_size (compile_unboxed_const 1l)
+      | Prim Null -> G.nop
+      | Any -> G.nop
+      | Tup [] -> G.nop (* e(()) = null *)
+      | Tup ts ->
+        G.concat_mapi (fun i t ->
+          get_x ^^ Tuple.load_n env (Int32.of_int i) ^^
+          size env t
+          ) ts
+      | Obj ((Object | Memory), fs) ->
+        G.concat_map (fun (_h, f) ->
+          get_x ^^ Object.load_idx_raw env f.Type.lab ^^
+          size env f.typ
+          ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        size_alias (fun () -> get_x ^^ size env (Array t))
+      | Array t ->
+        size_word env (get_x ^^ Arr.len env) ^^
+        get_x ^^ Arr.len env ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^ load_ptr ^^
+          size env t
+        )
+      | Prim Blob ->
+        let (set_len, get_len) = new_local env "len" in
+        get_x ^^ Blob.len env ^^ set_len ^^
+        size_word env get_len ^^
+        inc_data_size get_len
+      | Prim Text ->
+        let (set_len, get_len) = new_local env "len" in
+        get_x ^^ Text.size env ^^ set_len ^^
+        size_word env get_len ^^
+        inc_data_size get_len
+      | Opt t ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ Opt.is_some env ^^
+        G.if0 (get_x ^^ Opt.project env ^^ size env t) G.nop
+      | Variant vs ->
+        List.fold_right (fun (i, {lab = l; typ = t; _}) continue ->
+            get_x ^^
+            Variant.test_is env l ^^
+            G.if0
+              ( size_word env (compile_unboxed_const (Int32.of_int i)) ^^
+                get_x ^^ Variant.project env ^^ size env t
+              ) continue
+          )
+          ( List.mapi (fun i (_h, f) -> (i,f)) (sort_by_hash vs) )
+          ( E.trap_with env "buffer_size: unexpected variant" )
+      | Func _ ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ Arr.load_field env 0l ^^ size env (Obj (Actor, [])) ^^
+        get_x ^^ Arr.load_field env 1l ^^ size env (Prim Text)
+      | Obj (Actor, _) | Prim Principal ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ size env (Prim Blob)
+      | Non ->
+        E.trap_with env "buffer_size called on value of type None"
+      | Mut t ->
+        size_alias (fun () -> get_x ^^ MutBox.load_field env ^^ size env t)
+      | _ -> todo "buffer_size" (Arrange_ir.typ t) G.nop
+      end ^^
+      (* Check 32-bit overflow of buffer_size *)
+      get_data_size ^^
+      compile_shrU64_const 32L ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      E.else_trap_with env "buffer_size overflow" ^^
+      (* Convert to 32-bit *)
+      get_data_size ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+      get_ref_size
+    )
+
+  (* Copies x to the data_buffer, storing references after ref_count entries in ref_base *)
+  let rec serialize_go env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = Strm.name_for "serialize_go" [t] in
+    Func.share_code3 env name (("x", I32Type), ("data_buffer", I32Type), ("ref_buffer", I32Type)) [I32Type; I32Type]
+    (fun env get_x get_data_buf get_ref_buf ->
+      let set_ref_buf = G.setter_for get_ref_buf in
+
+      (* Some combinators for writing values *)
+      let open Strm in
+
+      let write env t =
+        get_data_buf ^^
+        get_ref_buf ^^
+        serialize_go env t ^^
+        set_ref_buf ^^
+        checkpoint env get_data_buf
+      in
+
+      let write_alias write_thing =
+        (* see Note [mutable stable values] *)
+        (* Check heap tag *)
+        let (set_tag, get_tag) = new_local env "tag" in
+        get_x ^^ Tagged.load_tag env ^^ set_tag ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        G.if0
+        begin
+          (* This is the real data *)
+          write_byte env get_data_buf (compile_unboxed_const 0l) ^^
+          (* Remember the current offset in the tag word *)
+          get_x ^^ Tagged.load_forwarding_pointer env ^^ Strm.absolute_offset env get_data_buf ^^
+          Tagged.store_field env Tagged.tag_field ^^
+          (* Leave space in the output buffer for the decoder's bookkeeping *)
+          write_word_32 env get_data_buf (compile_unboxed_const 0l) ^^
+          write_word_32 env get_data_buf (compile_unboxed_const 0l) ^^
+          (* Now the data, following the object field mutbox indirection *)
+          write_thing ()
+        end
+        begin
+          (* This is a reference *)
+          write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+          (* Sanity Checks *)
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag MutBox) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (MutBox)" ^^
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag ObjInd) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (ObjInd)" ^^
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag Array) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (Array)" ^^
+          (* Second time we see this *)
+          (* Calculate relative offset *)
+          let set_offset, get_offset = new_local env "offset" in
+          get_tag ^^ Strm.absolute_offset env get_data_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+          set_offset ^^
+          (* A sanity check *)
+          get_offset ^^ compile_unboxed_const 0l ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+          E.else_trap_with env "Odd offset" ^^
+          (* Write the offset to the output buffer *)
+          write_word_32 env get_data_buf get_offset
+        end
+      in
+
+      (* Now the actual serialization *)
+
+      begin match t with
+      | Prim Nat ->
+        write_bignum_leb env get_data_buf get_x
+      | Prim Int ->
+        write_bignum_sleb env get_data_buf get_x
+      | Prim Float ->
+        reserve env get_data_buf 8l ^^
+        get_x ^^ Float.unbox env ^^
+        G.i (Store {ty = F64Type; align = 0; offset = 0l; sz = None})
+      | Prim (Int64|Nat64) ->
+        reserve env get_data_buf 8l ^^
+        get_x ^^ BoxedWord64.unbox env ^^
+        G.i (Store {ty = I64Type; align = 0; offset = 0l; sz = None})
+      | Prim (Int32|Nat32) ->
+        write_word_32 env get_data_buf (get_x ^^ BoxedSmallWord.unbox env)
+      | Prim Char ->
+        write_word_32 env get_data_buf (get_x ^^ TaggedSmallWord.untag_codepoint)
+      | Prim (Int16|Nat16) ->
+        reserve env get_data_buf 2l ^^
+        get_x ^^ TaggedSmallWord.lsb_adjust Nat16 ^^
+        G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack16})
+      | Prim (Int8|Nat8) ->
+        write_byte env get_data_buf (get_x ^^ TaggedSmallWord.lsb_adjust Nat8)
+      | Prim Bool ->
+        write_byte env get_data_buf get_x
+      | Tup [] -> (* e(()) = null *)
+        G.nop
+      | Tup ts ->
+        G.concat_mapi (fun i t ->
+          get_x ^^ Tuple.load_n env (Int32.of_int i) ^^
+          write env t
+        ) ts
+      | Obj ((Object | Memory), fs) ->
+        G.concat_map (fun (_h, f) ->
+          get_x ^^ Object.load_idx_raw env f.Type.lab ^^
+          write env f.typ
+        ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        write_alias (fun () -> get_x ^^ write env (Array t))
+      | Array t ->
+        write_word_leb env get_data_buf (get_x ^^ Arr.len env) ^^
+        get_x ^^ Arr.len env ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^ load_ptr ^^
+          write env t
+        )
+      | Prim Null -> G.nop
+      | Any -> G.nop
+      | Opt t ->
+        get_x ^^
+        Opt.is_some env ^^
+        G.if0
+          (write_byte env get_data_buf (compile_unboxed_const 1l) ^^ get_x ^^ Opt.project env ^^ write env t)
+          (write_byte env get_data_buf (compile_unboxed_const 0l))
+      | Variant vs ->
+        List.fold_right (fun (i, {lab = l; typ = t; _}) continue ->
+            get_x ^^
+            Variant.test_is env l ^^
+            G.if0
+              ( write_word_leb env get_data_buf (compile_unboxed_const (Int32.of_int i)) ^^
+                get_x ^^ Variant.project env ^^ write env t)
+              continue
+          )
+          ( List.mapi (fun i (_h, f) -> (i,f)) (sort_by_hash vs) )
+          ( E.trap_with env "serialize_go: unexpected variant" )
+      | Prim Blob ->
+        write_blob env get_data_buf get_x
+      | Prim Text ->
+        write_text env get_data_buf get_x
+      | Func _ ->
+        write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+        get_x ^^ Arr.load_field env 0l ^^ write env (Obj (Actor, [])) ^^
+        get_x ^^ Arr.load_field env 1l ^^ write env (Prim Text)
+      | Obj (Actor, _) | Prim Principal ->
+        write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+        get_x ^^ write env (Prim Blob)
+      | Non ->
+        E.trap_with env "serializing value of type None"
+      | Mut t ->
+        write_alias (fun () ->
+          get_x ^^ MutBox.load_field env ^^ write env t
+        )
+      | _ -> todo "serialize" (Arrange_ir.typ t) G.nop
+      end ^^
+      get_data_buf ^^
+      get_ref_buf
+    )
+
+  (* This value is returned by deserialize_go if deserialization fails in a way
+     that should be recoverable by opt parsing.
+     By virtue of being a deduped static value, it can be detected by pointer
+     comparison.
+  *)
+  let coercion_error_value env : int32 =
+    Tagged.shared_static_obj env Tagged.CoercionFailure []
+
+  (* See Note [Candid subtype checks] *)
+  let with_rel_buf_opt env extended get_typtbl_size1 f =
+    if extended then
+      f (compile_unboxed_const 0l)
+    else
+      get_typtbl_size1 ^^ get_typtbl_size env ^^
+      E.call_import env "rts" "idl_sub_buf_words" ^^
+      Stack.dynamic_with_words env "rel_buf" (fun get_ptr ->
+        get_ptr ^^ get_typtbl_size1 ^^ get_typtbl_size env ^^
+        E.call_import env "rts" "idl_sub_buf_init" ^^
+        f get_ptr)
+
+  (* See Note [Candid subtype checks] *)
+  let idl_sub env t2 =
+    let idx = E.add_typtbl_typ env t2 in
+    get_typtbl_idltyps env ^^
+    G.i (Load {ty = I32Type; align = 0; offset = Int32.mul idx 4l (*!*); sz = None}) ^^
+    Func.share_code6 env ("idl_sub")
+      (("rel_buf", I32Type),
+       ("typtbl1", I32Type),
+       ("typtbl_end1", I32Type),
+       ("typtbl_size1", I32Type),
+       ("idltyp1", I32Type),
+       ("idltyp2", I32Type)
+      )
+      [I32Type]
+      (fun env get_rel_buf get_typtbl1 get_typtbl_end1 get_typtbl_size1 get_idltyp1 get_idltyp2 ->
+        get_rel_buf ^^
+        E.else_trap_with env "null rel_buf" ^^
+        get_rel_buf ^^
+        get_typtbl1 ^^
+        get_typtbl env ^^
+        get_typtbl_end1 ^^
+        get_typtbl_end env ^^
+        get_typtbl_size1 ^^
+        get_typtbl_size env ^^
+        get_idltyp1 ^^
+        get_idltyp2 ^^
+        E.call_import env "rts" "idl_sub")
+
+  (* The main deserialization function, generated once per type hash.
+
+     We use a combination of RTS stack locals and registers (Wasm globals) for
+     recursive parameter passing to avoid exhausting the Wasm stack, which is instead
+     used solely for return values and (implicit) return addresses.
+
+     Its RTS stack parameters are (c.f. module Stack):
+
+       * idltyp:      The idl type (prim type or table index) to decode now
+       * depth:       Recursion counter; reset when we make progres on the value
+       * can_recover: Whether coercion errors are recoverable, see coercion_failed below
+
+     Its register parameters are (c.f. Registers):
+       * rel_buf_opt: The optional subtype check memoization table
+          (non-null for untrusted Candid but null for trusted de-stablization (see `with_rel_buf_opt`).)
+       * data_buffer: The current position of the input data buffer
+       * ref_buffer:  The current position of the input references buffer
+       * typtbl:      The type table, as returned by parse_idl_header
+       * typtbl_size: The size of the type table, used to limit recursion
+
+     It returns the value of type t (vanilla representation) or coercion_error_value,
+     It advances the data_buffer past the decoded value (even if it returns coercion_error_value!)
+
+  *)
+
+  (* symbolic names for arguments passed on RTS stack *)
+  module StackArgs = struct
+    let idltyp = 0l
+    let depth = 1l
+    let can_recover = 2l
+  end
+
+  let rec deserialize_go env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = "@deserialize_go<" ^ typ_hash t ^ ">" in
+    Func.share_code0 env name
+      [I32Type]
+      (fun env  ->
+      let get_idltyp = Stack.get_local env StackArgs.idltyp in
+      let get_depth = Stack.get_local env StackArgs.depth in
+      let get_can_recover = Stack.get_local env StackArgs.can_recover in
+      let get_rel_buf_opt = Registers.get_rel_buf_opt env in
+      let get_data_buf = Registers.get_data_buf env in
+      let _get_ref_buf = Registers.get_ref_buf env in
+      let get_typtbl = Registers.get_typtbl env in
+      let get_typtbl_end = Registers.get_typtbl_end env in
+      let get_typtbl_size = Registers.get_typtbl_size env in
+
+      (* Check recursion depth (protects against empty record etc.) *)
+      (* Factor 2 because at each step, the expected type could go through one
+         level of opt that is not present in the value type
+      *)
+      get_depth ^^
+      get_typtbl_size ^^ compile_add_const 1l ^^ compile_mul_const 2l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+      E.else_trap_with env ("IDL error: circular record read") ^^
+
+      (* Remember data buffer position, to detect progress *)
+      let (set_old_pos, get_old_pos) = new_local env "old_pos" in
+      ReadBuf.get_ptr get_data_buf ^^ set_old_pos ^^
+
+      let go' can_recover env t =
+        (* assumes idltyp on stack *)
+        Stack.with_frame env "frame_ptr" 3l (fun () ->
+          Stack.set_local env StackArgs.idltyp ^^
+          (* set up frame arguments *)
+          ( (* Reset depth counter if we made progress *)
+            ReadBuf.get_ptr get_data_buf ^^ get_old_pos ^^
+            G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+            G.if1 I32Type
+              (Stack.get_prev_local env 1l ^^ compile_add_const 1l)
+              (compile_unboxed_const 0l)
+            ) ^^
+          Stack.set_local env StackArgs.depth ^^
+          (if can_recover
+             then compile_unboxed_const 1l
+             else Stack.get_prev_local env 2l) ^^
+          Stack.set_local env StackArgs.can_recover ^^
+          deserialize_go env t)
+      in
+
+      let go = go' false in
+      let go_can_recover = go' true in
+
+      let skip get_typ =
+        get_data_buf ^^ get_typtbl ^^ get_typ ^^ compile_unboxed_const 0l ^^
+        E.call_import env "rts" "skip_any"
+      in
+
+      (* This flag is set to return a coercion error at the very end
+         We cannot use (G.i Return) for early exit, or we’d leak stack space,
+         as Stack.with_words is used to allocate scratch space.
+      *)
+      let (set_failed, get_failed) = new_local env "failed" in
+      let set_failure = compile_unboxed_const 1l ^^ set_failed in
+      let when_failed f = get_failed ^^ G.if0 f G.nop in
+
+      (* This looks at a value and if it is coercion_error_value, sets the failure flag.
+         This propagates the error out of arrays, records, etc.
+       *)
+      let remember_failure get_val =
+          get_val ^^ compile_eq_const (coercion_error_value env) ^^
+          G.if0 set_failure G.nop
+      in
+
+      (* This sets the failure flag and puts coercion_error_value on the stack *)
+      let coercion_failed msg =
+        (* If we know that there is no backtracking `opt t` around, then just trap.
+           This gives a better error message
+        *)
+        get_can_recover ^^ E.else_trap_with env msg ^^
+        set_failure ^^ compile_unboxed_const (coercion_error_value env) in
+
+      (* returns true if we are looking at primitive type with this id *)
+      let check_prim_typ t =
+        get_idltyp ^^
+        compile_eq_const (Int32.neg (Option.get (to_idl_prim t)))
+      in
+
+      let with_prim_typ t f =
+        check_prim_typ t ^^
+        G.if1 I32Type f
+          ( skip get_idltyp ^^
+            coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+          )
+      in
+
+      let read_byte_tagged = function
+        | [code0; code1] ->
+          ReadBuf.read_byte env get_data_buf ^^
+          let (set_b, get_b) = new_local env "b" in
+          set_b ^^
+          get_b ^^
+          compile_eq_const 0l ^^
+          G.if1 I32Type
+          begin code0
+          end begin
+            get_b ^^ compile_eq_const 1l ^^
+            E.else_trap_with env "IDL error: byte tag not 0 or 1" ^^
+            code1
+          end
+        | _ -> assert false; (* can be generalized later as needed *)
+      in
+
+      let read_blob () =
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+
+        get_len ^^ Blob.alloc env ^^ set_x ^^
+        get_x ^^ Blob.payload_ptr_unskewed env ^^
+        ReadBuf.read_blob env get_data_buf get_len ^^
+        get_x
+      in
+
+      let read_principal () =
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+
+        (* at most 29 bytes, according to
+           https://sdk.dfinity.org/docs/interface-spec/index.html#principal
+        *)
+        get_len ^^ compile_unboxed_const 29l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+        E.else_trap_with env "IDL error: principal too long" ^^
+
+        get_len ^^ Blob.alloc env ^^ set_x ^^
+        get_x ^^ Blob.payload_ptr_unskewed env ^^
+        ReadBuf.read_blob env get_data_buf get_len ^^
+        get_x
+      in
+
+      let read_text () =
+        let (set_len, get_len) = new_local env "len" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+        let (set_ptr, get_ptr) = new_local env "x" in
+        ReadBuf.get_ptr get_data_buf ^^ set_ptr ^^
+        ReadBuf.advance get_data_buf get_len ^^
+        (* validate *)
+        get_ptr ^^ get_len ^^ E.call_import env "rts" "utf8_validate" ^^
+        (* copy *)
+        get_ptr ^^ get_len ^^ Text.of_ptr_size env
+      in
+
+      let read_actor_data () =
+        read_byte_tagged
+          [ E.trap_with env "IDL error: unexpected actor reference"
+          ; read_principal ()
+          ]
+      in
+
+      (* returns true if get_arg_typ is a composite type of this id *)
+      let check_composite_typ get_arg_typ idl_tycon_id =
+        get_arg_typ ^^
+        compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        G.if1 I32Type
+        begin
+          ReadBuf.alloc env (fun get_typ_buf ->
+            (* Update typ_buf *)
+            ReadBuf.set_ptr get_typ_buf (
+              get_typtbl ^^
+              get_arg_typ ^^ compile_mul_const Heap.word_size ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+              load_unskewed_ptr
+            ) ^^
+            ReadBuf.set_end get_typ_buf (ReadBuf.get_end get_data_buf) ^^
+            (* read sleb128 *)
+            ReadBuf.read_sleb128 env get_typ_buf ^^
+            (* Check it is the expected value *)
+            compile_eq_const idl_tycon_id
+          )
+        end
+        (compile_unboxed_const 0l)
+      in
+
+
+      (* checks that arg_typ is positive, looks it up in the table,
+         creates a fresh typ_buf pointing into the type description,
+         reads the type constructor index and traps or fails if it is the wrong one.
+         and passes the typ_buf to a subcomputation to read the type arguments *)
+      let with_composite_arg_typ get_arg_typ idl_tycon_id f =
+        (* make sure index is not negative *)
+        get_arg_typ ^^
+        compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        G.if1 I32Type
+        begin
+          ReadBuf.alloc env (fun get_typ_buf ->
+            (* Update typ_buf *)
+            ReadBuf.set_ptr get_typ_buf (
+              get_typtbl ^^
+              get_arg_typ ^^ compile_mul_const Heap.word_size ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+              load_unskewed_ptr
+            ) ^^
+            ReadBuf.set_end get_typ_buf (ReadBuf.get_end get_data_buf) ^^
+            (* read sleb128 *)
+            ReadBuf.read_sleb128 env get_typ_buf ^^
+            (* Check it is the expected type constructor *)
+            compile_eq_const idl_tycon_id ^^
+            G.if1 I32Type
+            begin
+              f get_typ_buf
+            end
+            begin
+              skip get_arg_typ ^^
+              coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+            end
+          )
+        end
+        begin
+          skip get_arg_typ ^^
+          coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+        end
+      in
+
+      let with_composite_typ idl_tycon_id f =
+        with_composite_arg_typ get_idltyp idl_tycon_id f
+      in
+
+      let with_record_typ f = with_composite_typ idl_record (fun get_typ_buf ->
+        Stack.with_words env "get_n_ptr" 1l (fun get_n_ptr ->
+          get_n_ptr ^^
+          ReadBuf.read_leb128 env get_typ_buf ^^
+          store_unskewed_ptr ^^
+          f get_typ_buf get_n_ptr
+        )
+      ) in
+
+      let with_blob_typ env f =
+        with_composite_typ idl_vec (fun get_typ_buf ->
+          ReadBuf.read_sleb128 env get_typ_buf ^^
+          compile_eq_const (-5l) (* Nat8 *) ^^
+          G.if1 I32Type
+            f
+            begin
+              skip get_idltyp ^^
+              coercion_failed "IDL error: blob not a vector of nat8"
+            end
+        )
+      in
+
+      let read_alias env t read_thing =
+        (* see Note [mutable stable values] *)
+        let (set_is_ref, get_is_ref) = new_local env "is_ref" in
+        let (set_result, get_result) = new_local env "result" in
+        let (set_cur, get_cur) = new_local env "cur" in
+        let (set_memo, get_memo) = new_local env "memo" in
+
+        let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+        with_composite_typ idl_alias (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+
+        (* Find out if it is a reference or not *)
+        ReadBuf.read_byte env get_data_buf ^^ set_is_ref ^^
+
+        (* If it is a reference, temporarily set the read buffer to that place *)
+        get_is_ref ^^
+        G.if0 begin
+          let (set_offset, get_offset) = new_local env "offset" in
+          ReadBuf.read_word32 env get_data_buf ^^ set_offset ^^
+          (* A sanity check *)
+          get_offset ^^ compile_unboxed_const 0l ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+          E.else_trap_with env "Odd offset" ^^
+
+          ReadBuf.get_ptr get_data_buf ^^ set_cur ^^
+          ReadBuf.advance get_data_buf (get_offset ^^ compile_add_const (-4l))
+        end G.nop ^^
+
+        (* Remember location of ptr *)
+        ReadBuf.get_ptr get_data_buf ^^ set_memo ^^
+        (* Did we decode this already? *)
+        ReadBuf.read_word32 env get_data_buf ^^ set_result ^^
+        get_result ^^ compile_eq_const 0l ^^
+        G.if0 begin
+          (* No, not yet decoded *)
+          (* Skip over type hash field *)
+          ReadBuf.read_word32 env get_data_buf ^^ compile_eq_const 0l ^^
+          E.else_trap_with env "Odd: Type hash scratch space not empty" ^^
+
+          (* Read the content *)
+          read_thing get_arg_typ (fun get_thing ->
+            (* This is called after allocation, but before descending
+               We update the memo location here so that loops work
+            *)
+            get_thing ^^ set_result ^^
+            get_memo ^^ get_result ^^ store_unskewed_ptr ^^
+            get_memo ^^ compile_add_const 4l ^^ Blob.lit env (typ_hash t) ^^ store_unskewed_ptr
+          )
+        end begin
+          (* Decoded before. Check type hash *)
+          ReadBuf.read_word32 env get_data_buf ^^ Blob.lit env (typ_hash t) ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          E.else_trap_with env ("Stable memory error: Aliased at wrong type, expected: " ^ typ_hash t)
+        end ^^
+
+        (* If this was a reference, reset read buffer *)
+        get_is_ref ^^
+        G.if0 (ReadBuf.set_ptr get_data_buf get_cur) G.nop ^^
+
+        get_result
+      in
+
+
+      (* Now the actual deserialization *)
+      begin match t with
+      (* Primitive types *)
+      | Prim Nat ->
+        with_prim_typ t
+        begin
+          BigNum.compile_load_from_data_buf env get_data_buf false
+        end
+      | Prim Int ->
+        (* Subtyping with nat *)
+        check_prim_typ (Prim Nat) ^^
+        G.if1 I32Type
+          begin
+            BigNum.compile_load_from_data_buf env get_data_buf false
+          end
+          begin
+            with_prim_typ t
+            begin
+              BigNum.compile_load_from_data_buf env get_data_buf true
+            end
+          end
+      | Prim Float ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_float64 env get_data_buf ^^
+          Float.box env
+        end
+      | Prim (Int64|Nat64) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word64 env get_data_buf ^^
+          BoxedWord64.box env
+        end
+      | Prim (Int32|Nat32) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word32 env get_data_buf ^^
+          BoxedSmallWord.box env
+        end
+      | Prim Char ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word32 env get_data_buf ^^
+          TaggedSmallWord.check_and_tag_codepoint env
+        end
+      | Prim (Int16|Nat16) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word16 env get_data_buf ^^
+          TaggedSmallWord.msb_adjust Nat16
+        end
+      | Prim (Int8|Nat8) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_byte env get_data_buf ^^
+          TaggedSmallWord.msb_adjust Nat8
+        end
+      | Prim Bool ->
+        with_prim_typ t
+        begin
+          read_byte_tagged
+            [ Bool.lit false
+            ; Bool.lit true
+            ]
+        end
+      | Prim Null ->
+        with_prim_typ t (Opt.null_lit env)
+      | Any ->
+        skip get_idltyp ^^
+        (* Any vanilla value works here *)
+        Opt.null_lit env
+      | Prim Blob ->
+        with_blob_typ env (read_blob ())
+      | Prim Principal ->
+        with_prim_typ t
+        begin
+          read_byte_tagged
+            [ E.trap_with env "IDL error: unexpected principal reference"
+            ; read_principal ()
+            ]
+        end
+      | Prim Text ->
+        with_prim_typ t (read_text ())
+      | Tup [] -> (* e(()) = null *)
+        with_prim_typ t (Tuple.from_stack env 0)
+      (* Composite types *)
+      | Tup ts ->
+        with_record_typ (fun get_typ_buf get_n_ptr ->
+          let (set_val, get_val) = new_local env "val" in
+
+          G.concat_mapi (fun i t ->
+            (* skip all possible intermediate extra fields *)
+            get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ compile_unboxed_const (Int32.of_int i) ^^ get_n_ptr ^^
+            E.call_import env "rts" "find_field" ^^
+            G.if1 I32Type
+              begin
+                ReadBuf.read_sleb128 env get_typ_buf ^^
+                go env t ^^ set_val ^^
+                remember_failure get_val ^^
+                get_val
+              end
+              begin
+                match normalize t with
+                | Opt _ | Any -> Opt.null_lit env
+                | _ -> coercion_failed "IDL error: did not find tuple field in record"
+              end
+          ) ts ^^
+
+          (* skip all possible trailing extra fields *)
+          get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ get_n_ptr ^^
+          E.call_import env "rts" "skip_fields" ^^
+
+          Tuple.from_stack env (List.length ts)
+        )
+      | Obj ((Object | Memory), fs) ->
+        with_record_typ (fun get_typ_buf get_n_ptr ->
+          let (set_val, get_val) = new_local env "val" in
+
+          Object.lit_raw env (List.map (fun (h,f) ->
+            f.Type.lab, fun () ->
+              (* skip all possible intermediate extra fields *)
+              get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ compile_unboxed_const (Lib.Uint32.to_int32 h) ^^ get_n_ptr ^^
+              E.call_import env "rts" "find_field" ^^
+              G.if1 I32Type
+                begin
+                  ReadBuf.read_sleb128 env get_typ_buf ^^
+                  go env f.typ ^^ set_val ^^
+                  remember_failure get_val ^^
+                  get_val
+                  end
+                begin
+                  match normalize f.typ with
+                  | Opt _ | Any -> Opt.null_lit env
+                  | _ -> coercion_failed (Printf.sprintf "IDL error: did not find field %s in record" f.lab)
+                end
+          ) (sort_by_hash fs)) ^^
+
+          (* skip all possible trailing extra fields *)
+          get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ get_n_ptr ^^
+          E.call_import env "rts" "skip_fields"
+          )
+      | Array (Mut t) ->
+        read_alias env (Array (Mut t)) (fun get_array_typ on_alloc ->
+          let (set_len, get_len) = new_local env "len" in
+          let (set_x, get_x) = new_local env "x" in
+          let (set_val, get_val) = new_local env "val" in
+          let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+          with_composite_arg_typ get_array_typ idl_vec (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+          ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+          get_len ^^ Arr.alloc env ^^ set_x ^^
+          on_alloc get_x ^^
+          get_len ^^ from_0_to_n env (fun get_i ->
+            get_x ^^ get_i ^^ Arr.unsafe_idx env ^^
+            get_arg_typ ^^ go env t ^^ set_val ^^
+            remember_failure get_val ^^
+            get_val ^^ store_ptr
+          ) ^^
+          get_x ^^
+          Tagged.allocation_barrier env ^^
+          G.i Drop
+        )
+      | Array t ->
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        let (set_val, get_val) = new_local env "val" in
+        let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+        with_composite_typ idl_vec (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+        get_len ^^ Arr.alloc env ^^ set_x ^^
+        get_len ^^ from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^
+          get_arg_typ ^^ go env t ^^ set_val ^^
+          remember_failure get_val ^^
+          get_val ^^ store_ptr
+        ) ^^
+        get_x ^^
+        Tagged.allocation_barrier env
+      | Opt t ->
+        check_prim_typ (Prim Null) ^^
+        G.if1 I32Type (Opt.null_lit env)
+        begin
+          check_prim_typ Any ^^ (* reserved *)
+          G.if1 I32Type (Opt.null_lit env)
+          begin
+            check_composite_typ get_idltyp idl_opt ^^
+            G.if1 I32Type
+            begin
+              let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+              with_composite_typ idl_opt (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+              read_byte_tagged
+                [ Opt.null_lit env
+                ; let (set_val, get_val) = new_local env "val" in
+                  get_arg_typ ^^ go_can_recover env t ^^ set_val ^^
+                  get_val ^^ compile_eq_const (coercion_error_value env) ^^
+                  G.if1 I32Type
+                    (* decoding failed, but this is opt, so: return null *)
+                    (Opt.null_lit env)
+                    (* decoding succeeded, return opt value *)
+                    (Opt.inject env get_val)
+                ]
+            end
+            begin
+              (* this check corresponds to `not (null <: <t>)` in the spec *)
+              match normalize t with
+              | Prim Null | Opt _ | Any ->
+                (* Ignore and return null *)
+                skip get_idltyp ^^
+                Opt.null_lit env
+              | _ ->
+                (* Try constituent type *)
+                let (set_val, get_val) = new_local env "val" in
+                get_idltyp ^^ go_can_recover env t ^^ set_val ^^
+                get_val ^^ compile_eq_const (coercion_error_value env) ^^
+                G.if1 I32Type
+                  (* decoding failed, but this is opt, so: return null *)
+                  (Opt.null_lit env)
+                  (* decoding succeeded, return opt value *)
+                  (Opt.inject env get_val)
+            end
+          end
+        end
+      | Variant vs ->
+        let (set_val, get_val) = new_local env "val" in
+        with_composite_typ idl_variant (fun get_typ_buf ->
+          (* Find the tag *)
+          let (set_n, get_n) = new_local env "len" in
+          ReadBuf.read_leb128 env get_typ_buf ^^ set_n ^^
+
+          let (set_tagidx, get_tagidx) = new_local env "tagidx" in
+          ReadBuf.read_leb128 env get_data_buf ^^ set_tagidx ^^
+
+          get_tagidx ^^ get_n ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+          E.else_trap_with env "IDL error: variant index out of bounds" ^^
+
+          (* Zoom past the previous entries *)
+          get_tagidx ^^ from_0_to_n env (fun _ ->
+            get_typ_buf ^^ E.call_import env "rts" "skip_leb128" ^^
+            get_typ_buf ^^ E.call_import env "rts" "skip_leb128"
+          ) ^^
+
+          (* Now read the tag *)
+          let (set_tag, get_tag) = new_local env "tag" in
+          ReadBuf.read_leb128 env get_typ_buf ^^ set_tag ^^
+          let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+          ReadBuf.read_sleb128 env get_typ_buf ^^ set_arg_typ ^^
+
+          List.fold_right (fun (h, {lab = l; typ = t; _}) continue ->
+              get_tag ^^ compile_eq_const (Lib.Uint32.to_int32 h) ^^
+              G.if1 I32Type
+                ( Variant.inject env l (
+                  get_arg_typ ^^ go env t ^^ set_val ^^
+                  remember_failure get_val ^^
+                  get_val
+                ))
+                continue
+            )
+            ( sort_by_hash vs )
+            ( coercion_failed "IDL error: unexpected variant tag" )
+        )
+      | Func _ ->
+        (* See Note [Candid subtype checks] *)
+        get_rel_buf_opt ^^
+        G.if1 I32Type
+          begin
+            get_rel_buf_opt ^^
+            get_typtbl ^^
+            get_typtbl_end ^^
+            get_typtbl_size ^^
+            get_idltyp ^^
+            idl_sub env t
+          end
+          (Bool.lit true) ^^ (* if we don't have a subtype memo table, assume the types are ok *)
+        G.if1 I32Type
+          (with_composite_typ idl_func (fun _get_typ_buf ->
+            read_byte_tagged
+              [ E.trap_with env "IDL error: unexpected function reference"
+              ; read_actor_data () ^^
+                read_text () ^^
+                Tuple.from_stack env 2
+              ]))
+          (skip get_idltyp ^^
+           coercion_failed "IDL error: incompatible function type")
+      | Obj (Actor, _) ->
+        (* See Note [Candid subtype checks] *)
+        get_rel_buf_opt ^^
+        G.if1 I32Type
+          begin
+            get_rel_buf_opt ^^
+            get_typtbl ^^
+            get_typtbl_end ^^
+            get_typtbl_size ^^
+            get_idltyp ^^
+            idl_sub env t
+          end
+          (Bool.lit true) ^^
+        G.if1 I32Type
+          (with_composite_typ idl_service
+             (fun _get_typ_buf -> read_actor_data ()))
+          (skip get_idltyp ^^
+           coercion_failed "IDL error: incompatible actor type")
+      | Mut t ->
+        read_alias env (Mut t) (fun get_arg_typ on_alloc ->
+          let (set_result, get_result) = new_local env "result" in
+          Tagged.obj env Tagged.ObjInd [ compile_unboxed_const 0l ] ^^ set_result ^^
+          on_alloc get_result ^^
+          get_result ^^
+            get_arg_typ ^^ go env t ^^
+          MutBox.store_field env
+        )
+      | Non ->
+        skip get_idltyp ^^
+        coercion_failed "IDL error: deserializing value of type None"
+      | _ -> todo_trap env "deserialize" (Arrange_ir.typ t)
+      end ^^
+      (* Parsed value on the stack, return that, unless the failure flag is set *)
+      when_failed (compile_unboxed_const (coercion_error_value env) ^^ G.i Return)
+    )
+
+  let serialize env ts : G.t =
+    let name = Strm.name_for "serialize" ts in
+    (* returns data/length pointers (will be GC’ed next time!) *)
+    Func.share_code1 env name ("x", I32Type) [I32Type; I32Type] (fun env get_x ->
+      let (set_data_size, get_data_size) = new_local env "data_size" in
+      let (set_refs_size, get_refs_size) = new_local env "refs_size" in
+
+      let (tydesc, _offsets, _idltyps) = type_desc env ts in
+      let tydesc_len = Int32.of_int (String.length tydesc) in
+
+      (* Get object sizes *)
+      get_x ^^
+      buffer_size env (Type.seq ts) ^^
+      set_refs_size ^^
+      set_data_size ^^
+      (* check for overflow *)
+      get_data_size ^^
+      compile_add_const tydesc_len ^^
+      compile_unboxed_const tydesc_len ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      E.then_trap_with env "serialization overflow" ^^
+
+      let (set_data_start, get_data_start) = new_local env "data_start" in
+      let (set_refs_start, get_refs_start) = new_local env "refs_start" in
+
+      (* Create a stream with suitable capacity and given header *)
+      Strm.create env get_data_size set_data_start get_data_start tydesc ^^
+      get_refs_size ^^ compile_mul_const Heap.word_size ^^ Blob.dyn_alloc_scratch env ^^ set_refs_start ^^
+
+      (* Serialize x into the buffer *)
+      get_x ^^
+      get_data_start ^^
+      get_refs_start ^^
+      serialize_go env (Type.seq ts) ^^
+
+      (* Sanity check: Did we fill exactly the buffer *)
+      get_refs_start ^^ get_refs_size ^^ compile_mul_const Heap.word_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+      E.else_trap_with env "reference buffer not filled" ^^
+
+      (* Verify that the stream is correctly filled *)
+      Strm.check_filled env get_data_start get_data_size ^^
+      get_refs_size ^^
+      compile_eq_const 0l ^^
+      E.else_trap_with env "cannot send references on IC System API" ^^
+
+      (* Extract the payload if possible *)
+      Strm.terminate env get_data_start get_data_size tydesc_len
+    )
+
+
+  let deserialize_from_blob extended env ts =
+    let ts_name = typ_seq_hash ts in
+    let name =
+      (* TODO(#3185): this specialization on `extended` seems redundant,
+         removing it might simplify things *and* share more code in binaries.
+         The only tricky bit might be the conditional Stack.dynamic_with_words bit... *)
+      if extended
+      then "@deserialize_extended<" ^ ts_name ^ ">"
+      else "@deserialize<" ^ ts_name ^ ">" in
+    Func.share_code2 env name (("blob", I32Type), ("can_recover", I32Type)) (List.map (fun _ -> I32Type) ts) (fun env get_blob get_can_recover ->
+      let (set_data_size, get_data_size) = new_local env "data_size" in
+      let (set_refs_size, get_refs_size) = new_local env "refs_size" in
+      let (set_data_start, get_data_start) = new_local env "data_start" in
+      let (set_refs_start, get_refs_start) = new_local env "refs_start" in
+      let (set_arg_count, get_arg_count) = new_local env "arg_count" in
+      let (set_val, get_val) = new_local env "val" in
+
+      get_blob ^^ Blob.len env ^^ set_data_size ^^
+      get_blob ^^ Blob.payload_ptr_unskewed env ^^ set_data_start ^^
+
+      (* Allocate space for the reference buffer and copy it *)
+      compile_unboxed_const 0l ^^ set_refs_size (* none yet *) ^^
+
+      (* Allocate space for out parameters of parse_idl_header *)
+      Stack.with_words env "get_typtbl_size_ptr" 1l (fun get_typtbl_size_ptr ->
+      Stack.with_words env "get_typtbl_ptr" 1l (fun get_typtbl_ptr ->
+      Stack.with_words env "get_maintyps_ptr" 1l (fun get_maintyps_ptr ->
+
+      (* Set up read buffers *)
+      ReadBuf.alloc env (fun get_data_buf -> ReadBuf.alloc env (fun get_ref_buf ->
+
+      ReadBuf.set_ptr get_data_buf get_data_start ^^
+      ReadBuf.set_size get_data_buf get_data_size ^^
+      ReadBuf.set_ptr get_ref_buf get_refs_start ^^
+      ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^
+
+      (* Go! *)
+      Bool.lit extended ^^ get_data_buf ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^
+      E.call_import env "rts" "parse_idl_header" ^^
+
+      (* Allocate memo table, if necessary *)
+      with_rel_buf_opt env extended (get_typtbl_size_ptr ^^ load_unskewed_ptr) (fun get_rel_buf_opt ->
+
+      (* set up a dedicated read buffer for the list of main types *)
+      ReadBuf.alloc env (fun get_main_typs_buf ->
+        ReadBuf.set_ptr get_main_typs_buf (get_maintyps_ptr ^^ load_unskewed_ptr) ^^
+        ReadBuf.set_end get_main_typs_buf (ReadBuf.get_end get_data_buf) ^^
+        ReadBuf.read_leb128 env get_main_typs_buf ^^ set_arg_count ^^
+
+        G.concat_map (fun t ->
+          let can_recover, default_or_trap = Type.(
+            match normalize t with
+            | Opt _ | Any ->
+              (Bool.lit true, fun msg -> Opt.null_lit env)
+            | _ ->
+              (get_can_recover, fun msg ->
+                get_can_recover ^^
+                G.if1 I32Type
+                   (compile_unboxed_const (coercion_error_value env))
+                   (E.trap_with env msg)))
+          in
+          get_arg_count ^^
+          compile_eq_const 0l ^^
+          G.if1 I32Type
+           (default_or_trap ("IDL error: too few arguments " ^ ts_name))
+           (begin
+              begin
+                (* set up invariant register arguments *)
+                get_rel_buf_opt ^^ Registers.set_rel_buf_opt env ^^
+                get_data_buf ^^ Registers.set_data_buf env ^^
+                get_ref_buf ^^ Registers.set_ref_buf env ^^
+                get_typtbl_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl env ^^
+                get_maintyps_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl_end env ^^
+                get_typtbl_size_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl_size env
+              end ^^
+              (* set up variable frame arguments *)
+              Stack.with_frame env "frame_ptr" 3l (fun () ->
+                (* idltyp *)
+                ReadBuf.read_sleb128 env get_main_typs_buf ^^
+                Stack.set_local env StackArgs.idltyp ^^
+                (* depth *)
+                compile_unboxed_const 0l ^^
+                Stack.set_local env StackArgs.depth ^^
+                (* recovery mode *)
+                can_recover ^^
+                Stack.set_local env StackArgs.can_recover ^^
+                deserialize_go env t
+             )
+             ^^ set_val ^^
+             get_arg_count ^^ compile_sub_const 1l ^^ set_arg_count ^^
+             get_val ^^ compile_eq_const (coercion_error_value env) ^^
+             (G.if1 I32Type
+               (default_or_trap "IDL error: coercion failure encountered")
+               get_val)
+            end)
+        ) ts ^^
+
+        (* Skip any extra arguments *)
+        compile_while env
+         (get_arg_count ^^ compile_rel_const I32Op.GtU 0l)
+         begin
+           get_data_buf ^^
+           get_typtbl_ptr ^^ load_unskewed_ptr ^^
+           ReadBuf.read_sleb128 env get_main_typs_buf ^^
+           compile_unboxed_const 0l ^^
+           E.call_import env "rts" "skip_any" ^^
+           get_arg_count ^^ compile_sub_const 1l ^^ set_arg_count
+         end ^^
+
+        ReadBuf.is_empty env get_data_buf ^^
+        E.else_trap_with env ("IDL error: left-over bytes " ^ ts_name) ^^
+        ReadBuf.is_empty env get_ref_buf ^^
+        E.else_trap_with env ("IDL error: left-over references " ^ ts_name)
+      ))))))
+
+    ))
+
+  let deserialize env ts =
+    IC.arg_data env ^^
+    Bool.lit false ^^ (* can't recover *)
+    deserialize_from_blob false env ts
+
+(*
+Note [speculating for short (S)LEB encoded bignums]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+#3098 highlighted that a lot of heap garbage can be generated while reading in
+(S)LEB-encoded bignums. To make heap consumption optimal for every compactly
+representable `Int`, we resort to speculatively reading a 64-byte chunk from
+the `ReadBuf`. We call it speculative, because it may read past the end of the
+buffer (and thus end up containing junk bytes) or even fail because reading
+across Wasm page boundaries could cause trapping. (Consider the buffer ending
+3 bytes before the last-memory-page boundary and issuing a speculative 64-bit read for the
+address 2 bytes less than buffer end.) In case of failure to read data, `-1`
+(a sentinel) is returned. (The sentinel could be use-case specific when later
+the need arises.)
+
+In most cases the speculative read will come back with valid bytes. How many
+of those are relevant, can be judged by consulting the buffer-end pointer or
+analysing the 64-bit word directly. In the case of (S)LEB, the continuation and
+termination bits can be filtered and thus the encoding's last byte detected when
+present in the 64-bit word.
+
+If such a LEB boundary is detected, avenues open up for a much faster (than
+bytewise-sequential) parsing.
+
+After the data is interpreted, it's the client's responsibility to adjust the
+current buffer position.
+
+ *)
+
+(*
+Note [mutable stable values]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We currently use a Candid derivative to serialize stable values. In addition to
+storing sharable data, we can also store mutable data (records with mutable
+fields and mutable arrays), and we need to preserve aliasing.
+
+To that end we extend Candid with a type constructor `alias t`.
+
+In the type table, alias t is represented by type code 1. All Candid type constructors
+are represented by negative numbers, so this cannot clash with anything and,
+conveniently, makes such values illegal Candid.
+
+The values of `alias t` are either
+
+ * i8(0) 0x00000000 0x00000000 M(v)
+   for one (typically the first) occurrence of v
+   The first 0x00000000 is the “memo field”, the second is the “type hash field”.
+   Both are scratch spaces for the benefit of the decoder.
+
+or
+
+ * i8(1) i32(offset) M(v)
+   for all other occurrences of v, where offset is the relative position of the
+   above occurrences from this reference.
+
+We map Motoko types to this as follows:
+
+  e([var t]) = alias e([t]) = alias vec e(t)
+  e({var field : t}) = record { field : alias e(t) }
+
+Why different? Because we need to alias arrays as a whole (we can’t even alias
+their fields, as they are manifestly part of the array heap structure), but
+aliasing records does not work, as aliased record values may appear at
+different types (due to subtyping), and Candid serialization is type-driven.
+Luckily records put all mutable fields behind an indirection (ObjInd), so this
+works.
+
+The type-driven code in this module treats `Type.Mut` to always refer to an
+`ObjInd`; for arrays the mutable case is handled directly.
+
+To detect and preserve aliasing, these steps are taken:
+
+ * In `buffer_size`, when we see a mutable thing (`Array` or `ObjInd`), the
+   first time, we mark it by setting the heap tag to `StableSeen`.
+   This way, when we see it a second time, we can skip the value in the size
+   calculation.
+ * In `serialize`, when we see it a first time (tag still `StableSeen`),
+   we serialize it (first form above), and remember the absolute position
+   in the output buffer, abusing the heap tag here.
+   (Invariant: This absolute position is never `StableSeen`)
+   Upon a second visit (tag not `StableSeen`), we can thus fetch that absolute
+   position and calculate the offset.
+ * In `deserialize`, when we come across a `alias t`, we follow the offset (if
+   needed) to find the content.
+
+   If the memo field is still `0x00000000`, this is the first time we read
+   this, so we deserialize to the Motoko heap, and remember the heap position
+   (vanilla pointer) by overwriting the memo field.
+   We also store the type hash of the type we are serializing at in the type
+   hash field.
+
+   If it is not `0x00000000` then we can simply read the pointer from there,
+   after checking the type hash field to make sure we are aliasing at the same
+   type.
+
+ *)
+
+(*
+Note [Candid subtype checks]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Deserializing Candid values requires a Candid subtype check when
+deserializing values of reference types (actors and functions).
+
+The subtype test is performed directly on the expected and actual
+candid type tables using RTS functions `idl_sub_buf_words`,
+`idl_sub_buf_init` and `idl_sub`.  One type table and vector of types
+is generated statically from the list of statically known types
+encountered during code generation, the other is determined
+dynamically by, e.g. message payload. The latter will vary with
+each payload to decode.
+
+The known Motoko types are accumulated in a global list as required
+and then, in a final compilation step, encoded to global type table
+and sequence of type indices. The encoding is stored as static
+data referenced by dedicated wasm globals so that we can generate
+code that references the globals before their final definitions are
+known.
+
+Deserializing a proper (not extended) Candid value stack allocates a
+mutable word buffer, of size determined by `idl_sub_buf_words`.
+The word buffer is used to initialize and provide storage for a
+Rust memo table (see bitrel.rs) memoizing the result of sub and
+super type tests performed during deserialization of a given Candid
+value sequence.  The memo table is initialized once, using `idl_sub_buf_init`,
+then shared between recursive calls to deserialize, by threading the (possibly
+null) wasm address of the word buffer as an optional argument.  The
+word buffer is stack allocated in generated code, not Rust, because
+it's size is dynamic and Rust doesn't seem to support dynamically-sized
+stack allocation.
+
+Currently, we only perform Candid subtype checks when decoding proper
+(not extended) Candid values. Extended values are required for
+stable variables only: we can omit the check, because compatibility
+should already be enforced by the static signature compatibility
+check.  We use the `null`-ness of the word buffer pointer to
+dynamically determine whether to omit or perform Candid subtype checks.
+
+NB: Extending `idl_sub` to support extended, "stable" types (with mutable,
+invariant type constructors) would require extending the polarity argument
+from a Boolean to a three-valued argument to efficiently check equality for
+invariant type constructors in a single pass.
+*)
+
+end (* MakeSerialization *)
+
+module Serialization = MakeSerialization(BumpStream)
+
+module BlobStream : Stream = struct
+  let create env get_data_size set_token get_token header =
+    let header_size = Int32.of_int (String.length header) in
+    get_data_size ^^ compile_add_const header_size ^^
+    E.call_import env "rts" "alloc_stream" ^^ set_token ^^ (* allocation barrier called in alloc_stream *)
+    get_token ^^
+    Blob.lit env header ^^
+    E.call_import env "rts" "stream_write_text"
+
+  let check_filled env get_token get_data_size =
+    G.i Drop
+
+  let terminate env get_token _get_data_size _header_size =
+    get_token ^^ E.call_import env "rts" "stream_split" ^^
+    let set_blob, get_blob = new_local env "blob" in
+    set_blob ^^
+    get_blob ^^ Blob.payload_ptr_unskewed env ^^
+    get_blob ^^ Blob.len env
+
+  let finalize_buffer code = code
+
+  let name_for fn_name ts = "@Bl_" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+  let absolute_offset env get_token =
+    let offset = 8l in (* see invariant in `stream.rs` *)
+    let filled_field = Int32.add (Blob.len_field env) offset in
+    get_token ^^ Tagged.load_field_unskewed env filled_field
+
+  let checkpoint _env _get_token = G.i Drop
+
+  let reserve env get_token bytes =
+    get_token ^^ compile_unboxed_const bytes ^^ E.call_import env "rts" "stream_reserve"
+
+  let write_word_leb env get_token code =
+    let set_word, get_word = new_local env "word" in
+    code ^^ set_word ^^
+    I32Leb.compile_store_to_data_buf_unsigned env get_word
+      (get_token ^^ I32Leb.compile_leb128_size get_word ^^ E.call_import env "rts" "stream_reserve") ^^
+    G.i Drop
+
+  let write_word_32 env get_token code =
+    reserve env get_token Heap.word_size ^^
+    code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = None})
+
+  let write_byte env get_token code =
+    get_token ^^ code ^^
+    E.call_import env "rts" "stream_write_byte"
+
+  let write_blob env get_token get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Blob.len env ^^ set_len ^^
+    write_word_leb env get_token get_len ^^
+    get_token ^^
+    get_x ^^ Blob.payload_ptr_unskewed env ^^
+    get_len ^^
+    E.call_import env "rts" "stream_write"
+
+  let write_text env get_token get_x =
+    write_word_leb env get_token (get_x ^^ Text.size env) ^^
+    get_token ^^ get_x ^^
+    E.call_import env "rts" "stream_write_text"
+
+  let write_bignum_leb env get_token get_x =
+    get_token ^^ get_x ^^
+    BigNum.compile_store_to_stream_unsigned env
+
+  let write_bignum_sleb env get_token get_x =
+    get_token ^^ get_x ^^
+    BigNum.compile_store_to_stream_signed env
+
+end
+
+
+(* Stabilization (serialization to/from stable memory) of both:
+   * stable variables; and
+   * virtual stable memory.
+   c.f.
+   * ../../design/Stable.md
+   * ../../design/StableMemory.md
+*)
+
+module Stabilization = struct
+
+  let extend64 code = code ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+
+  (* The below stream implementation is geared towards the
+     tail section of stable memory, where the serialised
+     stable variables go. As such a few intimate details of
+     the stable memory layout are burnt in, such as the
+     variable `N` from the design document. *)
+  module StableMemoryStream : Stream = struct
+    include BlobStream
+
+    let name_for fn_name ts = "@Sm_" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+    let create env get_data_size set_token get_token header =
+      create env (compile_unboxed_const 0x8000l) set_token get_token header ^^
+        (* TODO: push header directly? *)
+
+      let (set_len, get_len) = new_local env "len" in
+      get_data_size ^^
+      compile_add_const (Int32.of_int (String.length header)) ^^
+      set_len ^^
+
+      let (set_dst, get_dst) = new_local64 env "dst" in
+      StableMem.get_mem_size env ^^
+      compile_shl64_const (Int64.of_int page_size_bits) ^^
+      compile_add64_const 4L ^^ (* `N` is now on the stack *)
+      set_dst ^^
+
+      get_dst ^^
+      extend64 get_len ^^
+      StableMem.ensure env ^^
+
+      get_token ^^
+      get_dst ^^
+      get_dst ^^ extend64 get_len ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+      E.call_import env "rts" "stream_stable_dest"
+
+    let ptr64_field env = 
+      let offset = 1l in (* see invariant in `stream.rs` *)
+      Int32.add (Blob.len_field env) offset (* see invariant in `stream.rs`, padding for 64-bit after Stream header *)
+
+    let terminate env get_token get_data_size header_size =
+      get_token ^^
+      E.call_import env "rts" "stream_shutdown" ^^
+      compile_unboxed_zero ^^ (* no need to write *)
+      get_token ^^
+      Tagged.load_field64_unskewed env (ptr64_field env) ^^
+      StableMem.get_mem_size env ^^
+      compile_shl64_const (Int64.of_int page_size_bits) ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      compile_sub64_const 4L ^^  (* `N` is now subtracted *)
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+
+    let finalize_buffer _ = G.nop (* everything is outputted already *)
+
+    (* Returns a 32-bit unsigned int that is the number of bytes that would
+       have been written to stable memory if flushed. The difference
+       of two such numbers will always be an exact byte distance. *)
+    let absolute_offset env get_token =
+      let start64_field = Int32.add (ptr64_field env) 2l in (* see invariant in `stream.rs` *)
+      absolute_offset env get_token ^^
+      get_token ^^
+      Tagged.load_field64_unskewed env (ptr64_field env) ^^
+      get_token ^^
+      Tagged.load_field64_unskewed env start64_field ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+  end
+
+  module Externalization = MakeSerialization(StableMemoryStream)
+
+  let stabilize env t =
+    let (set_dst, get_dst) = new_local env "dst" in
+    let (set_len, get_len) = new_local env "len" in
+
+    (if !Flags.gc_strategy = Flags.Incremental then
+      E.call_import env "rts" "stop_gc_on_upgrade"
+    else
+      G.nop) ^^
+
+
+    Externalization.serialize env [t] ^^
+    set_len ^^
+    set_dst ^^
+
+    StableMem.get_mem_size env ^^
+    G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+    G.if0
+      begin (* ensure [0,..,3,...len+4) *)
+        compile_const_64 0L ^^
+        extend64 get_len ^^
+        compile_add64_const 4L ^^  (* reserve one word for size *)
+        StableMem.ensure env ^^
+
+        (* write len to initial word of stable memory*)
+        compile_const_64 0L ^^
+        get_len ^^
+        StableMem.write_word32 env ^^
+
+        (* copy data to following stable memory *)
+        Externalization.Strm.finalize_buffer
+          begin
+            compile_const_64 4L ^^
+            extend64 get_dst ^^
+            extend64 get_len ^^
+            IC.system_call env "stable64_write"
+          end
+      end
+      begin
+        let (set_N, get_N) = new_local64 env "N" in
+
+        (* let N = !size * page_size *)
+        StableMem.get_mem_size env ^^
+        compile_shl64_const (Int64.of_int page_size_bits) ^^
+        set_N ^^
+
+        (* grow mem to page including address
+           N + 4 + len + 4 + 4 + 4 = N + len + 16
+        *)
+        get_N ^^
+        extend64 get_len ^^
+        compile_add64_const 16L ^^
+        StableMem.ensure env ^^
+
+        get_N ^^
+        get_len ^^
+        StableMem.write_word32 env ^^
+
+        (* copy data to following stable memory *)
+        Externalization.Strm.finalize_buffer
+          begin
+            get_N ^^
+            compile_add64_const 4L ^^
+            extend64 get_dst ^^
+            extend64 get_len ^^
+            IC.system_call env "stable64_write"
+          end ^^
+
+        (* let M = pagesize * ic0.stable64_size64() - 1 *)
+        (* M is beginning of last page *)
+        let (set_M, get_M) = new_local64 env "M" in
+        IC.system_call env "stable64_size" ^^
+        compile_sub64_const 1L ^^
+        compile_shl64_const (Int64.of_int page_size_bits) ^^
+        set_M ^^
+
+        (* store mem_size at M + (pagesize - 12) *)
+        get_M ^^
+        compile_add64_const (Int64.sub page_size64 12L) ^^
+        StableMem.get_mem_size env ^^
+        G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+        (* TODO: write word64 *)
+        StableMem.write_word32 env ^^
+
+        (* save first word at M + (pagesize - 8);
+           mark first word as 0 *)
+        get_M ^^
+        compile_add64_const (Int64.sub page_size64 8L) ^^
+        compile_const_64 0L ^^
+        StableMem.read_and_clear_word32 env ^^
+        StableMem.write_word32 env ^^
+
+        (* save version at M + (pagesize - 4) *)
+        get_M ^^
+          compile_add64_const (Int64.sub page_size64 4L) ^^
+        (* TODO bump version? *)
+        compile_unboxed_const StableMem.version ^^
+        StableMem.write_word32 env
+
+      end
+
+  let destabilize env ty =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      let (set_pages, get_pages) = new_local64 env "pages" in
+      IC.system_call env "stable64_size" ^^
+      set_pages ^^
+
+      get_pages ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      G.if1 I32Type
+        begin
+          let (_, fs) = Type.as_obj ty in
+          let fs' = List.map
+           (fun f -> (f.Type.lab, fun () -> Opt.null_lit env))
+           fs
+          in
+          StableMem.get_mem_size env ^^
+          G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          E.else_trap_with env "StableMem.mem_size non-zero" ^^
+          Object.lit_raw env fs'
+        end
+        begin
+          let (set_marker, get_marker) = new_local env "marker" in
+          let (set_len, get_len) = new_local env "len" in
+          let (set_offset, get_offset) = new_local64 env "offset" in
+          compile_const_64 0L ^^
+          StableMem.read_and_clear_word32 env ^^
+          set_marker ^^
+
+          get_marker ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+          G.if0
+            begin
+              let (set_M, get_M) = new_local64 env "M" in
+              let (set_version, get_version) = new_local env "version" in
+              let (set_N, get_N) = new_local64 env "N" in
+
+              IC.system_call env "stable64_size" ^^
+              compile_sub64_const 1L ^^
+              compile_shl64_const (Int64.of_int page_size_bits) ^^
+              set_M ^^
+
+              (* read version *)
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 4L) ^^
+              StableMem.read_and_clear_word32 env ^^
+              set_version ^^
+
+              (* check version *)
+              get_version ^^
+              compile_unboxed_const StableMem.version ^^
+              G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+              E.then_trap_with env (Printf.sprintf
+                "higher stable memory version (expected %s)"
+                (Int32.to_string StableMem.version)) ^^
+
+              (* restore StableMem bytes [0..4) *)
+              compile_const_64 0L ^^
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 8L) ^^
+              StableMem.read_and_clear_word32 env ^^
+              StableMem.write_word32 env ^^
+
+              (* restore mem_size *)
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 12L) ^^
+              extend64 (StableMem.read_and_clear_word32 env) ^^ (*TODO: use 64 bits *)
+              StableMem.set_mem_size env ^^
+
+              StableMem.get_mem_size env ^^
+              compile_shl64_const (Int64.of_int page_size_bits) ^^
+              set_N ^^
+
+              (* set len *)
+              get_N ^^
+              StableMem.read_and_clear_word32 env ^^
+              set_len ^^
+
+              (* set offset *)
+              get_N ^^
+              compile_add64_const 4L ^^
+              set_offset
+            end
+            begin
+              (* assert mem_size == 0 *)
+              StableMem.get_mem_size env ^^
+              G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+              E.else_trap_with env "unexpected, non-zero stable memory size" ^^
+
+              (* set len *)
+              get_marker ^^
+              set_len ^^
+
+              (* set offset *)
+              compile_const_64 4L ^^
+              set_offset
+            end ^^ (* if_ *)
+
+          let (set_blob, get_blob) = new_local env "blob" in
+          (* read blob from stable memory *)
+          get_len ^^ Blob.alloc env ^^ set_blob ^^
+          extend64 (get_blob ^^ Blob.payload_ptr_unskewed env) ^^
+          get_offset ^^
+          extend64 get_len ^^
+          IC.system_call env "stable64_read" ^^
+
+          let (set_val, get_val) = new_local env "val" in
+          (* deserialize blob to val *)
+          get_blob ^^
+          Bool.lit false ^^ (* can't recover *)
+          Serialization.deserialize_from_blob true env [ty] ^^
+          set_val ^^
+
+          (* clear blob contents *)
+          get_blob ^^
+          Blob.clear env ^^
+
+          (* copy zeros from blob to stable memory *)
+          get_offset ^^
+          extend64 (get_blob ^^ Blob.payload_ptr_unskewed env) ^^
+          extend64 (get_blob ^^ Blob.len env) ^^
+          IC.system_call env "stable64_write" ^^
+
+          (* return val *)
+          get_val
+        end
+    | _ -> assert false
+end
+
+module GCRoots = struct
+  let register env static_roots =
+
+    let get_static_roots = E.add_fun env "get_static_roots" (Func.of_body env [] [I32Type] (fun env ->
+      compile_unboxed_const static_roots
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "get_static_roots";
+      edesc = nr (FuncExport (nr get_static_roots))
+    })
+
+  let store_static_roots env =
+    Arr.vanilla_lit env (E.get_static_roots env)
+
+end (* GCRoots *)
+
+module StackRep = struct
+  open SR
+
+  (*
+     Most expressions have a “preferred”, most optimal, form. Hence,
+     compile_exp put them on the stack in that form, and also returns
+     the form it chose.
+
+     But the users of compile_exp usually want a specific form as well.
+     So they use compile_exp_as, indicating the form they expect.
+     compile_exp_as then does the necessary coercions.
+   *)
+
+  let of_arity n =
+    if n = 1 then Vanilla else UnboxedTuple n
+
+  (* The stack rel of a primitive type, i.e. what the binary operators expect *)
+  let of_type t =
+    let open Type in
+    match normalize t with
+    | Prim Bool -> SR.bool
+    | Prim (Nat | Int) -> Vanilla
+    | Prim (Nat64 | Int64) -> UnboxedWord64
+    | Prim (Nat32 | Int32) -> UnboxedWord32
+    | Prim (Nat8 | Nat16 | Int8 | Int16 | Char) -> Vanilla
+    | Prim (Text | Blob | Principal) -> Vanilla
+    | Prim Float -> UnboxedFloat64
+    | Obj (Actor, _) -> Vanilla
+    | Func (Shared _, _, _, _, _) -> Vanilla
+    | p -> todo "StackRep.of_type" (Arrange_ir.typ p) Vanilla
+
+  (* The env looks unused, but will be needed once we can use multi-value, to register
+     the complex types in the environment.
+     For now, multi-value block returns are handled via FakeMultiVal. *)
+  let to_block_type env = function
+    | Vanilla -> [I32Type]
+    | UnboxedWord64 -> [I64Type]
+    | UnboxedWord32 -> [I32Type]
+    | UnboxedFloat64 -> [F64Type]
+    | UnboxedTuple n -> Lib.List.make n I32Type
+    | Const _ -> []
+    | Unreachable -> []
+
+  let to_string = function
+    | Vanilla -> "Vanilla"
+    | UnboxedWord64 -> "UnboxedWord64"
+    | UnboxedWord32 -> "UnboxedWord32"
+    | UnboxedFloat64 -> "UnboxedFloat64"
+    | UnboxedTuple n -> Printf.sprintf "UnboxedTuple %d" n
+    | Unreachable -> "Unreachable"
+    | Const _ -> "Const"
+
+  let join (sr1 : t) (sr2 : t) = match sr1, sr2 with
+    | _, _ when SR.eq sr1 sr2 -> sr1
+    | Unreachable, sr2 -> sr2
+    | sr1, Unreachable -> sr1
+
+    | Const _, Const _ -> Vanilla
+    | Const _, sr2_ -> sr2
+    | sr1, Const _ -> sr1
+
+    | _, Vanilla -> Vanilla
+    | Vanilla, _ -> Vanilla
+
+    | UnboxedTuple n, UnboxedTuple m when n = m -> sr1
+
+    | _, _ ->
+      Printf.eprintf "Invalid stack rep join (%s, %s)\n"
+        (to_string sr1) (to_string sr2); sr1
+
+  let joins = List.fold_left join Unreachable
+
+  let drop env (sr_in : t) =
+    match sr_in with
+    | Vanilla | UnboxedWord64 | UnboxedWord32 | UnboxedFloat64 -> G.i Drop
+    | UnboxedTuple n -> G.table n (fun _ -> G.i Drop)
+    | Const _ | Unreachable -> G.nop
+
+  (* Materializes a Const.lit: If necessary, puts
+     bytes into static memory, and returns a vanilla value.
+  *)
+  let materialize_lit env (lit : Const.lit) : int32 =
+    match lit with
+    | Const.Vanilla n  -> n
+    | Const.Bool n     -> Bool.vanilla_lit n
+    | Const.BigInt n   -> BigNum.vanilla_lit env n
+    | Const.Word32 n   -> BoxedSmallWord.vanilla_lit env n
+    | Const.Word64 n   -> BoxedWord64.vanilla_lit env n
+    | Const.Float64 f  -> Float.vanilla_lit env f
+    | Const.Blob t     -> Blob.vanilla_lit env t
+    | Const.Null       -> Opt.null_vanilla_lit env
+
+  let rec materialize_const_t env (p, cv) : int32 =
+    Lib.Promise.lazy_value p (fun () -> materialize_const_v env cv)
+
+  and materialize_const_v env = function
+    | Const.Fun (get_fi, _) -> Closure.static_closure env (get_fi ())
+    | Const.Message fi -> assert false
+    | Const.Obj fs ->
+      let fs' = List.map (fun (n, c) -> (n, materialize_const_t env c)) fs in
+      Object.vanilla_lit env fs'
+    | Const.Unit -> Tuple.unit_vanilla_lit
+    | Const.Array cs ->
+      let ptrs = List.map (materialize_const_t env) cs in
+      Arr.vanilla_lit env ptrs
+    | Const.Tag (i, c) ->
+      let ptr = materialize_const_t env c in
+      Variant.vanilla_lit env i ptr
+    | Const.Lit l -> materialize_lit env l
+    | Const.Opt c ->
+      let rec kernel = Const.(function
+        | (_, Lit Null) -> None
+        | (_, Opt c) -> kernel c
+        | (_, other) -> Some (materialize_const_v env other)) in
+      match kernel c with
+      | Some ptr -> ptr
+      | None -> Opt.vanilla_lit env (materialize_const_t env c)
+
+  let adjust env (sr_in : t) sr_out =
+    if eq sr_in sr_out
+    then G.nop
+    else match sr_in, sr_out with
+    | Unreachable, Unreachable -> G.nop
+    | Unreachable, _ -> G.i Unreachable
+
+    | UnboxedTuple n, Vanilla -> Tuple.from_stack env n
+    | Vanilla, UnboxedTuple n -> Tuple.to_stack env n
+
+    | UnboxedWord64, Vanilla -> BoxedWord64.box env
+    | Vanilla, UnboxedWord64 -> BoxedWord64.unbox env
+
+    | UnboxedWord32, Vanilla -> BoxedSmallWord.box env
+    | Vanilla, UnboxedWord32 -> BoxedSmallWord.unbox env
+
+    | UnboxedFloat64, Vanilla -> Float.box env
+    | Vanilla, UnboxedFloat64 -> Float.unbox env
+
+    | Const (_, Const.Lit (Const.Bool b)), Vanilla -> Bool.lit b
+    | Const c, Vanilla -> compile_unboxed_const (materialize_const_t env c)
+    | Const (_, Const.Lit (Const.Word32 n)), UnboxedWord32 -> compile_unboxed_const n
+    | Const (_, Const.Lit (Const.Word64 n)), UnboxedWord64 -> compile_const_64 n
+    | Const (_, Const.Lit (Const.Float64 f)), UnboxedFloat64 -> Float.compile_unboxed_const f
+    | Const c, UnboxedTuple 0 -> G.nop
+    | Const (_, Const.Array cs), UnboxedTuple n ->
+      assert (n = List.length cs);
+      G.concat_map (fun c -> compile_unboxed_const (materialize_const_t env c)) cs
+    | _, _ ->
+      Printf.eprintf "Unknown stack_rep conversion %s -> %s\n"
+        (to_string sr_in) (to_string sr_out);
+      G.nop
+
+end (* StackRep *)
+
+module VarEnv = struct
+
+  (* A type to record where Motoko names are stored. *)
+  type varloc =
+    (* A Wasm Local of the current function, directly containing the value,
+       in the given stackrep (Vanilla, UnboxedWord32, …) so far
+       Used for immutable and mutable, non-captured data *)
+    | Local of SR.t * int32
+    (* A Wasm Local of the current function, that points to memory location,
+       which is a MutBox.  Used for mutable captured data *)
+    | HeapInd of int32
+    (* A static mutable memory location (static address of a MutBox object) *)
+    (* TODO: Do we need static immutable? *)
+    | HeapStatic of int32
+    (* Not materialized (yet), statically known constant, static location on demand *)
+    | Const of Const.t
+    (* public method *)
+    | PublicMethod of int32 * string
+
+  let is_non_local : varloc -> bool = function
+    | Local _
+    | HeapInd _ -> false
+    | HeapStatic _
+    | PublicMethod _
+    | Const _ -> true
+
+  type lvl = TopLvl | NotTopLvl
+
+  (*
+  The source variable environment:
+   - Whether we are on the top level
+   - In-scope variables
+   - scope jump labels
+  *)
+
+
+  module NameEnv = Env.Make(String)
+  type t = {
+    lvl : lvl;
+    vars : (varloc * Type.typ) NameEnv.t; (* variables ↦ their location and type *)
+    labels : G.depth NameEnv.t; (* jump label ↦ their depth *)
+  }
+
+  let empty_ae = {
+    lvl = TopLvl;
+    vars = NameEnv.empty;
+    labels = NameEnv.empty;
+  }
+
+  (* Creating a local environment, resetting the local fields,
+     and removing bindings for local variables (unless they are at global locations)
+  *)
+
+  let mk_fun_ae ae = { ae with
+    lvl = NotTopLvl;
+    vars = NameEnv.filter (fun v (l, _) ->
+      let non_local = is_non_local l in
+      (* For debugging, enable this:
+      (if not non_local then Printf.eprintf "VarEnv.mk_fun_ae: Removing %s\n" v);
+      *)
+      non_local
+    ) ae.vars;
+  }
+  let lookup ae var =
+    match NameEnv.find_opt var ae.vars with
+      | Some e -> Some e
+      | None   -> Printf.eprintf "Could not find %s\n" var; None
+
+  let lookup_var ae var =
+    match lookup ae var with
+      | Some (l, _) -> Some l
+      | None -> None
+
+  let needs_capture ae var = match lookup_var ae var with
+    | Some l -> not (is_non_local l)
+    | None -> assert false
+
+  let add_local_with_heap_ind env (ae : t) name typ =
+      let i = E.add_anon_local env I32Type in
+      E.add_local_name env i name;
+      ({ ae with vars = NameEnv.add name ((HeapInd i), typ) ae.vars }, i)
+
+  let add_local_heap_static (ae : t) name ptr typ =
+      { ae with vars = NameEnv.add name ((HeapStatic ptr), typ) ae.vars }
+
+  let add_local_public_method (ae : t) name (fi, exported_name) typ =
+      { ae with vars = NameEnv.add name ((PublicMethod (fi, exported_name) : varloc), typ) ae.vars }
+
+  let add_local_const (ae : t) name cv typ =
+      { ae with vars = NameEnv.add name ((Const cv : varloc), typ) ae.vars }
+
+  let add_local_local env (ae : t) name sr i typ =
+      { ae with vars = NameEnv.add name ((Local (sr, i)), typ) ae.vars }
+
+  let add_direct_local env (ae : t) name sr typ =
+      let i = E.add_anon_local env (SR.to_var_type sr) in
+      E.add_local_name env i name;
+      (add_local_local env ae name sr i typ, i)
+
+  (* Adds the names to the environment and returns a list of setters *)
+  let rec add_arguments env (ae : t) as_local = function
+    | [] -> ae
+    | ((name, typ) :: remainder) ->
+      if as_local name then
+        let i = E.add_anon_local env I32Type in
+        E.add_local_name env i name;
+        let ae' = { ae with vars = NameEnv.add name ((Local (SR.Vanilla, i)), typ) ae.vars } in
+        add_arguments env ae' as_local remainder
+      else (* needs to go to static memory *)
+        let ptr = MutBox.static env in
+        let ae' = add_local_heap_static ae name ptr typ in
+        add_arguments env ae' as_local remainder
+
+  let add_argument_locals env (ae : t) =
+    add_arguments env ae (fun _ -> true)
+
+  let add_label (ae : t) name (d : G.depth) =
+      { ae with labels = NameEnv.add name d ae.labels }
+
+  let get_label_depth (ae : t) name : G.depth  =
+    match NameEnv.find_opt name ae.labels with
+      | Some d -> d
+      | None   -> raise (CodegenError (Printf.sprintf "Could not find %s\n" name))
+
+end (* VarEnv *)
+
+(* type for wrapping code with context, context is establishment
+   of (pattern) binding, argument is the code using the binding,
+   result is e.g. the code for `case p e`. *)
+type scope_wrap = G.t -> G.t
+
+let unmodified : scope_wrap = fun code -> code
+
+let rec can_be_pointer typ nested_optional =
+  Type.(match normalize typ with
+  | Mut t -> (can_be_pointer t nested_optional)
+  | Opt t -> (if nested_optional then true else (can_be_pointer t true))
+  | Prim (Null| Bool | Char | Nat8 | Nat16 | Int8 | Int16) | Non | Tup [] -> false
+  | _ -> true)
+
+let potential_pointer typ : bool =
+  (* must not eliminate nested optional types as they refer to a heap object for ??null, ???null etc. *)
+  can_be_pointer typ false
+
+module Var = struct
+  (* This module is all about looking up Motoko variables in the environment,
+     and dealing with mutable variables *)
+
+  open VarEnv
+
+  (* Returns desired stack representation, preparation code and code to consume
+     the value onto the stack *)
+  let set_val env ae var : G.t * SR.t * G.t = match (VarEnv.lookup ae var, !Flags.gc_strategy) with
+    | (Some ((Local (sr, i)), _), _) ->
+      G.nop,
+      sr,
+      G.i (LocalSet (nr i))
+    | (Some ((HeapInd i), typ), Flags.Generational) when potential_pointer typ ->
+      G.i (LocalGet (nr i)),
+      SR.Vanilla,
+      MutBox.store_field env ^^
+      G.i (LocalGet (nr i)) ^^
+      Tagged.load_forwarding_pointer env ^^ (* not needed for this GC, but only for forward pointer sanity checks *)
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size) ^^
+      E.call_import env "rts" "post_write_barrier"
+    | (Some ((HeapInd i), typ), Flags.Incremental) when potential_pointer typ ->
+      G.i (LocalGet (nr i)) ^^
+      Tagged.load_forwarding_pointer env ^^
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size),
+      SR.Vanilla,
+      Tagged.write_with_barrier env
+    | (Some ((HeapInd i), typ), _) ->
+      G.i (LocalGet (nr i)),
+      SR.Vanilla,
+      MutBox.store_field env
+    | (Some ((HeapStatic ptr), typ), Flags.Generational) when potential_pointer typ ->
+      compile_unboxed_const ptr,
+      SR.Vanilla,
+      MutBox.store_field env ^^
+      compile_unboxed_const ptr ^^
+      Tagged.load_forwarding_pointer env ^^ (* not needed for this GC, but only for forward pointer sanity checks *)
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size) ^^
+      E.call_import env "rts" "post_write_barrier"
+    | (Some ((HeapStatic ptr), typ), Flags.Incremental) when potential_pointer typ ->
+      compile_unboxed_const ptr ^^
+      Tagged.load_forwarding_pointer env ^^
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size),
+      SR.Vanilla,
+      Tagged.write_with_barrier env
+    | (Some ((HeapStatic ptr), typ), _) ->
+      compile_unboxed_const ptr,
+      SR.Vanilla,
+      MutBox.store_field env
+    | (Some ((Const _), _), _) -> fatal "set_val: %s is const" var
+    | (Some ((PublicMethod _), _), _) -> fatal "set_val: %s is PublicMethod" var
+    | (None, _)   -> fatal "set_val: %s missing" var
+
+  (* Stores the payload. Returns stack preparation code, and code that consumes the values from the stack *)
+  let set_val_vanilla env ae var : G.t * G.t =
+    let pre_code, sr, code = set_val env ae var in
+    pre_code, StackRep.adjust env SR.Vanilla sr ^^ code
+
+  (* Stores the payload (which is found on the stack, in Vanilla stackrep) *)
+  let set_val_vanilla_from_stack env ae var : G.t =
+    let pre_code, code = set_val_vanilla env ae var in
+    if G.is_nop pre_code
+    then code
+    else
+      (* Need to shuffle the stack entries *)
+      let (set_x, get_x) = new_local env "var_scrut" in
+      set_x ^^
+      pre_code ^^
+      get_x ^^
+      code
+
+  (* Returns the payload (optimized representation) *)
+  let get_val (env : E.t) (ae : VarEnv.t) var = match VarEnv.lookup_var ae var with
+    | Some (Local (sr, i)) ->
+      sr, G.i (LocalGet (nr i))
+    | Some (HeapInd i) ->
+      SR.Vanilla, G.i (LocalGet (nr i)) ^^ MutBox.load_field env
+    | Some (HeapStatic i) ->
+      SR.Vanilla, compile_unboxed_const i ^^ MutBox.load_field env
+    | Some (Const c) ->
+      SR.Const c, G.nop
+    | Some (PublicMethod (_, name)) ->
+      SR.Vanilla,
+      IC.get_self_reference env ^^
+      IC.actor_public_field env name
+    | None -> assert false
+
+  (* Returns the payload (vanilla representation) *)
+  let get_val_vanilla (env : E.t) (ae : VarEnv.t) var =
+    let sr, code = get_val env ae var in
+    code ^^ StackRep.adjust env sr SR.Vanilla
+
+  (* Returns the value to put in the closure,
+     and code to restore it, including adding to the environment
+  *)
+  let capture old_env ae0 var : G.t * (E.t -> VarEnv.t -> VarEnv.t * scope_wrap) =
+    match VarEnv.lookup ae0 var with
+    | Some ((Local (sr, i)), typ) ->
+      ( G.i (LocalGet (nr i)) ^^ StackRep.adjust old_env sr SR.Vanilla
+      , fun new_env ae1 ->
+        (* we use SR.Vanilla in the restored environment. We could use sr;
+           like for parameters hard to predict what’s better *)
+        let ae2, j = VarEnv.add_direct_local new_env ae1 var SR.Vanilla typ in
+        let restore_code = G.i (LocalSet (nr j))
+        in ae2, fun body -> restore_code ^^ body
+      )
+    | Some ((HeapInd i), typ) ->
+      ( G.i (LocalGet (nr i))
+      , fun new_env ae1 ->
+        let ae2, j = VarEnv.add_local_with_heap_ind new_env ae1 var typ in
+        let restore_code = G.i (LocalSet (nr j))
+        in ae2, fun body -> restore_code ^^ body
+      )
+    | _ -> assert false
+
+  (* This is used when putting a mutable field into an object.
+     In the IR, mutable fields of objects are pre-allocated as MutBox objects,
+     to allow the async/await.
+     So we expect the variable to be in a HeapInd (pointer to MutBox on the heap),
+     or HeapStatic (statically known MutBox in the static memory) and we use
+     the pointer.
+  *)
+  let get_aliased_box env ae var = match VarEnv.lookup_var ae var with
+    | Some (HeapInd i) -> G.i (LocalGet (nr i))
+    | Some (HeapStatic i) -> compile_unboxed_const i
+    | _ -> assert false
+
+  let capture_aliased_box env ae var = match VarEnv.lookup_var ae var with
+    | Some (HeapInd i) ->
+      G.i (LocalSet (nr i))
+    | _ -> assert false
+
+end (* Var *)
+
+(* Calling well-known prelude functions *)
+(* FIXME: calling into the prelude will not work if we ever need to compile a program
+   that requires top-level cps conversion;
+   use new prims instead *)
+module Internals = struct
+  let call_prelude_function env ae var =
+    match VarEnv.lookup_var ae var with
+    | Some (VarEnv.Const (_, Const.Fun (mk_fi, _))) ->
+       compile_unboxed_zero ^^ (* A dummy closure *)
+       G.i (Call (nr (mk_fi ())))
+    | _ -> assert false
+
+  let add_cycles env ae = call_prelude_function env ae "@add_cycles"
+  let reset_cycles env ae = call_prelude_function env ae "@reset_cycles"
+  let reset_refund env ae = call_prelude_function env ae "@reset_refund"
+end
+
+(* This comes late because it also deals with messages *)
+module FuncDec = struct
+  let bind_args env ae0 first_arg args =
+    let rec go i ae = function
+    | [] -> ae
+    | a::args ->
+      (* Function arguments are always vanilla, due to subtyping and uniform representation.
+         We keep them as such here for now. We _could_ always unpack those that can be unpacked
+         (Nat32 etc.). It is generally hard to predict which strategy is better. *)
+      let ae' = VarEnv.add_local_local env ae a.it SR.Vanilla (Int32.of_int i) a.note in
+      go (i+1) ae' args in
+    go first_arg ae0 args
+
+  (* Create a WebAssembly func from a pattern (for the argument) and the body.
+   Parameter `captured` should contain the, well, captured local variables that
+   the function will find in the closure. *)
+  let compile_local_function outer_env outer_ae restore_env args mk_body ret_tys at =
+    let arg_names = List.map (fun a -> a.it, I32Type) args in
+    let return_arity = List.length ret_tys in
+    let retty = Lib.List.make return_arity I32Type in
+    let ae0 = VarEnv.mk_fun_ae outer_ae in
+    Func.of_body outer_env (["clos", I32Type] @ arg_names) retty (fun env -> G.with_region at (
+      let get_closure = G.i (LocalGet (nr 0l)) ^^ Tagged.load_forwarding_pointer env in
+
+      let ae1, closure_codeW = restore_env env ae0 get_closure in
+
+      (* Add arguments to the environment (shifted by 1) *)
+      let ae2 = bind_args env ae1 1 args in
+
+      closure_codeW (mk_body env ae2)
+    ))
+
+  let message_start env sort = match sort with
+      | Type.Shared Type.Write ->
+        Lifecycle.trans env Lifecycle.InUpdate
+      | Type.Shared Type.Query ->
+        Lifecycle.trans env Lifecycle.InQuery
+      | Type.Shared Type.Composite ->
+        Lifecycle.trans env Lifecycle.InComposite
+      | _ -> assert false
+
+  let message_cleanup env sort = match sort with
+      | Type.Shared Type.Write ->
+        GC.collect_garbage env ^^
+        Lifecycle.trans env Lifecycle.Idle
+      | Type.Shared Type.Query ->
+        Lifecycle.trans env Lifecycle.PostQuery
+      | Type.Shared Type.Composite ->
+        Lifecycle.trans env Lifecycle.Idle
+      | _ -> assert false
+
+  let compile_const_message outer_env outer_ae sort control args mk_body ret_tys at : E.func_with_names =
+    let ae0 = VarEnv.mk_fun_ae outer_ae in
+    Func.of_body outer_env [] [] (fun env -> G.with_region at (
+      message_start env sort ^^
+      (* cycles *)
+      Internals.reset_cycles env outer_ae ^^
+      Internals.reset_refund env outer_ae ^^
+      (* reply early for a oneway *)
+      (if control = Type.Returns
+       then
+         Tuple.compile_unit ^^
+         Serialization.serialize env [] ^^
+         IC.reply_with_data env
+       else G.nop) ^^
+      (* Deserialize argument and add params to the environment *)
+      let arg_list = List.map (fun a -> (a.it, a.note)) args in
+      let arg_names = List.map (fun a -> a.it) args in
+      let arg_tys = List.map (fun a -> a.note) args in
+      let ae1 = VarEnv.add_argument_locals env ae0 arg_list in
+      Serialization.deserialize env arg_tys ^^
+      G.concat_map (Var.set_val_vanilla_from_stack env ae1) (List.rev arg_names) ^^
+      mk_body env ae1 ^^
+      message_cleanup env sort
+    ))
+
+  (* Compile a closed function declaration (captures no local variables) *)
+  let closed pre_env sort control name args mk_body fun_rhs ret_tys at =
+    if Type.is_shared_sort sort
+    then begin
+      let (fi, fill) = E.reserve_fun pre_env name in
+      ( Const.t_of_v (Const.Message fi), fun env ae ->
+        fill (compile_const_message env ae sort control args mk_body ret_tys at)
+      )
+    end else begin
+      assert (control = Type.Returns);
+      let lf = E.make_lazy_function pre_env name in
+      ( Const.t_of_v (Const.Fun ((fun () -> Lib.AllocOnUse.use lf), fun_rhs)), fun env ae ->
+        let restore_no_env _env ae _ = ae, unmodified in
+        Lib.AllocOnUse.def lf (lazy (compile_local_function env ae restore_no_env args mk_body ret_tys at))
+      )
+    end
+
+  (* Compile a closure declaration (captures local variables) *)
+  let closure env ae sort control name captured args mk_body ret_tys at =
+      let is_local = sort = Type.Local in
+
+      let set_clos, get_clos = new_local env (name ^ "_clos") in
+
+      let len = Wasm.I32.of_int_u (List.length captured) in
+      let store_env, restore_env =
+        let rec go i = function
+          | [] -> (G.nop, fun _env ae1 _ -> ae1, unmodified)
+          | (v::vs) ->
+              let store_rest, restore_rest = go (i + 1) vs in
+              let store_this, restore_this = Var.capture env ae v in
+              let store_env =
+                get_clos ^^
+                store_this ^^
+                Closure.store_data env (Wasm.I32.of_int_u i) ^^
+                store_rest in
+              let restore_env env ae1 get_env =
+                let ae2, codeW = restore_this env ae1 in
+                let ae3, code_restW = restore_rest env ae2 get_env in
+                (ae3,
+                 fun body ->
+                 get_env ^^
+                 Closure.load_data env (Wasm.I32.of_int_u i) ^^
+                 codeW (code_restW body)
+                )
+              in store_env, restore_env in
+        go 0 captured in
+
+      let f =
+        if is_local
+        then compile_local_function env ae restore_env args mk_body ret_tys at
+        else assert false (* no first class shared functions yet *) in
+
+      let fi = E.add_fun env name f in
+
+      let code =
+        (* Allocate a heap object for the closure *)
+        Tagged.alloc env (Int32.add (Closure.header_size env) len) Tagged.Closure ^^
+        set_clos ^^
+
+        (* Store the function pointer number: *)
+        get_clos ^^
+        compile_unboxed_const (E.add_fun_ptr env fi) ^^
+        Tagged.store_field env (Closure.funptr_field env) ^^
+
+        (* Store the length *)
+        get_clos ^^
+        compile_unboxed_const len ^^
+        Tagged.store_field env (Closure.len_field env) ^^
+
+        (* Store all captured values *)
+        store_env ^^
+
+        get_clos ^^
+        Tagged.allocation_barrier env ^^
+        G.i Drop
+      in
+
+      if is_local
+      then
+        SR.Vanilla,
+        code ^^
+        get_clos
+      else assert false (* no first class shared functions *)
+
+  let lit env ae name sort control free_vars args mk_body ret_tys at =
+    let captured = List.filter (VarEnv.needs_capture ae) free_vars in
+
+    if ae.VarEnv.lvl = VarEnv.TopLvl then assert (captured = []);
+
+    if captured = []
+    then
+      let (ct, fill) = closed env sort control name args mk_body Const.Complicated ret_tys at in
+      fill env ae;
+      (SR.Const ct, G.nop)
+    else closure env ae sort control name captured args mk_body ret_tys at
+
+  (* Returns a closure corresponding to a future (async block) *)
+  let async_body env ae ts free_vars mk_body at =
+    (* We compile this as a local, returning function, so set return type to [] *)
+    let sr, code = lit env ae "anon_async" Type.Local Type.Returns free_vars [] mk_body [] at in
+    code ^^
+    StackRep.adjust env sr SR.Vanilla
+
+  (* Takes the reply and reject callbacks, tuples them up (with administrative extras),
+     adds them to the continuation table, and returns the two callbacks expected by
+     ic.call_new.
+
+     The tupling is necessary because we want to free _both_/_all_ closures
+     when the call is answered.
+
+     The reply callback function exists once per type (as it has to do
+     deserialization); the reject callback function is unique.
+  *)
+
+  let closures_to_reply_reject_callbacks_aux env ts_opt =
+    let arity, reply_name, from_arg_data =
+      match ts_opt with
+      | Some ts ->
+        (List.length ts,
+         "@callback<" ^ Typ_hash.typ_hash (Type.Tup ts) ^ ">",
+         fun env -> Serialization.deserialize env ts)
+      | None ->
+        (1,
+         "@callback",
+         (fun env ->
+           Blob.of_size_copy env
+           (fun env -> IC.system_call env "msg_arg_data_size")
+           (fun env -> IC.system_call env "msg_arg_data_copy")
+           (fun env -> compile_unboxed_const 0l)))
+    in
+    Func.define_built_in env reply_name ["env", I32Type] [] (fun env ->
+        message_start env (Type.Shared Type.Write) ^^
+        (* Look up continuation *)
+        let (set_closure, get_closure) = new_local env "closure" in
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        Arr.load_field env 0l ^^ (* get the reply closure *)
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+
+        (* Deserialize/Blobify reply arguments  *)
+        from_arg_data env ^^
+
+        get_closure ^^
+        Closure.call_closure env arity 0 ^^
+
+        message_cleanup env (Type.Shared Type.Write)
+      );
+
+    let reject_name = "@reject_callback" in
+    Func.define_built_in env reject_name ["env", I32Type] [] (fun env ->
+        message_start env (Type.Shared Type.Write) ^^
+        (* Look up continuation *)
+        let (set_closure, get_closure) = new_local env "closure" in
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        Arr.load_field env 1l ^^ (* get the reject closure *)
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+        (* Synthesize value of type `Text`, the error message
+           (The error code is fetched via a prim)
+        *)
+        IC.error_value env ^^
+
+        get_closure ^^
+        Closure.call_closure env 1 0 ^^
+
+        message_cleanup env (Type.Shared Type.Write)
+      );
+
+    (* result is a function that accepts a list of closure getters, from which
+       the first and second must be the reply and reject continuations. *)
+    fun closure_getters ->
+      let (set_cb_index, get_cb_index) = new_local env "cb_index" in
+      Arr.lit env closure_getters ^^
+      ContinuationTable.remember env ^^
+      set_cb_index ^^
+
+      (* return arguments for the ic.call *)
+      compile_unboxed_const (E.add_fun_ptr env (E.built_in env reply_name)) ^^
+      get_cb_index ^^
+      compile_unboxed_const (E.add_fun_ptr env (E.built_in env reject_name)) ^^
+      get_cb_index
+
+  let closures_to_reply_reject_callbacks env ts =
+    closures_to_reply_reject_callbacks_aux env (Some ts)
+  let closures_to_raw_reply_reject_callbacks env  =
+    closures_to_reply_reject_callbacks_aux env None
+
+  let ignoring_callback env =
+    (* for one-way calls, we use an invalid table entry as the callback. this
+       way, the callback, when it comes back, will (safely) trap, even if the
+       module has completely changed in between. This way, one-way calls do not
+       get in the way of safe instantaneous upgrades *)
+    compile_unboxed_const (-1l)
+
+  let cleanup_callback env =
+    let name = "@cleanup_callback" in
+    Func.define_built_in env name ["env", I32Type] [] (fun env ->
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        G.i Drop);
+    compile_unboxed_const (E.add_fun_ptr env (E.built_in env name))
+
+  let ic_call_threaded env purpose get_meth_pair push_continuations
+    add_data add_cycles =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      let message = Printf.sprintf "could not perform %s" purpose in
+      let (set_cb_index, get_cb_index) = new_local env "cb_index" in
+      (* The callee *)
+      get_meth_pair ^^ Arr.load_field env 0l ^^ Blob.as_ptr_len env ^^
+      (* The method name *)
+      get_meth_pair ^^ Arr.load_field env 1l ^^ Blob.as_ptr_len env ^^
+      (* The reply and reject callback *)
+      push_continuations ^^
+      set_cb_index ^^ get_cb_index ^^
+      (* initiate call *)
+      IC.system_call env "call_new" ^^
+      cleanup_callback env ^^ get_cb_index ^^
+      IC.system_call env "call_on_cleanup" ^^
+      (* the data *)
+      add_data get_cb_index ^^
+      IC.system_call env "call_data_append" ^^
+      (* the cycles *)
+      add_cycles ^^
+      (* done! *)
+      IC.system_call env "call_perform" ^^
+      IC.set_call_perform_status env ^^
+      Blob.lit env message ^^
+      IC.set_call_perform_message env ^^
+      IC.get_call_perform_status env ^^
+      (* save error code, cleanup on error *)
+      G.if0
+      begin (* send failed *)
+        if !Flags.trap_on_call_error then
+          E.trap_with env message
+        else
+        (* Recall (don't leak) continuations *)
+        get_cb_index ^^
+        ContinuationTable.recall env ^^
+        G.i Drop
+      end
+      begin (* send succeeded *)
+        G.nop
+      end
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot perform %s when running locally" purpose)
+
+  let ic_call env ts1 ts2 get_meth_pair get_arg get_k get_r =
+    ic_call_threaded
+      env
+      "remote call"
+      get_meth_pair
+      (closures_to_reply_reject_callbacks env ts2 [get_k; get_r])
+      (fun _ -> get_arg ^^ Serialization.serialize env ts1)
+
+  let ic_call_raw env get_meth_pair get_arg get_k get_r =
+    ic_call_threaded
+      env
+      "raw call"
+      get_meth_pair
+      (closures_to_raw_reply_reject_callbacks env [get_k; get_r])
+      (fun _ -> get_arg ^^ Blob.as_ptr_len env)
+
+  let ic_self_call env ts get_meth_pair get_future get_k get_r =
+    ic_call_threaded
+      env
+      "self call"
+      get_meth_pair
+      (* Storing the tuple away, future_array_index = 2, keep in sync with rts/continuation_table.rs *)
+      (closures_to_reply_reject_callbacks env ts [get_k; get_r; get_future])
+      (fun get_cb_index ->
+        get_cb_index ^^
+        BoxedSmallWord.box env ^^
+        Serialization.serialize env Type.[Prim Nat32])
+
+  let ic_call_one_shot env ts get_meth_pair get_arg add_cycles =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      (* The callee *)
+      get_meth_pair ^^ Arr.load_field env 0l ^^ Blob.as_ptr_len env ^^
+      (* The method name *)
+      get_meth_pair ^^ Arr.load_field env 1l ^^ Blob.as_ptr_len env ^^
+      (* The reply callback *)
+      ignoring_callback env ^^
+      compile_unboxed_zero ^^
+      (* The reject callback *)
+      ignoring_callback env ^^
+      compile_unboxed_zero ^^
+      IC.system_call env "call_new" ^^
+      (* the data *)
+      get_arg ^^ Serialization.serialize env ts ^^
+      IC.system_call env "call_data_append" ^^
+      (* the cycles *)
+      add_cycles ^^
+      IC.system_call env "call_perform" ^^
+      (* This is a one-shot function: just remember error code *)
+      (if !Flags.trap_on_call_error then
+         (* legacy: discard status, proceed as if all well *)
+         G.i Drop ^^
+         compile_unboxed_zero ^^
+         IC.set_call_perform_status env ^^
+         Blob.lit env "" ^^
+         IC.set_call_perform_message env
+       else
+         IC.set_call_perform_status env ^^
+         Blob.lit env "could not perform oneway" ^^
+         IC.set_call_perform_message env)
+
+    | _ -> assert false
+
+  let equate_msgref env =
+    let (set_meth_pair1, get_meth_pair1) = new_local env "meth_pair1" in
+    let (set_meth_pair2, get_meth_pair2) = new_local env "meth_pair2" in
+    set_meth_pair2 ^^ set_meth_pair1 ^^
+    get_meth_pair1 ^^ Arr.load_field env 0l ^^
+    get_meth_pair2 ^^ Arr.load_field env 0l ^^
+    Blob.compare env (Some Operator.EqOp) ^^
+    G.if1 I32Type
+    begin
+      get_meth_pair1 ^^ Arr.load_field env 1l ^^
+      get_meth_pair2 ^^ Arr.load_field env 1l ^^
+      Blob.compare env (Some Operator.EqOp)
+    end
+    begin
+      Bool.lit false
+    end
+
+  let export_async_method env =
+    let name = IC.async_method_name in
+    begin match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.define_built_in env name [] [] (fun env ->
+        let (set_closure, get_closure) = new_local env "closure" in
+
+        message_start env (Type.Shared Type.Write) ^^
+
+        (* Check that we are calling this *)
+        IC.assert_caller_self env ^^
+
+        (* Deserialize and look up continuation argument *)
+        Serialization.deserialize env Type.[Prim Nat32] ^^
+        BoxedSmallWord.unbox env ^^
+        ContinuationTable.peek_future env ^^
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+        get_closure ^^
+        Closure.call_closure env 0 0 ^^
+        message_cleanup env (Type.Shared Type.Write)
+      );
+
+      let fi = E.built_in env name in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode ("canister_update " ^ name);
+        edesc = nr (FuncExport (nr fi))
+      })
+    | _ -> ()
+    end
+
+end (* FuncDec *)
+
+
+module PatCode = struct
+  (* Pattern failure code on demand.
+
+  Patterns in general can fail, so we want a block around them with a
+  jump-label for the fail case. But many patterns cannot fail, in particular
+  function arguments that are simple variables. In these cases, we do not want
+  to create the block and the (unused) jump label. So we first generate the
+  code, either as plain code (CannotFail) or as code with hole for code to run
+  in case of failure (CanFail).
+  *)
+
+  type patternCode =
+    | CannotFail of G.t
+    | CanFail of (G.t -> G.t)
+
+  let definiteFail = CanFail (fun fail -> fail)
+
+  let (^^^) : patternCode -> patternCode -> patternCode = function
+    | CannotFail is1 ->
+      begin function
+      | CannotFail is2 -> CannotFail (is1 ^^ is2)
+      | CanFail is2 -> CanFail (fun k -> is1 ^^ is2 k)
+      end
+    | CanFail is1 ->
+      begin function
+      | CannotFail is2 -> CanFail (fun k ->  is1 k ^^ is2)
+      | CanFail is2 -> CanFail (fun k -> is1 k ^^ is2 k)
+      end
+
+  let with_fail (fail_code : G.t) : patternCode -> G.t = function
+    | CannotFail is -> is
+    | CanFail is -> is fail_code
+
+  let orElse : patternCode -> patternCode -> patternCode = function
+    | CannotFail is1 -> fun _ -> CannotFail is1
+    | CanFail is1 -> function
+      | CanFail is2 -> CanFail (fun fail_code ->
+          let inner_fail = G.new_depth_label () in
+          let inner_fail_code = Bool.lit false ^^ G.branch_to_ inner_fail in
+          G.labeled_block1 I32Type inner_fail (is1 inner_fail_code ^^ Bool.lit true) ^^
+          G.if0 G.nop (is2 fail_code)
+        )
+      | CannotFail is2 -> CannotFail (
+          let inner_fail = G.new_depth_label () in
+          let inner_fail_code = Bool.lit false ^^ G.branch_to_ inner_fail in
+          G.labeled_block1 I32Type inner_fail (is1 inner_fail_code ^^ Bool.lit true) ^^
+          G.if0 G.nop is2
+        )
+
+  let orElses : patternCode list -> patternCode -> patternCode =
+    List.fold_right orElse
+
+  let patternFailTrap env = E.trap_with env "pattern failed"
+
+  let orPatternFailure env pcode =
+    with_fail (patternFailTrap env) pcode
+
+  let orsPatternFailure env pcodes =
+    orPatternFailure env (orElses pcodes definiteFail)
+
+  let with_region at = function
+    | CannotFail is -> CannotFail (G.with_region at is)
+    | CanFail is -> CanFail (fun k -> G.with_region at (is k))
+
+end (* PatCode *)
+open PatCode
+
+(* All the code above is independent of the IR *)
+open Ir
+
+module AllocHow = struct
+  (*
+  When compiling a (recursive) block, we need to do a dependency analysis, to
+  find out how the things are allocated. The options are:
+  - const:  completely known, constant, not stored anywhere (think static function)
+            (no need to mention in a closure)
+  - local:  only needed locally, stored in a Wasm local, immutable
+            (can be copied into a closure by value)
+  - local mutable: only needed locally, stored in a Wasm local, mutable
+            (cannot be copied into a closure)
+  - heap allocated: stored on the dynamic heap, address in Wasm local
+            (can be copied into a closure by reference)
+  - static heap: stored on the static heap, address known statically
+            (no need to mention in a closure)
+
+  The goal is to avoid dynamic allocation where possible (and use locals), and
+  to avoid turning function references into closures.
+
+  The rules are:
+  - functions are const, unless they capture something that is not a const
+    function or a static heap allocation.
+    in particular, top-level functions are always const
+  - everything that is captured on the top-level needs to be statically
+    heap-allocated
+  - everything that is captured before it is defined, or is captured and mutable
+    needs to be dynamically heap-allocated
+  - the rest can be local
+  *)
+
+  module M = Freevars.M
+  module S = Freevars.S
+
+  (*
+  We represent this as a lattice as follows:
+  *)
+  type how = Const | LocalImmut of SR.t | LocalMut of SR.t | StoreHeap | StoreStatic
+  type allocHow = how M.t
+
+  let disjoint_union : allocHow -> allocHow -> allocHow =
+    M.union (fun v _ _ -> fatal "AllocHow.disjoint_union: %s" v)
+
+  let join : allocHow -> allocHow -> allocHow =
+    M.union (fun _ x y -> Some (match x, y with
+      | StoreStatic, StoreHeap | StoreHeap, StoreStatic
+      ->  fatal "AllocHow.join: cannot join StoreStatic and StoreHeap"
+
+      | _, StoreHeap     | StoreHeap,      _ -> StoreHeap
+      | _, StoreStatic   | StoreStatic,    _ -> StoreStatic
+      | _, LocalMut sr   | LocalMut sr,    _ -> LocalMut sr
+      | _, LocalImmut sr | LocalImmut sr,  _ -> LocalImmut sr
+
+      | Const, Const -> Const
+    ))
+  let joins = List.fold_left join M.empty
+
+  let map_of_set = Freevars.map_of_set
+  let set_of_map = Freevars.set_of_map
+
+  (* Various filters used in the set operations below *)
+  let is_local_mut _ = function
+    | LocalMut _ -> true
+    | _ -> false
+
+  let is_local _ = function
+    | LocalImmut _ | LocalMut _ -> true
+    | _ -> false
+
+  let how_captured lvl how seen captured =
+    (* What to do so that we can capture something?
+       * For local blocks, put on the dynamic heap:
+         - mutable things
+         - not yet defined things
+       * For top-level blocks, put on the static heap:
+         - everything that is non-static (i.e. still in locals)
+    *)
+    match lvl with
+    | VarEnv.NotTopLvl ->
+      map_of_set StoreHeap (S.union
+        (S.inter (set_of_map (M.filter is_local_mut how)) captured)
+        (S.inter (set_of_map (M.filter is_local how)) (S.diff captured seen))
+      )
+    | VarEnv.TopLvl ->
+      map_of_set StoreStatic
+        (S.inter (set_of_map (M.filter is_local how)) captured)
+
+  (* A bit like StackRep.of_type, but only for those types and stackreps that
+     we support in local variables *)
+  let stackrep_of_type t =
+    let open Type in
+    match normalize t with
+    | Prim (Nat32 | Int32) -> SR.UnboxedWord32
+    | Prim (Nat64 | Int64) -> SR.UnboxedWord64
+    | Prim Float -> SR.UnboxedFloat64
+    | _ -> SR.Vanilla
+
+  let dec lvl how_outer (seen, how0) dec =
+    let how_all = disjoint_union how_outer how0 in
+
+    let (f,d) = Freevars.dec dec in
+    let captured = S.inter (set_of_map how0) (Freevars.captured_vars f) in
+
+    (* Which allocation is required for the things defined here? *)
+    let how1 = match dec.it with
+      (* Mutable variables are, well, mutable *)
+      | VarD _ ->
+        M.map (fun t -> LocalMut (stackrep_of_type t)) d
+
+      (* Constant expressions (trusting static_vals.ml) *)
+      | LetD (_, e) when e.note.Note.const ->
+        M.map (fun _ -> (Const : how)) d
+
+      (* References to mutboxes *)
+      | RefD _ ->
+        M.map (fun _ -> StoreHeap) d
+
+      (* Everything else needs at least a local *)
+      | _ ->
+        M.map (fun t -> LocalImmut (stackrep_of_type t)) d in
+
+    (* Which allocation does this require for its captured things? *)
+    let how2 = how_captured lvl how_all seen captured in
+
+    let how = joins [how0; how1; how2] in
+    let seen' = S.union seen (set_of_map d)
+    in (seen', how)
+
+  (* find the allocHow for the variables currently in scope *)
+  (* we assume things are mutable, as we do not know better here *)
+  let how_of_ae ae : allocHow =
+    M.map (fun (l, _) -> match l with
+    | VarEnv.Const _        -> (Const : how)
+    | VarEnv.HeapStatic _   -> StoreStatic
+    | VarEnv.HeapInd _      -> StoreHeap
+    | VarEnv.Local (sr, _)  -> LocalMut sr (* conservatively assume mutable *)
+    | VarEnv.PublicMethod _ -> LocalMut SR.Vanilla
+    ) ae.VarEnv.vars
+
+  let decs (ae : VarEnv.t) decs captured_in_body : allocHow =
+    let lvl = ae.VarEnv.lvl in
+    let how_outer = how_of_ae ae in
+    let defined_here = snd (Freevars.decs decs) in (* TODO: implement gather_decs more directly *)
+    let how_outer = Freevars.diff how_outer defined_here in (* shadowing *)
+    let how0 = M.map (fun _t -> (Const : how)) defined_here in
+    let captured = S.inter (set_of_map defined_here) captured_in_body in
+    let rec go how =
+      let seen, how1 = List.fold_left (dec lvl how_outer) (S.empty, how) decs in
+      assert (S.equal seen (set_of_map defined_here));
+      let how2 = how_captured lvl how1 seen captured in
+      let how' = join how1 how2 in
+      if M.equal (=) how how' then how' else go how' in
+    go how0
+
+  (* Functions to extend the environment (and possibly allocate memory)
+     based on how we want to store them. *)
+  let add_local env ae how name typ : VarEnv.t * G.t =
+    match M.find name how with
+    | (Const : how) -> (ae, G.nop)
+    | LocalImmut sr | LocalMut sr ->
+      let ae1, _ = VarEnv.add_direct_local env ae name sr typ in
+      (ae1, G.nop)
+    | StoreHeap ->
+      let ae1, i = VarEnv.add_local_with_heap_ind env ae name typ in
+      let alloc_code = MutBox.alloc env ^^ G.i (LocalSet (nr i)) in
+      (ae1, alloc_code)
+    | StoreStatic ->
+      let ptr = MutBox.static env in
+      let ae1 = VarEnv.add_local_heap_static ae name ptr typ in
+      (ae1, G.nop)
+
+  let add_local_for_alias env ae how name typ : VarEnv.t * G.t =
+    match M.find name how with
+    | StoreHeap ->
+      let ae1, _ = VarEnv.add_local_with_heap_ind env ae name typ in
+      ae1, G.nop
+    | _ -> assert false
+
+end (* AllocHow *)
+
+(* The actual compiler code that looks at the AST *)
+
+(* wraps a bigint in range [0…2^32-1] into range [-2^31…2^31-1] *)
+let nat32_to_int32 n =
+  let open Big_int in
+  if ge_big_int n (power_int_positive_int 2 31)
+  then sub_big_int n (power_int_positive_int 2 32)
+  else n
+
+(* wraps a bigint in range [0…2^64-1] into range [-2^63…2^63-1] *)
+let nat64_to_int64 n =
+  let open Big_int in
+  if ge_big_int n (power_int_positive_int 2 63)
+  then sub_big_int n (power_int_positive_int 2 64)
+  else n
+
+let const_lit_of_lit : Ir.lit -> Const.lit = function
+  | BoolLit b     -> Const.Bool b
+  | IntLit n
+  | NatLit n      -> Const.BigInt (Numerics.Nat.to_big_int n)
+  | Int8Lit n     -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Int8 (Numerics.Int_8.to_int n))
+  | Nat8Lit n     -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Nat8 (Numerics.Nat8.to_int n))
+  | Int16Lit n    -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Int16 (Numerics.Int_16.to_int n))
+  | Nat16Lit n    -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Nat16 (Numerics.Nat16.to_int n))
+  | Int32Lit n    -> Const.Word32 (Big_int.int32_of_big_int (Numerics.Int_32.to_big_int n))
+  | Nat32Lit n    -> Const.Word32 (Big_int.int32_of_big_int (nat32_to_int32 (Numerics.Nat32.to_big_int n)))
+  | Int64Lit n    -> Const.Word64 (Big_int.int64_of_big_int (Numerics.Int_64.to_big_int n))
+  | Nat64Lit n    -> Const.Word64 (Big_int.int64_of_big_int (nat64_to_int64 (Numerics.Nat64.to_big_int n)))
+  | CharLit c     -> Const.Vanilla Int32.(shift_left (of_int c) 8)
+  | NullLit       -> Const.Null
+  | TextLit t
+  | BlobLit t     -> Const.Blob t
+  | FloatLit f    -> Const.Float64 f
+
+let const_of_lit lit =
+  Const.t_of_v (Const.Lit (const_lit_of_lit lit))
+
+let compile_lit lit =
+  SR.Const (const_of_lit lit), G.nop
+
+let compile_lit_as env sr_out lit =
+  let sr_in, code = compile_lit lit in
+  code ^^ StackRep.adjust env sr_in sr_out
+
+(* helper, traps with message *)
+let then_arithmetic_overflow env =
+  E.then_trap_with env "arithmetic overflow"
+
+(* The first returned StackRep is for the arguments (expected), the second for the results (produced) *)
+let compile_unop env t op =
+  let open Operator in
+  match op, t with
+  | _, Type.Non ->
+    SR.Vanilla, SR.Unreachable, G.i Unreachable
+  | NegOp, Type.(Prim Int) ->
+    SR.Vanilla, SR.Vanilla,
+    BigNum.compile_neg env
+  | NegOp, Type.(Prim Int64) ->
+      SR.UnboxedWord64, SR.UnboxedWord64,
+      Func.share_code1 env "neg_trap" ("n", I64Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        compile_eq64_const 0x8000000000000000L ^^
+        then_arithmetic_overflow env ^^
+        compile_const_64 0L ^^
+        get_n ^^
+        G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+      )
+  | NegOp, Type.(Prim (Int8 | Int16 | Int32)) ->
+    StackRep.of_type t, StackRep.of_type t,
+    Func.share_code1 env "neg32_trap" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      compile_eq_const 0x80000000l ^^
+      then_arithmetic_overflow env ^^
+      compile_unboxed_zero ^^
+      get_n ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+    )
+  | NegOp, Type.(Prim Float) ->
+    SR.UnboxedFloat64, SR.UnboxedFloat64,
+    G.i (Unary (Wasm.Values.F64 F64Op.Neg))
+  | NotOp, Type.(Prim (Nat64|Int64)) ->
+     SR.UnboxedWord64, SR.UnboxedWord64,
+     compile_xor64_const (-1L)
+  | NotOp, Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty)) ->
+     StackRep.of_type t, StackRep.of_type t,
+     compile_unboxed_const (TaggedSmallWord.mask_of_type ty) ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.Xor))
+  | _ ->
+    todo "compile_unop"
+      (Wasm.Sexpr.Node ("BinOp", [ Arrange_ops.unop op ]))
+      (SR.Vanilla, SR.Unreachable, E.trap_with env "TODO: compile_unop")
+
+(* Logarithmic helpers for deciding whether we can carry out operations in constant bitwidth *)
+
+(* helper, traps with message *)
+let else_arithmetic_overflow env =
+  E.else_trap_with env "arithmetic overflow"
+
+(* helpers to decide if Int64 arithmetic can be carried out on the fast path *)
+let additiveInt64_shortcut fast env get_a get_b slow =
+  get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ compile_shrU64_const 63L ^^
+  get_b ^^ get_b ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ compile_shrU64_const 63L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Or)) ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let mulInt64_shortcut fast env get_a get_b slow =
+  get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  get_b ^^ get_b ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+  compile_const_64 65L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let powInt64_shortcut fast env get_a get_b slow =
+  get_b ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (compile_const_64 1L) (* ^0 *)
+    begin (* ^(1+n) *)
+      get_a ^^ compile_const_64 (-1L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.Eq)) ^^
+      G.if1 I64Type
+        begin (* -1 ** (1+exp) == if even (1+exp) then 1 else -1 *)
+          get_b ^^ compile_const_64 1L ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.And)) ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          G.if1 I64Type
+            (compile_const_64 1L)
+            get_a
+        end
+        begin
+          get_a ^^ compile_shrS64_const 1L ^^
+          G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          G.if1 I64Type
+            get_a (* {0,1}^(1+n) *)
+            begin
+              get_b ^^ compile_const_64 64L ^^
+              G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^ then_arithmetic_overflow env ^^
+              get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^
+              G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ compile_sub64_const 63L ^^
+              get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^
+              compile_const_64 (-63L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+              G.if1 I64Type
+                (get_a ^^ get_b ^^ fast)
+                slow
+            end
+        end
+    end
+
+
+(* kernel for Int64 arithmetic, invokes estimator for fast path *)
+let compile_Int64_kernel env name op shortcut =
+  Func.share_code2 env (prim_fun_name Type.Int64 name)
+    (("a", I64Type), ("b", I64Type)) [I64Type]
+    BigNum.(fun env get_a get_b ->
+    shortcut
+      env
+      get_a
+      get_b
+      begin
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ from_signed_word64 env ^^
+        get_b ^^ from_signed_word64 env ^^
+        op env ^^
+        set_res ^^ get_res ^^
+        fits_signed_bits env 64 ^^
+        else_arithmetic_overflow env ^^
+        get_res ^^ truncate_to_word64 env
+      end)
+
+
+(* helpers to decide if Nat64 arithmetic can be carried out on the fast path *)
+let additiveNat64_shortcut fast env get_a get_b slow =
+  get_a ^^ compile_shrU64_const 62L ^^
+  get_b ^^ compile_shrU64_const 62L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Or)) ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let mulNat64_shortcut fast env get_a get_b slow =
+  get_a ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  get_b ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+  compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let powNat64_shortcut fast env get_a get_b slow =
+  get_b ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (compile_const_64 1L) (* ^0 *)
+    begin (* ^(1+n) *)
+      get_a ^^ compile_shrU64_const 1L ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      G.if1 I64Type
+        get_a (* {0,1}^(1+n) *)
+        begin
+          get_b ^^ compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^ then_arithmetic_overflow env ^^
+          get_a ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ compile_sub64_const 64L ^^
+          get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ compile_const_64 (-64L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+          G.if1 I64Type
+            (get_a ^^ get_b ^^ fast)
+            slow
+        end
+    end
+
+
+(* kernel for Nat64 arithmetic, invokes estimator for fast path *)
+let compile_Nat64_kernel env name op shortcut =
+  Func.share_code2 env (prim_fun_name Type.Nat64 name)
+    (("a", I64Type), ("b", I64Type)) [I64Type]
+    BigNum.(fun env get_a get_b ->
+    shortcut
+      env
+      get_a
+      get_b
+      begin
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ from_word64 env ^^
+        get_b ^^ from_word64 env ^^
+        op env ^^
+        set_res ^^ get_res ^^
+        fits_unsigned_bits env 64 ^^
+        else_arithmetic_overflow env ^^
+        get_res ^^ truncate_to_word64 env
+      end)
+
+
+(* Compiling Int/Nat32 ops by conversion to/from i64. *)
+
+(* helper, expects i64 on stack *)
+let enforce_32_unsigned_bits env =
+  compile_bitand64_const 0xFFFFFFFF00000000L ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  else_arithmetic_overflow env
+
+(* helper, expects two identical i64s on stack *)
+let enforce_32_signed_bits env =
+  compile_shl64_const 1L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^
+  enforce_32_unsigned_bits env
+
+let compile_Int32_kernel env name op =
+     Func.share_code2 env (prim_fun_name Type.Int32 name)
+       (("a", I32Type), ("b", I32Type)) [I32Type]
+       (fun env get_a get_b ->
+         let (set_res, get_res) = new_local64 env "res" in
+         get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+         get_b ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+         G.i (Binary (Wasm.Values.I64 op)) ^^
+         set_res ^^ get_res ^^ get_res ^^
+         enforce_32_signed_bits env ^^
+         get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)))
+
+let compile_Nat32_kernel env name op =
+     Func.share_code2 env (prim_fun_name Type.Nat32 name)
+       (("a", I32Type), ("b", I32Type)) [I32Type]
+       (fun env get_a get_b ->
+         let (set_res, get_res) = new_local64 env "res" in
+         get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+         get_b ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+         G.i (Binary (Wasm.Values.I64 op)) ^^
+         set_res ^^ get_res ^^
+         enforce_32_unsigned_bits env ^^
+         get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)))
+
+(* Customisable kernels for 8/16bit arithmetic via 32 bits. *)
+
+(* helper, expects i32 on stack *)
+let enforce_unsigned_bits env n =
+  compile_bitand_const Int32.(shift_left minus_one n) ^^
+  then_arithmetic_overflow env
+
+let enforce_16_unsigned_bits env = enforce_unsigned_bits env 16
+
+(* helper, expects two identical i32s on stack *)
+let enforce_signed_bits env n =
+  compile_shl_const 1l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+  enforce_unsigned_bits env n
+
+let enforce_16_signed_bits env = enforce_signed_bits env 16
+
+let compile_smallInt_kernel' env ty name op =
+  Func.share_code2 env (prim_fun_name ty name)
+    (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+      let (set_res, get_res) = new_local env "res" in
+      get_a ^^ compile_shrS_const 16l ^^
+      get_b ^^ compile_shrS_const 16l ^^
+      op ^^
+      set_res ^^ get_res ^^ get_res ^^
+      enforce_16_signed_bits env ^^
+      get_res ^^ compile_shl_const 16l)
+
+let compile_smallInt_kernel env ty name op =
+  compile_smallInt_kernel' env ty name (G.i (Binary (Wasm.Values.I32 op)))
+
+let compile_smallNat_kernel' env ty name op =
+  Func.share_code2 env (prim_fun_name ty name)
+    (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+      let (set_res, get_res) = new_local env "res" in
+      get_a ^^ compile_shrU_const 16l ^^
+      get_b ^^ compile_shrU_const 16l ^^
+      op ^^
+      set_res ^^ get_res ^^
+      enforce_16_unsigned_bits env ^^
+      get_res ^^ compile_shl_const 16l)
+
+let compile_smallNat_kernel env ty name op =
+  compile_smallNat_kernel' env ty name (G.i (Binary (Wasm.Values.I32 op)))
+
+(* The first returned StackRep is for the arguments (expected), the second for the results (produced) *)
+let compile_binop env t op : SR.t * SR.t * G.t =
+  if t = Type.Non then SR.Vanilla, SR.Unreachable, G.i Unreachable else
+  StackRep.of_type t,
+  StackRep.of_type t,
+  Operator.(match t, op with
+  | Type.(Prim (Nat | Int)),                  AddOp -> BigNum.compile_add env
+  | Type.(Prim (Nat64|Int64)),                WAddOp -> G.i (Binary (Wasm.Values.I64 I64Op.Add))
+  | Type.(Prim Int64),                        AddOp ->
+    compile_Int64_kernel env "add" BigNum.compile_add
+      (additiveInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Add))))
+  | Type.(Prim Nat64),                        AddOp ->
+    compile_Nat64_kernel env "add" BigNum.compile_add
+      (additiveNat64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Add))))
+  | Type.(Prim Nat),                          SubOp -> BigNum.compile_unsigned_sub env
+  | Type.(Prim Int),                          SubOp -> BigNum.compile_signed_sub env
+  | Type.(Prim (Nat | Int)),                  MulOp -> BigNum.compile_mul env
+  | Type.(Prim (Nat64|Int64)),                WMulOp -> G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+  | Type.(Prim Int64),                        MulOp ->
+    compile_Int64_kernel env "mul" BigNum.compile_mul
+      (mulInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Mul))))
+  | Type.(Prim Nat64),                        MulOp ->
+    compile_Nat64_kernel env "mul" BigNum.compile_mul
+      (mulNat64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Mul))))
+  | Type.(Prim Nat64),                        DivOp -> G.i (Binary (Wasm.Values.I64 I64Op.DivU))
+  | Type.(Prim Nat64) ,                       ModOp -> G.i (Binary (Wasm.Values.I64 I64Op.RemU))
+  | Type.(Prim Int64),                        DivOp -> G.i (Binary (Wasm.Values.I64 I64Op.DivS))
+  | Type.(Prim Int64) ,                       ModOp -> G.i (Binary (Wasm.Values.I64 I64Op.RemS))
+  | Type.(Prim Nat),                          DivOp -> BigNum.compile_unsigned_div env
+  | Type.(Prim Nat),                          ModOp -> BigNum.compile_unsigned_rem env
+  | Type.(Prim (Nat64|Int64)),                WSubOp -> G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+  | Type.(Prim Int64),                        SubOp ->
+    compile_Int64_kernel env "sub" BigNum.compile_signed_sub
+      (additiveInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Sub))))
+  | Type.(Prim Nat64),                        SubOp ->
+    compile_Nat64_kernel env "sub" BigNum.compile_unsigned_sub
+      (fun env get_a get_b ->
+        additiveNat64_shortcut
+          (G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+           else_arithmetic_overflow env ^^
+           get_a ^^ get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub)))
+          env get_a get_b)
+  | Type.(Prim Int),                          DivOp -> BigNum.compile_signed_div env
+  | Type.(Prim Int),                          ModOp -> BigNum.compile_signed_mod env
+
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32),
+                                              WAddOp -> G.i (Binary (Wasm.Values.I32 I32Op.Add))
+  | Type.(Prim Int32),                        AddOp -> compile_Int32_kernel env "add" I64Op.Add
+  | Type.Prim Type.(Int8 | Int16 as ty),      AddOp -> compile_smallInt_kernel env ty "add" I32Op.Add
+  | Type.(Prim Nat32),                        AddOp -> compile_Nat32_kernel env "add" I64Op.Add
+  | Type.Prim Type.(Nat8 | Nat16 as ty),      AddOp -> compile_smallNat_kernel env ty "add" I32Op.Add
+  | Type.(Prim Float),                        AddOp -> G.i (Binary (Wasm.Values.F64 F64Op.Add))
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32),
+                                              WSubOp -> G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+  | Type.(Prim Int32),                        SubOp -> compile_Int32_kernel env "sub" I64Op.Sub
+  | Type.(Prim (Int8|Int16 as ty)),           SubOp -> compile_smallInt_kernel env ty "sub" I32Op.Sub
+  | Type.(Prim Nat32),                        SubOp -> compile_Nat32_kernel env "sub" I64Op.Sub
+  | Type.(Prim (Nat8|Nat16 as ty)),           SubOp -> compile_smallNat_kernel env ty "sub" I32Op.Sub
+  | Type.(Prim Float),                        SubOp -> G.i (Binary (Wasm.Values.F64 F64Op.Sub))
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty),
+                                              WMulOp -> TaggedSmallWord.compile_word_mul env ty
+  | Type.(Prim Int32),                        MulOp -> compile_Int32_kernel env "mul" I64Op.Mul
+  | Type.(Prim Int16),                        MulOp -> compile_smallInt_kernel env Type.Int16 "mul" I32Op.Mul
+  | Type.(Prim Int8),                         MulOp -> compile_smallInt_kernel' env Type.Int8 "mul"
+                                                         (compile_shrS_const 8l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)))
+  | Type.(Prim Nat32),                        MulOp -> compile_Nat32_kernel env "mul" I64Op.Mul
+  | Type.(Prim Nat16),                        MulOp -> compile_smallNat_kernel env Type.Nat16 "mul" I32Op.Mul
+  | Type.(Prim Nat8),                         MulOp -> compile_smallNat_kernel' env Type.Nat8 "mul"
+                                                         (compile_shrU_const 8l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)))
+  | Type.(Prim Float),                        MulOp -> G.i (Binary (Wasm.Values.F64 F64Op.Mul))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     DivOp -> G.i (Binary (Wasm.Values.I32 I32Op.DivU)) ^^
+                                                       TaggedSmallWord.msb_adjust ty
+  | Type.(Prim (Nat8|Nat16|Nat32)),           ModOp -> G.i (Binary (Wasm.Values.I32 I32Op.RemU))
+  | Type.(Prim Int32),                        DivOp -> G.i (Binary (Wasm.Values.I32 I32Op.DivS))
+  | Type.(Prim (Int8|Int16 as ty)),           DivOp ->
+    Func.share_code2 env (prim_fun_name ty "div")
+      (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ get_b ^^ G.i (Binary (Wasm.Values.I32 I32Op.DivS)) ^^
+        TaggedSmallWord.msb_adjust ty ^^ set_res ^^
+        get_a ^^ compile_eq_const 0x80000000l ^^
+        E.if_ env (StackRep.to_block_type env SR.UnboxedWord32)
+          begin
+            get_b ^^ TaggedSmallWord.lsb_adjust ty ^^ compile_eq_const (-1l) ^^
+            E.if_ env (StackRep.to_block_type env SR.UnboxedWord32)
+              (G.i Unreachable)
+              get_res
+          end
+          get_res)
+  | Type.(Prim Float),                        DivOp -> G.i (Binary (Wasm.Values.F64 F64Op.Div))
+  | Type.(Prim Float),                        ModOp -> E.call_import env "rts" "fmod" (* musl *)
+  | Type.(Prim (Int8|Int16|Int32)),           ModOp -> G.i (Binary (Wasm.Values.I32 I32Op.RemS))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     WPowOp -> TaggedSmallWord.compile_nat_power env ty
+  | Type.(Prim (Int8|Int16|Int32 as ty)),     WPowOp -> TaggedSmallWord.compile_int_power env ty
+  | Type.(Prim ((Nat8|Nat16) as ty)),         PowOp ->
+    Func.share_code2 env (prim_fun_name ty "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local env "res" in
+        let bits = TaggedSmallWord.bits_of_type ty in
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrU_const Int32.(sub 33l (of_int bits)) ^^
+            G.if1 I32Type
+              begin
+                unsigned_dynamics get_n ^^ compile_sub_const (Int32.of_int bits) ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-30l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ TaggedSmallWord.lsb_adjust ty ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^
+                TaggedSmallWord.compile_nat_power env Type.Nat32 ^^ set_res ^^
+                get_res ^^ enforce_unsigned_bits env bits ^^
+                get_res ^^ TaggedSmallWord.msb_adjust ty
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          (compile_unboxed_const
+             Int32.(shift_left one (to_int (TaggedSmallWord.shift_of_type ty))))) (* x ** 0 == 1 *)
+  | Type.(Prim Nat32),                        PowOp ->
+    Func.share_code2 env (prim_fun_name Type.Nat32 "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local64 env "res" in
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrU_const 1l ^^
+            G.if1 I32Type
+              begin
+                get_exp ^^ compile_unboxed_const 32l ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^ then_arithmetic_overflow env ^^
+                unsigned_dynamics get_n ^^ compile_sub_const 32l ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust Type.Nat32 ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-62l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+                get_exp ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+                Word64.compile_unsigned_pow env ^^
+                set_res ^^ get_res ^^ enforce_32_unsigned_bits env ^^
+                get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          compile_unboxed_one) (* x ** 0 == 1 *)
+  | Type.(Prim ((Int8|Int16) as ty)),         PowOp ->
+    Func.share_code2 env (prim_fun_name ty "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local env "res" in
+        let bits = TaggedSmallWord.bits_of_type ty in
+        get_exp ^^ compile_unboxed_zero ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ E.then_trap_with env "negative power" ^^
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrS_const Int32.(sub 33l (of_int bits)) ^^
+            G.if1 I32Type
+              begin
+                signed_dynamics get_n ^^ compile_sub_const (Int32.of_int (bits - 1)) ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-30l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ TaggedSmallWord.lsb_adjust ty ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^
+                TaggedSmallWord.compile_nat_power env Type.Nat32 ^^
+                set_res ^^ get_res ^^ get_res ^^ enforce_signed_bits env bits ^^
+                get_res ^^ TaggedSmallWord.msb_adjust ty
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          (compile_unboxed_const
+             Int32.(shift_left one (to_int (TaggedSmallWord.shift_of_type ty))))) (* x ** 0 == 1 *)
+  | Type.(Prim Int32),                        PowOp ->
+    Func.share_code2 env (prim_fun_name Type.Int32 "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local64 env "res" in
+        get_exp ^^ compile_unboxed_zero ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ E.then_trap_with env "negative power" ^^
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_unboxed_one ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeS)) ^^
+            get_n ^^ compile_unboxed_const (-1l) ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+            G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+            G.if1 I32Type
+              begin
+                get_n ^^ compile_unboxed_zero ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+                G.if1 I32Type
+                  begin
+                    (* -1 ** (1+exp) == if even (1+exp) then 1 else -1 *)
+                    get_exp ^^ compile_unboxed_one ^^ G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+                    G.if1 I32Type
+                      get_n
+                      compile_unboxed_one
+                  end
+                  get_n (* n@{0,1} ** (1+exp) == n *)
+              end
+              begin
+                get_exp ^^ compile_unboxed_const 32l ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^ then_arithmetic_overflow env ^^
+                signed_dynamics get_n ^^ compile_sub_const 31l ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust Type.Int32 ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-62l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+                get_exp ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+                Word64.compile_unsigned_pow env ^^
+                set_res ^^ get_res ^^ get_res ^^ enforce_32_signed_bits env ^^
+                get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+              end
+          end
+          compile_unboxed_one) (* x ** 0 == 1 *)
+  | Type.(Prim Int),                          PowOp ->
+    let pow = BigNum.compile_unsigned_pow env in
+    let (set_n, get_n) = new_local env "n" in
+    let (set_exp, get_exp) = new_local env "exp" in
+    set_exp ^^ set_n ^^
+    get_exp ^^ BigNum.compile_is_negative env ^^
+    E.then_trap_with env "negative power" ^^
+    get_n ^^ get_exp ^^ pow
+  | Type.(Prim Nat64),                        WPowOp -> Word64.compile_unsigned_pow env
+  | Type.(Prim Int64),                        WPowOp -> Word64.compile_signed_wpow env
+  | Type.(Prim Nat64),                        PowOp ->
+    compile_Nat64_kernel env "pow"
+      BigNum.compile_unsigned_pow
+      (powNat64_shortcut (Word64.compile_unsigned_pow env))
+  | Type.(Prim Int64),                        PowOp ->
+    let (set_exp, get_exp) = new_local64 env "exp" in
+    set_exp ^^ get_exp ^^
+    compile_const_64 0L ^^
+    G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+    E.then_trap_with env "negative power" ^^
+    get_exp ^^
+    compile_Int64_kernel
+      env "pow" BigNum.compile_unsigned_pow
+      (powInt64_shortcut (Word64.compile_unsigned_pow env))
+  | Type.(Prim Nat),                          PowOp -> BigNum.compile_unsigned_pow env
+  | Type.(Prim Float),                        PowOp -> E.call_import env "rts" "pow" (* musl *)
+  | Type.(Prim (Nat64|Int64)),                AndOp -> G.i (Binary (Wasm.Values.I64 I64Op.And))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              AndOp -> G.i (Binary (Wasm.Values.I32 I32Op.And))
+  | Type.(Prim (Nat64|Int64)),                OrOp  -> G.i (Binary (Wasm.Values.I64 I64Op.Or))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              OrOp  -> G.i (Binary (Wasm.Values.I32 I32Op.Or))
+  | Type.(Prim (Nat64|Int64)),                XorOp -> G.i (Binary (Wasm.Values.I64 I64Op.Xor))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              XorOp -> G.i (Binary (Wasm.Values.I32 I32Op.Xor))
+  | Type.(Prim (Nat64|Int64)),                ShLOp -> G.i (Binary (Wasm.Values.I64 I64Op.Shl))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty)),
+                                              ShLOp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.Shl)))
+  | Type.(Prim Nat64),                        ShROp -> G.i (Binary (Wasm.Values.I64 I64Op.ShrU))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     ShROp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.ShrU)) ^^
+     sanitize_word_result ty)
+  | Type.(Prim Int64),                        ShROp -> G.i (Binary (Wasm.Values.I64 I64Op.ShrS))
+  | Type.(Prim (Int8|Int16|Int32 as ty)),     ShROp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.ShrS)) ^^
+     sanitize_word_result ty)
+  | Type.(Prim (Nat64|Int64)),                RotLOp -> G.i (Binary (Wasm.Values.I64 I64Op.Rotl))
+  | Type.(Prim (Nat32|Int32)),                RotLOp -> G.i (Binary (Wasm.Values.I32 I32Op.Rotl))
+  | Type.(Prim (Nat8|Nat16|Int8|Int16 as ty)),
+                                              RotLOp -> TaggedSmallWord.rotl env ty
+  | Type.(Prim (Nat64|Int64)),                RotROp -> G.i (Binary (Wasm.Values.I64 I64Op.Rotr))
+  | Type.(Prim (Nat32|Int32)),                RotROp -> G.i (Binary (Wasm.Values.I32 I32Op.Rotr))
+  | Type.(Prim (Nat8|Nat16|Int8|Int16 as ty)),
+                                              RotROp -> TaggedSmallWord.rotr env ty
+  | Type.(Prim Text), CatOp -> Text.concat env
+  | Type.Non, _ -> G.i Unreachable
+  | _ -> todo_trap env "compile_binop" (Wasm.Sexpr.Node ("BinOp", [ Arrange_ops.binop op; Arrange_type.typ t]))
+  )
+
+let compile_eq env =
+  let open Type in
+  function
+  | Prim Text -> Text.compare env Operator.EqOp
+  | Prim (Blob|Principal) | Obj (Actor, _) -> Blob.compare env (Some Operator.EqOp)
+  | Func (Shared _, _, _, _, _) -> FuncDec.equate_msgref env
+  | Prim (Nat | Int) -> BigNum.compile_eq env
+  | Prim (Int64 | Nat64) -> G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+  | Prim (Bool | Int8 | Nat8 | Int16 | Nat16 | Int32 | Nat32 | Char) ->
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+  | Non -> G.i Unreachable
+  | Prim Float -> G.i (Compare (Wasm.Values.F64 F64Op.Eq))
+  | t -> todo_trap env "compile_eq" (Arrange_type.typ t)
+
+let get_relops = Operator.(function
+  | GeOp -> Ge, I64Op.GeU, I64Op.GeS, I32Op.GeU, I32Op.GeS
+  | GtOp -> Gt, I64Op.GtU, I64Op.GtS, I32Op.GtU, I32Op.GtS
+  | LeOp -> Le, I64Op.LeU, I64Op.LeS, I32Op.LeU, I32Op.LeS
+  | LtOp -> Lt, I64Op.LtU, I64Op.LtS, I32Op.LtU, I32Op.LtS
+  | NeqOp -> assert false
+  | _ -> failwith "uncovered relop")
+
+let compile_comparison env t op =
+  let bigintop, u64op, s64op, u32op, s32op = get_relops op in
+  let open Type in
+  match t with
+    | Nat | Int -> BigNum.compile_relop env bigintop
+    | Nat64 -> G.i (Compare (Wasm.Values.I64 u64op))
+    | Nat8 | Nat16 | Nat32 | Char -> G.i (Compare (Wasm.Values.I32 u32op))
+    | Int64 -> G.i (Compare (Wasm.Values.I64 s64op))
+    | Int8 | Int16 | Int32 -> G.i (Compare (Wasm.Values.I32 s32op))
+    | _ -> todo_trap env "compile_comparison" (Arrange_type.prim t)
+
+let compile_relop env t op =
+  if t = Type.Non then SR.Vanilla, G.i Unreachable else
+  StackRep.of_type t,
+  let open Operator in
+  match t, op with
+  | Type.(Prim Text), _ -> Text.compare env op
+  | Type.(Prim (Blob|Principal)), _ -> Blob.compare env (Some op)
+  | _, EqOp -> compile_eq env t
+  | Type.(Prim (Nat | Nat8 | Nat16 | Nat32 | Nat64 | Int | Int8 | Int16 | Int32 | Int64 | Char as t1)), op1 ->
+    compile_comparison env t1 op1
+  | Type.(Prim Float), GtOp -> G.i (Compare (Wasm.Values.F64 F64Op.Gt))
+  | Type.(Prim Float), GeOp -> G.i (Compare (Wasm.Values.F64 F64Op.Ge))
+  | Type.(Prim Float), LeOp -> G.i (Compare (Wasm.Values.F64 F64Op.Le))
+  | Type.(Prim Float), LtOp -> G.i (Compare (Wasm.Values.F64 F64Op.Lt))
+  | _ -> todo_trap env "compile_relop" (Arrange_ops.relop op)
+
+let compile_load_field env typ name =
+  Object.load_idx env typ name
+
+
+(* compile_lexp is used for expressions on the left of an assignment operator.
+   Produces
+   * preparation code, to run first
+   * an expected stack rep
+   * code that expects the value to be written in that stackrep, and consumes it
+*)
+let rec compile_lexp (env : E.t) ae lexp : G.t * SR.t * G.t =
+  (fun (code, sr, fill_code) -> G.(with_region lexp.at code, sr, with_region lexp.at fill_code)) @@
+  match lexp.it, !Flags.gc_strategy with
+  | VarLE var, _ -> Var.set_val env ae var
+  | IdxLE (e1, e2), Flags.Generational when potential_pointer (Arr.element_type env e1.note.Note.typ) ->
+    let (set_field, get_field) = new_local env "field" in
+    compile_array_index env ae e1 e2 ^^
+    set_field ^^ (* peepholes to tee *)
+    get_field,
+    SR.Vanilla,
+    store_ptr ^^
+    get_field ^^
+    compile_add_const ptr_unskew ^^
+    E.call_import env "rts" "post_write_barrier"
+  | IdxLE (e1, e2), Flags.Incremental when potential_pointer (Arr.element_type env e1.note.Note.typ) ->
+    compile_array_index env ae e1 e2 ^^
+    compile_add_const ptr_unskew,
+    SR.Vanilla,
+    Tagged.write_with_barrier env
+  | IdxLE (e1, e2), _ ->
+    compile_array_index env ae e1 e2,
+    SR.Vanilla,
+    store_ptr
+  | DotLE (e, n), Flags.Generational when potential_pointer (Object.field_type env e.note.Note.typ n) ->
+    let (set_field, get_field) = new_local env "field" in
+    compile_exp_vanilla env ae e ^^
+    Object.idx env e.note.Note.typ n ^^
+    set_field ^^ (* peepholes to tee *)
+    get_field,
+    SR.Vanilla,
+    store_ptr ^^
+    get_field ^^
+    compile_add_const ptr_unskew ^^
+    E.call_import env "rts" "post_write_barrier"
+  | DotLE (e, n), Flags.Incremental when potential_pointer (Object.field_type env e.note.Note.typ n) ->
+    compile_exp_vanilla env ae e ^^
+    (* Only real objects have mutable fields, no need to branch on the tag *)
+    Object.idx env e.note.Note.typ n ^^
+    compile_add_const ptr_unskew,
+    SR.Vanilla,
+    Tagged.write_with_barrier env
+  | DotLE (e, n), _ ->
+    compile_exp_vanilla env ae e ^^
+    (* Only real objects have mutable fields, no need to branch on the tag *)
+    Object.idx env e.note.Note.typ n,
+    SR.Vanilla,
+    store_ptr
+
+(* Common code for a[e] as lexp and as exp.
+Traps or pushes the pointer to the element on the stack
+*)
+and compile_array_index env ae e1 e2 =
+    compile_exp_vanilla env ae e1 ^^ (* offset to array *)
+    compile_exp_vanilla env ae e2 ^^ (* idx *)
+    Arr.idx_bigint env
+
+and compile_prim_invocation (env : E.t) ae p es at =
+  (* for more concise code when all arguments and result use the same sr *)
+  let const_sr sr inst = sr, G.concat_map (compile_exp_as env ae sr) es ^^ inst in
+
+  begin match p, es with
+  (* Calls *)
+  | CallPrim _, [e1; e2] ->
+    let sort, control, _, arg_tys, ret_tys = Type.as_func e1.note.Note.typ in
+    let n_args = List.length arg_tys in
+    let return_arity = match control with
+      | Type.Returns -> List.length ret_tys
+      | Type.Replies -> 0
+      | Type.Promises -> assert false in
+
+    let fun_sr, code1 = compile_exp env ae e1 in
+
+    (* we duplicate this pattern match to emulate pattern guards *)
+    let call_as_prim = match fun_sr, sort with
+      | SR.Const (_, Const.Fun (mk_fi, Const.PrimWrapper prim)), _ ->
+         begin match n_args, e2.it with
+         | 0, _ -> true
+         | 1, _ -> true
+         | n, PrimE (TupPrim, es) when List.length es = n -> true
+         | _, _ -> false
+         end
+      | _ -> false in
+
+    begin match fun_sr, sort with
+      | SR.Const (_, Const.Fun (mk_fi, Const.PrimWrapper prim)), _ when call_as_prim ->
+         assert (sort = Type.Local);
+         (* Handle argument tuples *)
+         begin match n_args, e2.it with
+         | 0, _ ->
+           let sr, code2 = compile_prim_invocation env ae prim [] at in
+           sr,
+           code1 ^^
+           compile_exp_as env ae (StackRep.of_arity 0) e2 ^^
+           code2
+         | 1, _ ->
+           compile_prim_invocation env ae prim [e2] at
+         | n, PrimE (TupPrim, es) ->
+           assert (List.length es = n);
+           compile_prim_invocation env ae prim es at
+         | _, _ ->
+           (* ugly case; let's just call this as a function for now *)
+           raise (Invalid_argument "call_as_prim was true?")
+         end
+      | SR.Const (_, Const.Fun (mk_fi, _)), _ ->
+         assert (sort = Type.Local);
+         StackRep.of_arity return_arity,
+
+         code1 ^^
+         compile_unboxed_zero ^^ (* A dummy closure *)
+         compile_exp_as env ae (StackRep.of_arity n_args) e2 ^^ (* the args *)
+         G.i (Call (nr (mk_fi ()))) ^^
+         FakeMultiVal.load env (Lib.List.make return_arity I32Type)
+      | _, Type.Local ->
+         let (set_clos, get_clos) = new_local env "clos" in
+
+         StackRep.of_arity return_arity,
+         code1 ^^ StackRep.adjust env fun_sr SR.Vanilla ^^
+         set_clos ^^
+         get_clos ^^
+         Closure.prepare_closure_call env ^^
+         compile_exp_as env ae (StackRep.of_arity n_args) e2 ^^
+         get_clos ^^
+         Closure.call_closure env n_args return_arity
+      | _, Type.Shared _ ->
+         (* Non-one-shot functions have been rewritten in async.ml *)
+         assert (control = Type.Returns);
+
+         let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+         let (set_arg, get_arg) = new_local env "arg" in
+         let _, _, _, ts, _ = Type.as_func e1.note.Note.typ in
+         let add_cycles = Internals.add_cycles env ae in
+
+         StackRep.of_arity return_arity,
+         code1 ^^ StackRep.adjust env fun_sr SR.Vanilla ^^
+         set_meth_pair ^^
+         compile_exp_vanilla env ae e2 ^^ set_arg ^^
+
+         FuncDec.ic_call_one_shot env ts get_meth_pair get_arg add_cycles
+    end
+
+  (* Operators *)
+  | UnPrim (_, Operator.PosOp), [e1] -> compile_exp env ae e1
+  | UnPrim (t, op), [e1] ->
+    let sr_in, sr_out, code = compile_unop env t op in
+    sr_out,
+    compile_exp_as env ae sr_in e1 ^^
+    code
+  | BinPrim (t, op), [e1;e2] ->
+    let sr_in, sr_out, code = compile_binop env t op in
+    sr_out,
+    compile_exp_as env ae sr_in e1 ^^
+    compile_exp_as env ae sr_in e2 ^^
+    code
+  (* special case: recognize negation *)
+  | RelPrim (Type.(Prim Bool), Operator.EqOp), [e1; {it = LitE (BoolLit false); _}] ->
+    SR.bool,
+    compile_exp_as_test env ae e1 ^^
+    G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | RelPrim (t, op), [e1;e2] ->
+    let sr, code = compile_relop env t op in
+    SR.bool,
+    compile_exp_as env ae sr e1 ^^
+    compile_exp_as env ae sr e2 ^^
+    code
+
+  (* Tuples *)
+  | TupPrim, es ->
+    SR.UnboxedTuple (List.length es),
+    G.concat_map (compile_exp_vanilla env ae) es
+  | ProjPrim n, [e1] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^ (* offset to tuple (an array) *)
+    Tuple.load_n env (Int32.of_int n)
+
+  | OptPrim, [e] ->
+    SR.Vanilla,
+    Opt.inject env (compile_exp_vanilla env ae e)
+  | TagPrim l, [e] ->
+    SR.Vanilla,
+    Variant.inject env l (compile_exp_vanilla env ae e)
+
+  | DotPrim name, [e] ->
+    let sr, code1 = compile_exp env ae e in
+    begin match sr with
+    | SR.Const (_, Const.Obj fs) ->
+      let c = List.assoc name fs in
+      SR.Const c, code1
+    | _ ->
+      SR.Vanilla,
+      code1 ^^ StackRep.adjust env sr SR.Vanilla ^^
+      Object.load_idx env e.note.Note.typ name
+    end
+  | ActorDotPrim name, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    IC.actor_public_field env name
+
+  | ArrayPrim (m, t), es ->
+    SR.Vanilla,
+    Arr.lit env (List.map (compile_exp_vanilla env ae) es)
+  | IdxPrim, [e1; e2] ->
+    SR.Vanilla,
+    compile_array_index env ae e1 e2 ^^
+    load_ptr
+  | NextArrayOffset spacing, [e] ->
+    let advance_by =
+      match spacing with
+      | ElementSize -> Arr.element_size
+      | One -> 2l (* 1 : Nat *) in
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^ (* previous byte offset to array *)
+    compile_add_const advance_by
+  | ValidArrayOffset, [e1; e2] ->
+    SR.bool,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_vanilla env ae e2 ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+  | DerefArrayOffset, [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^ (* skewed pointer to array *)
+    Tagged.load_forwarding_pointer env ^^
+    compile_exp_vanilla env ae e2 ^^ (* byte offset *)
+    (* Note: the below two lines compile to `i32.add; i32.load offset=OFFSET`
+       with OFFSET = 13 with forwarding pointers and OFFSET = 9 without forwarding pointers,
+       thus together also unskewing the pointer and skipping administrative
+       fields, effectively arriving at the desired element *)
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    (* Not using Tagged.load_field since it is not a proper pointer to the array start *)
+    Heap.load_field (Arr.header_size env) (* loads the element at the byte offset *)
+  | GetPastArrayOffset spacing, [e] ->
+    let shift =
+      match spacing with
+      | ElementSize -> compile_shl_const 2l (* effectively a multiplication by word_size *)
+      | One -> BigNum.from_word30 env in    (* make it a compact bignum *)
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^ (* array *)
+    Arr.len env ^^
+    shift
+
+  | BreakPrim name, [e] ->
+    let d = VarEnv.get_label_depth ae name in
+    SR.Unreachable,
+    compile_exp_vanilla env ae e ^^
+    G.branch_to_ d
+  | AssertPrim, [e1] ->
+    SR.unit,
+    compile_exp_as env ae SR.bool e1 ^^
+    G.if0 G.nop (IC.fail_assert env at)
+  | RetPrim, [e] ->
+    SR.Unreachable,
+    compile_exp_as env ae (StackRep.of_arity (E.get_return_arity env)) e ^^
+    FakeMultiVal.store env (Lib.List.make (E.get_return_arity env) I32Type) ^^
+    G.i Return
+
+  (* Numeric conversions *)
+  | NumConvWrapPrim (t1, t2), [e] -> begin
+    let open Type in
+    match t1, t2 with
+    | (Nat|Int), (Nat8|Nat16|Int8|Int16) ->
+      SR.Vanilla,
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_intToWordNShifted env (TaggedSmallWord.shift_of_type t2)
+
+    | (Nat|Int), (Nat32|Int32) ->
+      SR.UnboxedWord32,
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_intToWord32 env
+
+    | (Nat|Int), (Nat64|Int64) ->
+      SR.UnboxedWord64,
+      compile_exp_vanilla env ae e ^^
+      BigNum.truncate_to_word64 env
+
+    | Nat64, Int64 | Int64, Nat64
+    | Nat32, Int32 | Int32, Nat32
+    | Nat16, Int16 | Int16, Nat16
+    | Nat8, Int8 | Int8, Nat8 ->
+      compile_exp env ae e
+
+    | Char, Nat32 ->
+      SR.UnboxedWord32,
+      compile_exp_vanilla env ae e ^^
+      TaggedSmallWord.untag_codepoint
+
+    | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+    end
+
+  | NumConvTrapPrim (t1, t2), [e] -> begin
+    let open Type in
+    match t1, t2 with
+
+    | Int, Int64 ->
+      SR.UnboxedWord64,
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 env "Int->Int64" ("n", I32Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_signed_bits env 64 ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word64 env)
+
+    | Int, (Int8|Int16|Int32 as pty) ->
+      StackRep.of_type (Prim pty),
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 env (prim_fun_name pty "Int->") ("n", I32Type) [I32Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_signed_bits env (TaggedSmallWord.bits_of_type pty) ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word32 env ^^
+        TaggedSmallWord.msb_adjust pty)
+
+    | Nat, Nat64 ->
+      SR.UnboxedWord64,
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 env "Nat->Nat64" ("n", I32Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_unsigned_bits env 64 ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word64 env)
+
+    | Nat, (Nat8|Nat16|Nat32 as pty) ->
+      StackRep.of_type (Prim pty),
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 env (prim_fun_name pty "Nat->") ("n", I32Type) [I32Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_unsigned_bits env (TaggedSmallWord.bits_of_type pty) ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word32 env ^^
+        TaggedSmallWord.msb_adjust pty)
+
+    | (Nat8|Nat16), Nat ->
+      SR.Vanilla,
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_shiftWordNtoUnsigned env (TaggedSmallWord.shift_of_type t1)
+
+    | (Int8|Int16), Int ->
+      SR.Vanilla,
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_shiftWordNtoSigned env (TaggedSmallWord.shift_of_type t1)
+
+    | Nat32, Nat ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedWord32 e ^^
+      Prim.prim_word32toNat env
+
+    | Int32, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedWord32 e ^^
+      Prim.prim_word32toInt env
+
+    | Nat64, Nat ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedWord64 e ^^
+      BigNum.from_word64 env
+
+    | Int64, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedWord64 e ^^
+      BigNum.from_signed_word64 env
+
+    | Nat32, Char ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedWord32 e ^^
+      TaggedSmallWord.check_and_tag_codepoint env
+
+    | Float, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedFloat64 e ^^
+      E.call_import env "rts" "bigint_of_float64"
+
+    | Int, Float ->
+      SR.UnboxedFloat64,
+      compile_exp_vanilla env ae e ^^
+      E.call_import env "rts" "bigint_to_float64"
+
+    | Float, Int64 ->
+      SR.UnboxedWord64,
+      compile_exp_as env ae SR.UnboxedFloat64 e ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.TruncSF64))
+
+    | Int64, Float ->
+      SR.UnboxedFloat64,
+      compile_exp_as env ae SR.UnboxedWord64 e ^^
+      G.i (Convert (Wasm.Values.F64 F64Op.ConvertSI64))
+
+    | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+    end
+
+  | SerializePrim ts, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Serialization.serialize env ts ^^
+    Blob.of_ptr_size env
+
+  | DeserializePrim ts, [e] ->
+    StackRep.of_arity (List.length ts),
+    compile_exp_vanilla env ae e ^^
+    Bool.lit false ^^ (* can't recover *)
+    Serialization.deserialize_from_blob false env ts
+
+  | DeserializeOptPrim ts, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Bool.lit true ^^ (* can (!) recover *)
+    Serialization.deserialize_from_blob false env ts ^^
+    begin match ts with
+    | [] ->
+      (* return some () *)
+      Opt.inject env Tuple.compile_unit
+    | [t] ->
+      (* save to local, propagate error as null or return some value *)
+      let (set_val, get_val) = new_local env "val" in
+      set_val ^^
+      get_val ^^
+      compile_eq_const (Serialization.coercion_error_value env) ^^
+      G.if1 I32Type
+        (Opt.null_lit env)
+        (Opt.inject env get_val)
+    | ts ->
+      (* propagate any errors as null or return some tuples using shared code *)
+      let n = List.length ts in
+      let name = Printf.sprintf "to_opt_%i_tuple" n in
+      let args = Lib.List.table n (fun i -> (Printf.sprintf "arg%i" i, I32Type)) in
+      Func.share_code env name args [I32Type] (fun env ->
+        let locals =
+          Lib.List.table n (fun i -> G.i (LocalGet (nr (Int32.of_int i)))) in
+        let rec go ls =
+          match ls with
+          | get_val::ls' ->
+            get_val ^^
+            compile_eq_const (Serialization.coercion_error_value env) ^^
+            G.if1 I32Type
+              (Opt.null_lit env)
+              (go ls')
+          | [] ->
+            Opt.inject env (Arr.lit env locals)
+        in
+        go locals)
+    end
+
+  | ICPerformGC, [] ->
+    SR.unit,
+    GC.collect_garbage env
+
+  | ICStableSize t, [e] ->
+    SR.UnboxedWord64,
+    let (tydesc, _, _) = Serialization.type_desc env [t] in
+    let tydesc_len = Int32.of_int (String.length tydesc) in
+    compile_exp_vanilla env ae e ^^
+    Serialization.buffer_size env t ^^
+    G.i Drop ^^
+    compile_add_const tydesc_len ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+
+  (* Other prims, unary *)
+
+  | OtherPrim "array_len", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Arr.len env ^^
+    BigNum.from_word30 env
+
+  | OtherPrim "text_len", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Text.len_nat env
+  | OtherPrim "text_iter", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Text.iter env
+  | OtherPrim "text_iter_done", [e] ->
+    SR.bool, compile_exp_vanilla env ae e ^^ Text.iter_done env
+  | OtherPrim "text_iter_next", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Text.iter_next env
+  | OtherPrim "text_compare", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_vanilla env ae e2 ^^
+    E.call_import env "rts" "text_compare" ^^
+    TaggedSmallWord.msb_adjust Type.Int8
+  | OtherPrim "blob_compare", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_vanilla env ae e2 ^^
+    Blob.compare env None
+
+  | OtherPrim "blob_size", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Blob.len_nat env
+  | OtherPrim "blob_vals_iter", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Blob.iter env
+  | OtherPrim "blob_iter_done", [e] ->
+    SR.bool, compile_exp_vanilla env ae e ^^ Blob.iter_done env
+  | OtherPrim "blob_iter_next", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Blob.iter_next env
+
+  | OtherPrim "lsh_Nat", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_as env ae SR.UnboxedWord32 e2 ^^
+    BigNum.compile_lsh env
+
+  | OtherPrim "rsh_Nat", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_as env ae SR.UnboxedWord32 e2 ^^
+    BigNum.compile_rsh env
+
+  | OtherPrim "abs", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    BigNum.compile_abs env
+
+  | OtherPrim "fabs", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Abs))
+
+  | OtherPrim "fsqrt", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Sqrt))
+
+  | OtherPrim "fceil", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Ceil))
+
+  | OtherPrim "ffloor", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Floor))
+
+  | OtherPrim "ftrunc", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Trunc))
+
+  | OtherPrim "fnearest", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Nearest))
+
+  | OtherPrim "fmin", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.Min))
+
+  | OtherPrim "fmax", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.Max))
+
+  | OtherPrim "fcopysign", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.CopySign))
+
+  | OtherPrim "Float->Text", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Nat8 6) ^^
+    compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Nat8 0) ^^
+    E.call_import env "rts" "float_fmt"
+
+  | OtherPrim "fmtFloat->Text", [f; prec; mode] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    compile_exp_vanilla env ae prec ^^
+    compile_exp_vanilla env ae mode ^^
+    E.call_import env "rts" "float_fmt"
+
+  | OtherPrim "fsin", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "sin" (* musl *)
+
+  | OtherPrim "fcos", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "cos" (* musl *)
+
+  | OtherPrim "ftan", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "tan" (* musl *)
+
+  | OtherPrim "fasin", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "asin" (* musl *)
+
+  | OtherPrim "facos", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "acos" (* musl *)
+
+  | OtherPrim "fatan", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "atan" (* musl *)
+
+  | OtherPrim "fatan2", [y; x] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 y ^^
+    compile_exp_as env ae SR.UnboxedFloat64 x ^^
+    E.call_import env "rts" "atan2" (* musl *)
+
+  | OtherPrim "fexp", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "exp" (* musl *)
+
+  | OtherPrim "flog", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "log" (* musl *)
+
+  (* Other prims, nullary *)
+
+  | SystemTimePrim, [] ->
+    SR.UnboxedWord64,
+    IC.get_system_time env
+
+  | OtherPrim "call_perform_status", [] ->
+    SR.UnboxedWord32,
+    IC.get_call_perform_status env
+
+  | OtherPrim "call_perform_message", [] ->
+    SR.Vanilla,
+    IC.get_call_perform_message env
+
+  | OtherPrim "rts_version", [] ->
+    SR.Vanilla,
+    E.call_import env "rts" "version"
+
+  | OtherPrim "rts_heap_size", [] ->
+    SR.Vanilla,
+    Heap.get_heap_size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_memory_size", [] ->
+    SR.Vanilla,
+    Heap.get_memory_size ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_total_allocation", [] ->
+    SR.Vanilla,
+    Heap.get_total_allocation env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_reclaimed", [] ->
+    SR.Vanilla,
+    Heap.get_reclaimed env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_max_live_size", [] ->
+    SR.Vanilla,
+    Heap.get_max_live_size env ^^ BigNum.from_word32 env
+
+  | OtherPrim "rts_max_stack_size", [] ->
+    SR.Vanilla,
+    Stack.get_max_stack_size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_callback_table_count", [] ->
+    SR.Vanilla,
+    ContinuationTable.count env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_callback_table_size", [] ->
+    SR.Vanilla,
+    ContinuationTable.size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_mutator_instructions", [] ->
+    SR.Vanilla,
+    GC.get_mutator_instructions env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_collector_instructions", [] ->
+    SR.Vanilla,
+    GC.get_collector_instructions env ^^ BigNum.from_word64 env
+
+  (* Other prims, unary *)
+
+  | OtherPrim "global_timer_set", [e] ->
+    SR.UnboxedWord64,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    IC.system_call env "global_timer_set"
+
+  | OtherPrim "is_controller", [e] ->
+    SR.Vanilla,
+    let set_principal, get_principal = new_local env "principal" in
+    compile_exp_vanilla env ae e ^^
+    set_principal ^^ get_principal ^^
+    Blob.payload_ptr_unskewed env ^^
+    get_principal ^^
+    Blob.len env ^^
+    IC.is_controller env
+
+  | OtherPrim "canister_version", [] ->
+    SR.UnboxedWord64,
+    IC.canister_version env
+
+  | OtherPrim "crc32Hash", [e] ->
+    SR.UnboxedWord32,
+    compile_exp_vanilla env ae e ^^
+    E.call_import env "rts" "compute_crc32"
+
+  | OtherPrim "idlHash", [e] ->
+    SR.Vanilla,
+    E.trap_with env "idlHash only implemented in interpreter"
+
+
+  | OtherPrim "popcnt8", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Nat8
+  | OtherPrim "popcnt16", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Nat16
+  | OtherPrim "popcnt32", [e] ->
+    SR.UnboxedWord32,
+    compile_exp_as env ae SR.UnboxedWord32 e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt))
+  | OtherPrim "popcnt64", [e] ->
+    SR.UnboxedWord64,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    G.i (Unary (Wasm.Values.I64 I64Op.Popcnt))
+  | OtherPrim "clz8", [e] -> SR.Vanilla, compile_exp_vanilla env ae e ^^ TaggedSmallWord.clz_kernel Type.Nat8
+  | OtherPrim "clz16", [e] -> SR.Vanilla, compile_exp_vanilla env ae e ^^ TaggedSmallWord.clz_kernel Type.Nat16
+  | OtherPrim "clz32", [e] -> SR.UnboxedWord32, compile_exp_as env ae SR.UnboxedWord32 e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+  | OtherPrim "clz64", [e] -> SR.UnboxedWord64, compile_exp_as env ae SR.UnboxedWord64 e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz))
+  | OtherPrim "ctz8", [e] -> SR.Vanilla, compile_exp_vanilla env ae e ^^ TaggedSmallWord.ctz_kernel Type.Nat8
+  | OtherPrim "ctz16", [e] -> SR.Vanilla, compile_exp_vanilla env ae e ^^ TaggedSmallWord.ctz_kernel Type.Nat16
+  | OtherPrim "ctz32", [e] -> SR.UnboxedWord32, compile_exp_as env ae SR.UnboxedWord32 e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Ctz))
+  | OtherPrim "ctz64", [e] -> SR.UnboxedWord64, compile_exp_as env ae SR.UnboxedWord64 e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Ctz))
+
+  | OtherPrim "conv_Char_Text", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Text.prim_showChar env
+
+  | OtherPrim "char_to_upper", [e] ->
+    compile_char_to_char_rts env ae e "char_to_upper"
+
+  | OtherPrim "char_to_lower", [e] ->
+    compile_char_to_char_rts env ae e "char_to_lower"
+
+  | OtherPrim "char_is_whitespace", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_whitespace"
+
+  | OtherPrim "char_is_lowercase", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_lowercase"
+
+  | OtherPrim "char_is_uppercase", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_uppercase"
+
+  | OtherPrim "char_is_alphabetic", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_alphabetic"
+
+  | OtherPrim "print", [e] ->
+    SR.unit,
+    compile_exp_vanilla env ae e ^^
+    IC.print_text env
+
+  | OtherPrim "performanceCounter", [e] ->
+    SR.UnboxedWord64,
+    compile_exp_as env ae SR.UnboxedWord32 e ^^
+    IC.performance_counter env
+
+  | OtherPrim "trap", [e] ->
+    SR.Unreachable,
+    compile_exp_vanilla env ae e ^^
+    IC.trap_text env
+
+  | OtherPrim ("blobToArray" | "blobToArrayMut"), e ->
+    const_sr SR.Vanilla (Arr.ofBlob env)
+  | OtherPrim ("arrayToBlob" | "arrayMutToBlob"), e ->
+    const_sr SR.Vanilla (Arr.toBlob env)
+
+  | OtherPrim ("stableMemoryLoadNat32" | "stableMemoryLoadInt32"), [e] ->
+    SR.UnboxedWord32,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word32 env
+
+  | OtherPrim ("stableMemoryStoreNat32" | "stableMemoryStoreInt32"), [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.UnboxedWord32 e2 ^^
+    StableMem.store_word32 env
+
+  | OtherPrim "stableMemoryLoadNat8", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word8 env ^^
+    TaggedSmallWord.msb_adjust Type.Nat8
+
+  | OtherPrim "stableMemoryLoadInt8", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word8 env ^^
+    TaggedSmallWord.msb_adjust Type.Int8
+
+  (* Other prims, binary *)
+
+  | OtherPrim "stableMemoryStoreNat8", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^ TaggedSmallWord.lsb_adjust Type.Nat8 ^^
+    StableMem.store_word8 env
+
+  | OtherPrim "stableMemoryStoreInt8", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^ TaggedSmallWord.lsb_adjust Type.Int8 ^^
+    StableMem.store_word8 env
+
+  | OtherPrim "stableMemoryLoadNat16", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word16 env ^^
+    TaggedSmallWord.msb_adjust Type.Nat16
+
+  | OtherPrim "stableMemoryLoadInt16", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word16 env ^^
+    TaggedSmallWord.msb_adjust Type.Int16
+
+  | OtherPrim "stableMemoryStoreNat16", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^ TaggedSmallWord.lsb_adjust Type.Nat16 ^^
+    StableMem.store_word16 env
+
+  | OtherPrim "stableMemoryStoreInt16", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^ TaggedSmallWord.lsb_adjust Type.Int16 ^^
+    StableMem.store_word16 env
+
+  | OtherPrim ("stableMemoryLoadNat64" | "stableMemoryLoadInt64"), [e] ->
+    SR.UnboxedWord64,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_word64 env
+
+  | OtherPrim ("stableMemoryStoreNat64" | "stableMemoryStoreInt64"), [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.UnboxedWord64 e2 ^^
+    StableMem.store_word64 env
+
+  | OtherPrim "stableMemoryLoadFloat", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.load_float64 env
+
+  | OtherPrim "stableMemoryStoreFloat", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.UnboxedFloat64 e2 ^^
+    StableMem.store_float64 env
+
+  | OtherPrim "stableMemoryLoadBlob", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    Blob.lit env "Blob size out of bounds" ^^
+    BigNum.to_word32_with env ^^
+    StableMem.load_blob env
+
+  | OtherPrim "stableMemoryStoreBlob", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.UnboxedWord64 e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    StableMem.store_blob env
+
+  | OtherPrim "stableMemorySize", [] ->
+    SR.UnboxedWord64,
+    StableMem.get_mem_size env
+  | OtherPrim "stableMemoryGrow", [e] ->
+    SR.UnboxedWord64,
+    compile_exp_as env ae SR.UnboxedWord64 e ^^
+    StableMem.logical_grow env
+
+  | OtherPrim "stableVarQuery", [] ->
+    SR.UnboxedTuple 2,
+    IC.get_self_reference env ^^
+    Blob.lit env Type.(motoko_stable_var_info_fld.lab)
+
+  (* Other prims, binary*)
+  | OtherPrim "Array.init", [_;_] ->
+    const_sr SR.Vanilla (Arr.init env)
+  | OtherPrim "Array.tabulate", [_;_] ->
+    const_sr SR.Vanilla (Arr.tabulate env)
+  | OtherPrim "btst8", [_;_] ->
+    (* TODO: btstN returns Bool, not a small value *)
+    const_sr SR.Vanilla (TaggedSmallWord.btst_kernel env Type.Nat8)
+  | OtherPrim "btst16", [_;_] ->
+    const_sr SR.Vanilla (TaggedSmallWord.btst_kernel env Type.Nat16)
+  | OtherPrim "btst32", [_;_] ->
+    const_sr SR.UnboxedWord32 (TaggedSmallWord.btst_kernel env Type.Nat32)
+  | OtherPrim "btst64", [_;_] ->
+    const_sr SR.UnboxedWord64 (
+      let (set_b, get_b) = new_local64 env "b" in
+      set_b ^^ compile_const_64 1L ^^ get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.And))
+    )
+
+  (* Coercions for abstract types *)
+  | CastPrim (_,_), [e] ->
+    compile_exp env ae e
+
+  | DecodeUtf8, [_] ->
+    const_sr SR.Vanilla (Text.of_blob env)
+  | EncodeUtf8, [_] ->
+    const_sr SR.Vanilla (Text.to_blob env)
+
+  (* textual to bytes *)
+  | BlobOfIcUrl, [_] ->
+    const_sr SR.Vanilla (E.call_import env "rts" "blob_of_principal")
+  (* The other direction *)
+  | IcUrlOfBlob, [_] ->
+    const_sr SR.Vanilla (E.call_import env "rts" "principal_of_blob")
+
+  (* Actor ids are blobs in the RTS *)
+  | ActorOfIdBlob _, [e] ->
+    compile_exp env ae e
+
+  | SelfRef _, [] ->
+    SR.Vanilla, IC.get_self_reference env
+
+  | ICArgDataPrim, [] ->
+    SR.Vanilla, IC.arg_data env
+
+  | ICReplyPrim ts, [e] ->
+    SR.unit, begin match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      compile_exp_vanilla env ae e ^^
+      (* TODO: We can try to avoid the boxing and pass the arguments to
+        serialize individually *)
+      Serialization.serialize env ts ^^
+      IC.reply_with_data env
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot reply when running locally")
+    end
+
+  | ICRejectPrim, [e] ->
+    SR.unit, IC.reject env (compile_exp_vanilla env ae e)
+
+  | ICCallerPrim, [] ->
+    SR.Vanilla, IC.caller env
+
+  | ICCallPrim, [f;e;k;r] ->
+    SR.unit, begin
+    (* TBR: Can we do better than using the notes? *)
+    let _, _, _, ts1, _ = Type.as_func f.note.Note.typ in
+    let _, _, _, ts2, _ = Type.as_func k.note.Note.typ in
+    let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+    let (set_arg, get_arg) = new_local env "arg" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let add_cycles = Internals.add_cycles env ae in
+    compile_exp_vanilla env ae f ^^ set_meth_pair ^^
+    compile_exp_vanilla env ae e ^^ set_arg ^^
+    compile_exp_vanilla env ae k ^^ set_k ^^
+    compile_exp_vanilla env ae r ^^ set_r ^^
+    FuncDec.ic_call env ts1 ts2 get_meth_pair get_arg get_k get_r add_cycles
+    end
+  | ICCallRawPrim, [p;m;a;k;r] ->
+    SR.unit, begin
+    let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+    let (set_arg, get_arg) = new_local env "arg" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let add_cycles = Internals.add_cycles env ae in
+    compile_exp_vanilla env ae p ^^
+    compile_exp_vanilla env ae m ^^ Text.to_blob env ^^
+    Tagged.load_forwarding_pointer env ^^
+    Tuple.from_stack env 2 ^^ set_meth_pair ^^
+    compile_exp_vanilla env ae a ^^ set_arg ^^
+    compile_exp_vanilla env ae k ^^ set_k ^^
+    compile_exp_vanilla env ae r ^^ set_r ^^
+    FuncDec.ic_call_raw env get_meth_pair get_arg get_k get_r add_cycles
+    end
+
+  | ICMethodNamePrim, [] ->
+    SR.Vanilla, IC.method_name env
+
+  | ICStableRead ty, [] ->
+    (*
+      * On initial install:
+        1. return record of nulls
+      * On upgrade:
+        1. deserialize stable store to v : ty,
+        2. return v
+    *)
+    SR.Vanilla,
+    Stabilization.destabilize env ty
+  | ICStableWrite ty, [e] ->
+    SR.unit,
+    compile_exp_vanilla env ae e ^^
+    Stabilization.stabilize env ty
+
+  (* Cycles *)
+  | SystemCyclesBalancePrim, [] ->
+    SR.Vanilla, Cycles.balance env
+  | SystemCyclesAddPrim, [e1] ->
+    SR.unit, compile_exp_vanilla env ae e1 ^^ Cycles.add env
+  | SystemCyclesAcceptPrim, [e1] ->
+    SR.Vanilla, compile_exp_vanilla env ae e1 ^^ Cycles.accept env
+  | SystemCyclesAvailablePrim, [] ->
+    SR.Vanilla, Cycles.available env
+  | SystemCyclesRefundedPrim, [] ->
+    SR.Vanilla, Cycles.refunded env
+
+  | SetCertifiedData, [e1] ->
+    SR.unit, compile_exp_vanilla env ae e1 ^^ IC.set_certified_data env
+  | GetCertificate, [] ->
+    SR.Vanilla,
+    IC.get_certificate env
+
+  (* Unknown prim *)
+  | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+  end
+
+(* Compile, infer and return stack representation *)
+and compile_exp (env : E.t) ae exp =
+  compile_exp_with_hint env ae None exp
+
+(* Compile to given stack representation *)
+and compile_exp_as env ae sr_out e =
+  let sr_in, code = compile_exp_with_hint env ae (Some sr_out) e in
+  code ^^ StackRep.adjust env sr_in sr_out
+
+and single_case e (cs : Ir.case list) =
+  match cs, e.note.Note.typ with
+  | [{it={pat={it=TagP (l, _);_}; _}; _}], Type.(Variant [{lab; _}]) -> l = lab
+  | _ -> false
+
+and known_tag_pat p = TagP ("", p)
+
+and simplify_cases e (cs : Ir.case list) =
+  match cs, e.note.Note.typ with
+  (* for a 2-cased variant type, the second comparison can be omitted when the first pattern
+     (with irrefutable subpattern) didn't match, and the pattern types line up *)
+  | [{it={pat={it=TagP (l1, ip); _}; _}; _} as c1; {it={pat={it=TagP (l2, pat'); _} as pat2; exp}; _} as c2], Type.(Variant [{lab=el1; _}; {lab=el2; _}])
+       when Ir_utils.is_irrefutable ip
+            && (l1 = el1 || l1 = el2)
+            && (l2 = el1 || l2 = el2) ->
+     [c1; {c2 with it = {exp; pat = {pat2 with it = known_tag_pat pat'}}}]
+  | _ -> cs
+
+(* Compile, infer and return stack representation, taking the hint into account *)
+and compile_exp_with_hint (env : E.t) ae sr_hint exp =
+  (fun (sr,code) -> (sr, G.with_region exp.at code)) @@
+  if exp.note.Note.const
+  then let (c, fill) = compile_const_exp env ae exp in fill env ae; (SR.Const c, G.nop)
+  else match exp.it with
+  | PrimE (p, es) when List.exists (fun e -> Type.is_non e.note.Note.typ) es ->
+    (* Handle dead code separately, so that we can rely on useful type
+       annotations below *)
+    SR.Unreachable,
+    G.concat_map (compile_exp_ignore env ae) es ^^
+    G.i Unreachable
+
+  | PrimE (p, es) ->
+    compile_prim_invocation (env : E.t) ae p es exp.at
+  | VarE var ->
+    Var.get_val env ae var
+  | AssignE (e1,e2) ->
+    SR.unit,
+    let (prepare_code, sr, store_code) = compile_lexp env ae e1 in
+    prepare_code ^^
+    compile_exp_as env ae sr e2 ^^
+    store_code
+  | LitE l ->
+    compile_lit l
+  | IfE (scrut, e1, e2) ->
+    let code_scrut = compile_exp_as_test env ae scrut in
+    let sr1, code1 = compile_exp_with_hint env ae sr_hint e1 in
+    let sr2, code2 = compile_exp_with_hint env ae sr_hint e2 in
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let sr = match sr_hint with
+      | Some sr -> sr
+      | None -> StackRep.join sr1 sr2
+    in
+    sr,
+    code_scrut ^^
+    FakeMultiVal.if_ env
+      (StackRep.to_block_type env sr)
+      (code1 ^^ StackRep.adjust env sr1 sr)
+      (code2 ^^ StackRep.adjust env sr2 sr)
+  | BlockE (decs, exp) ->
+    let captured = Freevars.captured_vars (Freevars.exp exp) in
+    let ae', codeW1 = compile_decs env ae decs captured in
+    let (sr, code2) = compile_exp_with_hint env ae' sr_hint exp in
+    (sr, codeW1 code2)
+  | LabelE (name, _ty, e) ->
+    (* The value here can come from many places -- the expression,
+       or any of the nested returns. Hard to tell which is the best
+       stack representation here.
+       So let’s go with Vanilla. *)
+    SR.Vanilla,
+    E.block_ env (StackRep.to_block_type env SR.Vanilla) (
+      G.with_current_depth (fun depth ->
+        let ae1 = VarEnv.add_label ae name depth in
+        compile_exp_vanilla env ae1 e
+      )
+    )
+  | LoopE e ->
+    SR.Unreachable,
+    let ae' = VarEnv.{ ae with lvl = NotTopLvl } in
+    G.loop0 (compile_exp_unit env ae' e ^^ G.i (Br (nr 0l))
+    )
+    ^^
+   G.i Unreachable
+
+  | SwitchE (e, cs) when single_case e cs ->
+    let code1 = compile_exp_vanilla env ae e in
+    let [@warning "-8"] [{it={pat={it=TagP (_, pat');_} as pat; exp}; _}] = cs in
+    let ae1, pat_code = compile_pat_local env ae {pat with it = known_tag_pat pat'} in
+    let sr, rhs_code = compile_exp_with_hint env ae1 sr_hint exp in
+
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let final_sr = match sr_hint with
+      | Some sr -> sr
+      | None -> sr
+    in
+
+    final_sr,
+    (* Run rest in block to exit from *)
+    FakeMultiVal.block_ env (StackRep.to_block_type env final_sr) (fun branch_code ->
+       orsPatternFailure env (List.map (fun (sr, c) ->
+          c ^^^ CannotFail (StackRep.adjust env sr final_sr ^^ branch_code)
+       ) [sr, CannotFail code1 ^^^ pat_code ^^^ CannotFail rhs_code]) ^^
+       G.i Unreachable (* We should always exit using the branch_code *)
+    )
+
+  | SwitchE (e, cs) ->
+    let code1 = compile_exp_vanilla env ae e in
+    let (set_i, get_i) = new_local env "switch_in" in
+
+    (* compile subexpressions and collect the provided stack reps *)
+    let codes = List.map (fun {it={pat; exp=e}; _} ->
+      let (ae1, pat_code) = compile_pat_local env ae pat in
+      let (sr, rhs_code) = compile_exp_with_hint env ae1 sr_hint e in
+      (sr, CannotFail get_i ^^^ pat_code ^^^ CannotFail rhs_code)
+      ) (simplify_cases e cs) in
+
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let final_sr = match sr_hint with
+      | Some sr -> sr
+      | None -> StackRep.joins (List.map fst codes)
+    in
+
+    final_sr,
+    (* Run scrut *)
+    code1 ^^ set_i ^^
+    (* Run rest in block to exit from *)
+    FakeMultiVal.block_ env (StackRep.to_block_type env final_sr) (fun branch_code ->
+       orsPatternFailure env (List.map (fun (sr, c) ->
+          c ^^^ CannotFail (StackRep.adjust env sr final_sr ^^ branch_code)
+       ) codes) ^^
+       G.i Unreachable (* We should always exit using the branch_code *)
+    )
+  (* Async-wait lowering support features *)
+  | DeclareE (name, typ, e) ->
+    let ae1, i = VarEnv.add_local_with_heap_ind env ae name typ in
+    let sr, code = compile_exp env ae1 e in
+    sr,
+    MutBox.alloc env ^^ G.i (LocalSet (nr i)) ^^
+    code
+  | DefineE (name, _, e) ->
+    SR.unit,
+    let pre_code, sr, code = Var.set_val env ae name in
+    pre_code ^^
+    compile_exp_as env ae sr e ^^
+    code
+  | FuncE (x, sort, control, typ_binds, args, res_tys, e) ->
+    let captured = Freevars.captured exp in
+    let return_tys = match control with
+      | Type.Returns -> res_tys
+      | Type.Replies -> []
+      | Type.Promises -> assert false in
+    let return_arity = List.length return_tys in
+    let mk_body env1 ae1 = compile_exp_as env1 ae1 (StackRep.of_arity return_arity) e in
+    FuncDec.lit env ae x sort control captured args mk_body return_tys exp.at
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    SR.unit,
+    let (set_future, get_future) = new_local env "future" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let mk_body env1 ae1 = compile_exp_as env1 ae1 SR.unit exp_f in
+    let captured = Freevars.captured exp_f in
+    let add_cycles = Internals.add_cycles env ae in
+    FuncDec.async_body env ae ts captured mk_body exp.at ^^
+    Tagged.load_forwarding_pointer env ^^
+    set_future ^^
+
+    compile_exp_vanilla env ae exp_k ^^ set_k ^^
+    compile_exp_vanilla env ae exp_r ^^ set_r ^^
+
+    FuncDec.ic_self_call env ts
+      IC.(get_self_reference env ^^
+          actor_public_field env async_method_name)
+      get_future
+      get_k
+      get_r
+      add_cycles
+  | ActorE (ds, fs, _, _) ->
+    fatal "Local actors not supported by backend"
+  | NewObjE (Type.(Object | Module | Memory) as _sort, fs, _) ->
+    (*
+    We can enable this warning once we treat everything as static that
+    mo_frontend/static.ml accepts, including _all_ literals.
+    if sort = Type.Module then Printf.eprintf "%s" "Warning: Non-static module\n";
+    *)
+    SR.Vanilla,
+    let fs' = fs |> List.map
+      (fun (f : Ir.field) -> (f.it.name, fun () ->
+        if Type.is_mut f.note
+        then Var.get_aliased_box env ae f.it.var
+        else Var.get_val_vanilla env ae f.it.var)) in
+    Object.lit_raw env fs'
+  | _ -> SR.unit, todo_trap env "compile_exp" (Arrange_ir.exp exp)
+
+and compile_exp_ignore env ae e =
+  let sr, code = compile_exp env ae e in
+  code ^^ StackRep.drop env sr
+
+and compile_exp_as_opt env ae sr_out_o e =
+  let sr_in, code = compile_exp_with_hint env ae sr_out_o e in
+  G.with_region e.at (
+    code ^^
+    match sr_out_o with
+    | None -> StackRep.drop env sr_in
+    | Some sr_out -> StackRep.adjust env sr_in sr_out
+  )
+
+and compile_exp_vanilla (env : E.t) ae exp =
+  compile_exp_as env ae SR.Vanilla exp
+
+and compile_exp_unit (env : E.t) ae exp =
+  compile_exp_as env ae SR.unit exp
+
+(* compiles to something that works with IfE or Eqz
+   (SR.UnboxedWord32 or SR.Vanilla are _both_ ok)
+*)
+and compile_exp_as_test env ae e =
+  let sr, code = compile_exp env ae e in
+  code ^^
+  (if sr != SR.bool then StackRep.adjust env sr SR.Vanilla else G.nop)
+
+(* Compile a prim of type Char -> Char to a RTS call. *)
+and compile_char_to_char_rts env ae exp rts_fn =
+  SR.Vanilla,
+  compile_exp_vanilla env ae exp ^^
+  TaggedSmallWord.untag_codepoint ^^
+  E.call_import env "rts" rts_fn ^^
+  TaggedSmallWord.tag_codepoint
+
+(* Compile a prim of type Char -> Bool to a RTS call. The RTS function should
+   have type int32_t -> int32_t where the return value is 0 for 'false' and 1
+   for 'true'. *)
+and compile_char_to_bool_rts (env : E.t) (ae : VarEnv.t) exp rts_fn =
+  SR.bool,
+  compile_exp_vanilla env ae exp ^^
+  TaggedSmallWord.untag_codepoint ^^
+  (* The RTS function returns Motoko True/False values (which are represented as
+     1 and 0, respectively) so we don't need any marshalling *)
+  E.call_import env "rts" rts_fn
+
+(*
+The compilation of declarations (and patterns!) needs to handle mutual recursion.
+This requires conceptually three passes:
+ 1. First we need to collect all names bound in a block,
+    and find locations for then (which extends the environment).
+    The environment is extended monotonically: The type-checker ensures that
+    a Block does not bind the same name twice.
+    We would not need to pass in the environment, just out ... but because
+    it is bundled in the E.t type, threading it through is also easy.
+
+ 2. We need to allocate memory for them, and store the pointer in the
+    WebAssembly local, so that they can be captured by closures.
+
+ 3. We go through the declarations, generate the actual code and fill the
+    allocated memory.
+    This includes creating the actual closure references.
+
+We could do this in separate functions, but I chose to do it in one
+ * it means all code related to one constructor is in one place and
+ * when generating the actual code, we still “know” the id of the local that
+   has the memory location, and don’t have to look it up in the environment.
+
+The first phase works with the `pre_env` passed to `compile_dec`,
+while the third phase is a function that expects the final environment. This
+enabled mutual recursion.
+*)
+
+
+and compile_lit_pat env l =
+  match l with
+  | NullLit ->
+    compile_lit_as env SR.Vanilla l ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+  | BoolLit true ->
+    G.nop
+  | BoolLit false ->
+    G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | (NatLit _ | IntLit _) ->
+    compile_lit_as env SR.Vanilla l ^^
+    BigNum.compile_eq env
+  | Nat8Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Nat8)
+  | Nat16Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Nat16)
+  | Nat32Lit _ ->
+    BoxedSmallWord.unbox env ^^
+    compile_lit_as env SR.UnboxedWord32 l ^^
+    compile_eq env Type.(Prim Nat32)
+  | Nat64Lit _ ->
+    BoxedWord64.unbox env ^^
+    compile_lit_as env SR.UnboxedWord64 l ^^
+    compile_eq env Type.(Prim Nat64)
+  | Int8Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Int8)
+  | Int16Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Int16)
+  | Int32Lit _ ->
+    BoxedSmallWord.unbox env ^^
+    compile_lit_as env SR.UnboxedWord32 l ^^
+    compile_eq env Type.(Prim Int32)
+  | Int64Lit _ ->
+    BoxedWord64.unbox env ^^
+    compile_lit_as env SR.UnboxedWord64 l ^^
+    compile_eq env Type.(Prim Int64)
+  | CharLit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Char)
+  | TextLit t
+  | BlobLit t ->
+    compile_lit_as env SR.Vanilla l ^^
+    Text.compare env Operator.EqOp
+  | FloatLit _ ->
+    todo_trap env "compile_lit_pat" (Arrange_ir.lit l)
+
+and fill_pat env ae pat : patternCode =
+  PatCode.with_region pat.at @@
+  match pat.it with
+  | _ when Ir_utils.is_irrefutable_nonbinding pat -> CannotFail (G.i Drop)
+  | WildP -> assert false (* matched above *)
+  | OptP p when Ir_utils.is_irrefutable_nonbinding p ->
+      CanFail (fun fail_code ->
+        Opt.is_some env ^^
+        G.if0 G.nop fail_code)
+  | OptP p ->
+      let (set_x, get_x) = new_local env "opt_scrut" in
+      CanFail (fun fail_code ->
+        set_x ^^
+        get_x ^^
+        Opt.is_some env ^^
+        G.if0
+          ( get_x ^^
+            Opt.project env ^^
+            with_fail fail_code (fill_pat env ae p)
+          )
+          fail_code
+      )
+  | TagP ("", p) -> (* these only come from known_tag_pat *)
+    if Ir_utils.is_irrefutable_nonbinding p
+    then CannotFail (G.i Drop)
+    else CannotFail (Variant.project env) ^^^ fill_pat env ae p
+  | TagP (l, p) when Ir_utils.is_irrefutable_nonbinding p ->
+      CanFail (fun fail_code ->
+        Variant.test_is env l ^^
+        G.if0 G.nop fail_code)
+  | TagP (l, p) ->
+      let (set_x, get_x) = new_local env "tag_scrut" in
+      CanFail (fun fail_code ->
+        set_x ^^
+        get_x ^^
+        Variant.test_is env l ^^
+        G.if0
+          ( get_x ^^
+            Variant.project env ^^
+            with_fail fail_code (fill_pat env ae p)
+          )
+          fail_code
+      )
+  | LitP l ->
+      CanFail (fun fail_code ->
+        compile_lit_pat env l ^^
+        G.if0 G.nop fail_code)
+  | VarP name ->
+      CannotFail (Var.set_val_vanilla_from_stack env ae name)
+  | TupP ps ->
+      let (set_i, get_i) = new_local env "tup_scrut" in
+      let rec go i = function
+        | [] -> CannotFail G.nop
+        | p::ps ->
+          let code1 = fill_pat env ae p in
+          let code2 = go (Int32.add i 1l) ps in
+          CannotFail (get_i ^^ Tuple.load_n env i) ^^^ code1 ^^^ code2 in
+      CannotFail set_i ^^^ go 0l ps
+  | ObjP pfs ->
+      let project = compile_load_field env pat.note in
+      let (set_i, get_i) = new_local env "obj_scrut" in
+      let rec go = function
+        | [] -> CannotFail G.nop
+        | {it={name; pat}; _}::pfs' ->
+          let code1 = fill_pat env ae pat in
+          let code2 = go pfs' in
+          CannotFail (get_i ^^ project name) ^^^ code1 ^^^ code2 in
+      CannotFail set_i ^^^ go pfs
+  | AltP (p1, p2) ->
+      let code1 = fill_pat env ae p1 in
+      let code2 = fill_pat env ae p2 in
+      let (set_i, get_i) = new_local env "alt_scrut" in
+      CannotFail set_i ^^^
+      orElse (CannotFail get_i ^^^ code1)
+             (CannotFail get_i ^^^ code2)
+
+and alloc_pat_local env ae pat =
+  let d = Freevars.pat pat in
+  AllocHow.M.fold (fun v typ ae ->
+    let (ae1, _i) = VarEnv.add_direct_local env ae v SR.Vanilla typ
+    in ae1
+  ) d ae
+
+and alloc_pat env ae how pat : VarEnv.t * G.t  =
+  (fun (ae, code) -> (ae, G.with_region pat.at code)) @@
+  let d = Freevars.pat pat in
+  AllocHow.M.fold (fun v typ (ae, code0) ->
+    let ae1, code1 = AllocHow.add_local env ae how v typ
+    in (ae1, code0 ^^ code1)
+  ) d (ae, G.nop)
+
+and compile_pat_local env ae pat : VarEnv.t * patternCode =
+  (* It returns:
+     - the extended environment
+     - the patternCode to do the pattern matching.
+       This expects the  undestructed value is on top of the stack,
+       consumes it, and fills the heap.
+       If the pattern matches, execution continues (with nothing on the stack).
+       If the pattern does not match, it fails (in the sense of PatCode.CanFail)
+  *)
+  let ae1 = alloc_pat_local env ae pat in
+  let fill_code = fill_pat env ae1 pat in
+  (ae1, fill_code)
+
+(* Used for let patterns:
+   If the pattern can consume its scrutinee in a better form than vanilla (e.g.
+   unboxed tuple, unboxed 32/64), lets do that.
+*)
+and compile_unboxed_pat env ae how pat
+  : VarEnv.t * G.t * G.t * SR.t option * G.t =
+  (* It returns:
+     - the extended environment
+     - the code to allocate memory
+     - the code to prepare the stack (e.g. push destination addresses)
+       before the scrutinee is pushed
+     - the desired stack rep. None means: Do not even push the scrutinee.
+     - the code to do the pattern matching.
+       This expects the undestructed value is on top of the stack,
+       consumes it, and fills the heap
+       If the pattern does not match, it traps with pattern failure
+  *)
+  let (ae1, alloc_code) = alloc_pat env ae how pat in
+  let pre_code, sr, fill_code = match pat.it with
+    (* Nothing to match: Do not even put something on the stack *)
+    | WildP -> G.nop, None, G.nop
+    (* Tuple patterns *)
+    | TupP ps when List.length ps <> 1 ->
+      G.nop,
+      Some (SR.UnboxedTuple (List.length ps)),
+      (* We have to fill the pattern in reverse order, to take things off the
+         stack. This is only ok as long as patterns have no side effects.
+      *)
+      G.concat_mapi (fun i p -> orPatternFailure env (fill_pat env ae1 p)) (List.rev ps)
+    (* Variable patterns *)
+    | VarP name ->
+      let pre_code, sr, code = Var.set_val env ae1 name in
+      pre_code, Some sr, code
+    (* The general case: Create a single value, match that. *)
+    | _ ->
+      G.nop,
+      Some SR.Vanilla,
+      orPatternFailure env (fill_pat env ae1 pat) in
+  let pre_code = G.with_region pat.at pre_code in
+  let fill_code = G.with_region pat.at fill_code in
+  (ae1, alloc_code, pre_code, sr, fill_code)
+
+and compile_dec env pre_ae how v2en dec : VarEnv.t * G.t * (VarEnv.t -> scope_wrap) =
+  (fun (pre_ae, alloc_code, mk_code, wrap) ->
+       G.(pre_ae, with_region dec.at alloc_code, fun ae body_code ->
+          with_region dec.at (mk_code ae) ^^ wrap body_code)) @@
+
+  match dec.it with
+  (* A special case for public methods *)
+  (* This relies on the fact that in the top-level mutually recursive group, no shadowing happens. *)
+  | LetD ({it = VarP v; _}, e) when E.NameEnv.mem v v2en ->
+    let (const, fill) = compile_const_exp env pre_ae e in
+    let fi = match const with
+      | (_, Const.Message fi) -> fi
+      | _ -> assert false in
+    let pre_ae1 = VarEnv.add_local_public_method pre_ae v (fi, (E.NameEnv.find v v2en)) e.note.Note.typ in
+    G.( pre_ae1, nop, (fun ae -> fill env ae; nop), unmodified)
+
+  (* A special case for constant expressions *)
+  | LetD (p, e) when e.note.Note.const ->
+    (* constant expression matching with patterns is fully decidable *)
+    if const_exp_matches_pat env pre_ae p e then (* not refuted *)
+      let extend, fill = compile_const_dec env pre_ae dec in
+      G.(extend pre_ae, nop, (fun ae -> fill env ae; nop), unmodified)
+    else (* refuted *)
+      (pre_ae, G.nop, (fun _ -> PatCode.patternFailTrap env), unmodified)
+
+  | LetD (p, e) ->
+    let (pre_ae1, alloc_code, pre_code, sr, fill_code) = compile_unboxed_pat env pre_ae how p in
+    ( pre_ae1, alloc_code,
+      (fun ae -> pre_code ^^ compile_exp_as_opt env ae sr e ^^ fill_code),
+      unmodified
+    )
+
+  | VarD (name, content_typ, e) ->
+    assert AllocHow.(match M.find_opt name how with
+                     | Some (LocalMut _ | StoreHeap | StoreStatic) -> true
+                     | _ -> false);
+    let var_typ = Type.Mut content_typ in
+    let pre_ae1, alloc_code = AllocHow.add_local env pre_ae how name var_typ in
+    ( pre_ae1,
+      alloc_code,
+      (fun ae -> let pre_code, sr, code = Var.set_val env ae name in
+                 pre_code ^^ compile_exp_as env ae sr e ^^ code),
+      unmodified
+    )
+
+  | RefD (name, typ, { it = DotLE (e, n); _ }) ->
+    let pre_ae1, alloc_code = AllocHow.add_local_for_alias env pre_ae how name typ in
+
+    ( pre_ae1,
+      alloc_code,
+      (fun ae ->
+        compile_exp_vanilla env ae e ^^
+        Object.load_idx_raw env n ^^
+        Var.capture_aliased_box env ae name),
+      unmodified
+    )
+  | RefD _ -> assert false
+
+and compile_decs_public env pre_ae decs v2en captured_in_body : VarEnv.t * scope_wrap =
+  let how = AllocHow.decs pre_ae decs captured_in_body in
+  let rec go pre_ae = function
+    | []        -> (pre_ae, G.nop, fun _ -> unmodified)
+    | [dec]     -> compile_dec env pre_ae how v2en dec
+    | dec::decs ->
+        let (pre_ae1, alloc_code1, mk_codeW1) = compile_dec env pre_ae how v2en dec in
+        let (pre_ae2, alloc_code2, mk_codeW2) = go              pre_ae1 decs in
+        ( pre_ae2,
+          alloc_code1 ^^ alloc_code2,
+          fun ae -> let codeW1 = mk_codeW1 ae in
+                    let codeW2 = mk_codeW2 ae in
+                    fun body_code -> codeW1 (codeW2 body_code)
+        ) in
+  let (ae1, alloc_code, mk_codeW) = go pre_ae decs in
+  (ae1, fun body_code -> alloc_code ^^ mk_codeW ae1 body_code)
+
+and compile_decs env ae decs captured_in_body : VarEnv.t * scope_wrap =
+  compile_decs_public env ae decs E.NameEnv.empty captured_in_body
+
+(* This compiles expressions determined to be const as per the analysis in
+   ir_passes/const.ml. See there for more details.
+*)
+and compile_const_exp env pre_ae exp : Const.t * (E.t -> VarEnv.t -> unit) =
+  match exp.it with
+  | FuncE (name, sort, control, typ_binds, args, res_tys, e) ->
+    let fun_rhs =
+
+      (* a few prims cannot be safely inlined *)
+      let inlineable_prim = function
+      | RetPrim -> false
+      | BreakPrim _ -> false
+      | ThrowPrim -> fatal "internal error: left-over ThrowPrim"
+      | _ -> true in
+
+      match sort, control, typ_binds, e.it with
+      (* Special cases for prim-wrapping functions *)
+
+      | Type.Local, Type.Returns, [], PrimE (prim, prim_args) when
+          inlineable_prim prim &&
+          List.length args = List.length prim_args &&
+          List.for_all2 (fun p a -> a.it = VarE p.it) args prim_args ->
+        Const.PrimWrapper prim
+      | _, _, _, _ -> Const.Complicated
+    in
+    let return_tys = match control with
+      | Type.Returns -> res_tys
+      | Type.Replies -> []
+      | Type.Promises -> assert false in
+    let mk_body env ae =
+      List.iter (fun v ->
+        if not (VarEnv.NameEnv.mem v ae.VarEnv.vars)
+        then fatal "internal error: const \"%s\": captures \"%s\", not found in static environment\n" name v
+      ) (Freevars.M.keys (Freevars.exp e));
+      compile_exp_as env ae (StackRep.of_arity (List.length return_tys)) e in
+    FuncDec.closed env sort control name args mk_body fun_rhs return_tys exp.at
+  | BlockE (decs, e) ->
+    let (extend, fill1) = compile_const_decs env pre_ae decs in
+    let ae' = extend pre_ae in
+    let (c, fill2) = compile_const_exp env ae' e in
+    (c, fun env ae ->
+      let ae' = extend ae in
+      fill1 env ae';
+      fill2 env ae')
+  | VarE v ->
+    let c =
+      match VarEnv.lookup_var pre_ae v with
+      | Some (VarEnv.Const c) -> c
+      | _ -> fatal "compile_const_exp/VarE: \"%s\" not found" v
+    in
+    (c, fun _ _ -> ())
+  | NewObjE (Type.(Object | Module | Memory), fs, _) ->
+    let static_fs = List.map (fun f ->
+          let st =
+            match VarEnv.lookup_var pre_ae f.it.var with
+            | Some (VarEnv.Const c) -> c
+            | _ -> fatal "compile_const_exp/ObjE: \"%s\" not found" f.it.var
+          in f.it.name, st) fs
+    in
+    (Const.t_of_v (Const.Obj static_fs), fun _ _ -> ())
+  | PrimE (DotPrim name, [e]) ->
+    let (object_ct, fill) = compile_const_exp env pre_ae e in
+    let fs = match object_ct with
+      | _, Const.Obj fs -> fs
+      | _ -> fatal "compile_const_exp/DotE: not a static object" in
+    let member_ct = List.assoc name fs in
+    (member_ct, fill)
+  | PrimE (ProjPrim i, [e]) ->
+    let (object_ct, fill) = compile_const_exp env pre_ae e in
+    let cs = match object_ct with
+      | _, Const.Array cs -> cs
+      | _ -> fatal "compile_const_exp/ProjE: not a static tuple" in
+    (List.nth cs i, fill)
+  | LitE l -> Const.(t_of_v (Lit (const_lit_of_lit l))), (fun _ _ -> ())
+  | PrimE (TupPrim, []) -> Const.t_of_v Const.Unit, (fun _ _ -> ())
+  | PrimE (ArrayPrim (Const, _), es)
+  | PrimE (TupPrim, es) ->
+    let (cs, fills) = List.split (List.map (compile_const_exp env pre_ae) es) in
+    Const.(t_of_v (Array cs)),
+    (fun env ae -> List.iter (fun fill -> fill env ae) fills)
+  | PrimE (TagPrim i, [e]) ->
+    let (arg_ct, fill) = compile_const_exp env pre_ae e in
+    Const.(t_of_v (Tag (i, arg_ct))),
+    fill
+  | PrimE (OptPrim, [e]) ->
+    let (arg_ct, fill) = compile_const_exp env pre_ae e in
+    Const.(t_of_v (Opt arg_ct)),
+    fill
+
+  | _ -> assert false
+
+and compile_const_decs env pre_ae decs : (VarEnv.t -> VarEnv.t) * (E.t -> VarEnv.t -> unit) =
+  let rec go pre_ae = function
+    | []          -> (fun ae -> ae), (fun _ _ -> ())
+    | [dec]       -> compile_const_dec env pre_ae dec
+    | (dec::decs) ->
+        let (extend1, fill1) = compile_const_dec env pre_ae dec in
+        let pre_ae1 = extend1 pre_ae in
+        let (extend2, fill2) = go                    pre_ae1 decs in
+        (fun ae -> extend2 (extend1 ae)),
+        (fun env ae -> fill1 env ae; fill2 env ae) in
+  go pre_ae decs
+
+and const_exp_matches_pat env ae pat exp : bool =
+  assert exp.note.Note.const;
+  let c, _ = compile_const_exp env ae exp in
+  match destruct_const_pat VarEnv.empty_ae pat c with Some _ -> true | _ -> false
+
+and destruct_const_pat ae pat const : VarEnv.t option = match pat.it with
+  | WildP -> Some ae
+  | VarP v -> Some (VarEnv.add_local_const ae v const pat.note)
+  | ObjP pfs ->
+    let fs = match const with (_, Const.Obj fs) -> fs | _ -> assert false in
+    List.fold_left (fun ae (pf : pat_field) ->
+      match ae, List.find_opt (fun (n, _) -> pf.it.name = n) fs with
+      | None, _ -> None
+      | Some ae, Some (_, c) -> destruct_const_pat ae pf.it.pat c
+      | _, None -> assert false
+    ) (Some ae) pfs
+  | AltP (p1, p2) ->
+    let l = destruct_const_pat ae p1 const in
+    if l = None then destruct_const_pat ae p2 const
+    else l
+  | TupP ps ->
+    let cs = match const with (_, Const.Array cs) -> cs | (_, Const.Unit) -> [] | _ -> assert false in
+    let go ae p c = match ae with
+      | Some ae -> destruct_const_pat ae p c
+      | _ -> None in
+    List.fold_left2 go (Some ae) ps cs
+  | LitP lp ->
+    begin match const with
+    | (_, Const.Lit lc) when Const.lit_eq (const_lit_of_lit lp, lc) -> Some ae
+    | _ -> None
+    end
+  | OptP p ->
+    begin match const with
+      | (_, Const.Opt c) -> destruct_const_pat ae p c
+      | (_, Const.(Lit Null)) -> None
+      | _ -> assert false
+    end
+  | TagP (i, p) ->
+     match const with
+     | (_, Const.Tag (ic, c)) when i = ic -> destruct_const_pat ae p c
+     | (_, Const.Tag _) -> None
+     | _ -> assert false
+
+and compile_const_dec env pre_ae dec : (VarEnv.t -> VarEnv.t) * (E.t -> VarEnv.t -> unit) =
+  (* This returns a _function_ to extend the VarEnv, instead of doing it, because
+  it needs to be extended twice: Once during the pass that gets the outer, static values
+  (no forward references), and then to implement the `fill`, which compiles the bodies
+  of functions (may contain forward references.) *)
+  match dec.it with
+  (* This should only contain constants (cf. is_const_exp) *)
+  | LetD (p, e) ->
+    let (const, fill) = compile_const_exp env pre_ae e in
+    (fun ae -> match destruct_const_pat ae p const with Some ae -> ae | _ -> assert false),
+    (fun env ae -> fill env ae)
+  | VarD _ | RefD _ -> fatal "compile_const_dec: Unexpected VarD/RefD"
+
+and compile_init_func mod_env ((cu, flavor) : Ir.prog) =
+  assert (not flavor.has_typ_field);
+  assert (not flavor.has_poly_eq);
+  assert (not flavor.has_show);
+  assert (not flavor.has_await);
+  assert (not flavor.has_async_typ);
+  match cu with
+  | LibU _ -> fatal "compile_start_func: Cannot compile library"
+  | ProgU ds ->
+    Func.define_built_in mod_env "init" [] [] (fun env ->
+      let _ae, codeW = compile_decs env VarEnv.empty_ae ds Freevars.S.empty in
+      codeW G.nop
+    )
+  | ActorU (as_opt, ds, fs, up, _t) ->
+    main_actor as_opt mod_env ds fs up
+
+and export_actor_field env  ae (f : Ir.field) =
+  (* A public actor field is guaranteed to be compiled as a PublicMethod *)
+  let fi =
+    match VarEnv.lookup_var ae f.it.var with
+    | Some (VarEnv.PublicMethod (fi, _)) -> fi
+    | _ -> assert false in
+
+  E.add_export env (nr {
+    name = Lib.Utf8.decode (match E.mode env with
+      | Flags.ICMode | Flags.RefMode ->
+        Mo_types.Type.(
+        match normalize f.note with
+        |  Func(Shared sort,_,_,_,_) ->
+           (match sort with
+            | Write -> "canister_update " ^ f.it.name
+            | Query -> "canister_query " ^ f.it.name
+            | Composite -> "canister_composite_query " ^ f.it.name
+           )
+        | _ -> assert false)
+      | _ -> assert false);
+    edesc = nr (FuncExport (nr fi))
+  })
+
+(* Main actor *)
+and main_actor as_opt mod_env ds fs up =
+  Func.define_built_in mod_env "init" [] [] (fun env ->
+    let ae0 = VarEnv.empty_ae in
+
+    let captured = Freevars.captured_vars (Freevars.actor ds fs up) in
+    (* Add any params to the environment *)
+    (* Captured ones need to go into static memory, the rest into locals *)
+    let args = match as_opt with None -> [] | Some as_ -> as_ in
+    let arg_list = List.map (fun a -> (a.it, a.note)) args in
+    let arg_names = List.map (fun a -> a.it) args in
+    let arg_tys = List.map (fun a -> a.note) args in
+    let as_local n = not (Freevars.S.mem n captured) in
+    let ae1 = VarEnv.add_arguments env ae0 as_local arg_list in
+
+    (* Reverse the fs, to a map from variable to exported name *)
+    let v2en = E.NameEnv.from_list (List.map (fun f -> (f.it.var, f.it.name)) fs) in
+
+    (* Compile the declarations *)
+    let ae2, decls_codeW = compile_decs_public env ae1 ds v2en
+      Freevars.(captured_vars (system up))
+    in
+
+    (* Export the public functions *)
+    List.iter (export_actor_field env ae2) fs;
+
+    (* Export upgrade hooks *)
+    Func.define_built_in env "pre_exp" [] [] (fun env ->
+      compile_exp_as env ae2 SR.unit up.preupgrade);
+    Func.define_built_in env "post_exp" [] [] (fun env ->
+      compile_exp_as env ae2 SR.unit up.postupgrade);
+    IC.export_upgrade_methods env;
+
+    (* Export heartbeat (but only when required) *)
+    begin match up.heartbeat.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "heartbeat_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.heartbeat);
+       IC.export_heartbeat env;
+    end;
+
+    (* Export timer (but only when required) *)
+    begin match up.timer.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "timer_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.timer);
+       IC.export_timer env;
+    end;
+
+    (* Export inspect (but only when required) *)
+    begin match up.inspect.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "inspect_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.inspect);
+       IC.export_inspect env;
+    end;
+
+    (* Export metadata *)
+    env.E.stable_types := metadata "motoko:stable-types" up.meta.sig_;
+    env.E.service := metadata "candid:service" up.meta.candid.service;
+    env.E.args := metadata "candid:args" up.meta.candid.args;
+
+    (* Deserialize any arguments *)
+    begin match as_opt with
+      | None
+      | Some [] ->
+        (* Liberally accept empty as well as unit argument *)
+        assert (arg_tys = []);
+        IC.system_call env "msg_arg_data_size" ^^
+        G.if0 (Serialization.deserialize env arg_tys) G.nop
+      | Some (_ :: _) ->
+        Serialization.deserialize env arg_tys ^^
+        G.concat_map (Var.set_val_vanilla_from_stack env ae1) (List.rev arg_names)
+    end ^^
+    begin
+      if up.timer.at <> no_region then
+        (* initiate a timer pulse *)
+        compile_const_64 1L ^^
+        IC.system_call env "global_timer_set" ^^
+        G.i Drop
+      else
+        G.nop
+    end ^^
+    IC.init_globals env ^^
+    (* Continue with decls *)
+    decls_codeW G.nop
+  )
+
+and metadata name value =
+  if List.mem name !Flags.omit_metadata_names then None
+  else Some (
+           List.mem name !Flags.public_metadata_names,
+           value)
+
+and conclude_module env set_serialization_globals start_fi_o =
+
+  FuncDec.export_async_method env;
+
+  (* See Note [Candid subtype checks] *)
+  Serialization.set_delayed_globals env set_serialization_globals;
+
+  let static_roots = GCRoots.store_static_roots env in
+
+  (* declare before building GC *)
+
+  (* add beginning-of-heap pointer, may be changed by linker *)
+  (* needs to happen here now that we know the size of static memory *)
+  let set_heap_base = E.add_global32_delayed env "__heap_base" Immutable in
+  E.export_global env "__heap_base";
+
+  Heap.register env;
+  GCRoots.register env static_roots;
+  IC.register env;
+
+  set_heap_base (E.get_end_of_static_memory env);
+
+  (* Wrap the start function with the RTS initialization *)
+  let rts_start_fi = E.add_fun env "rts_start" (Func.of_body env [] [] (fun env1 ->
+    E.call_import env "rts" ("initialize_" ^ E.gc_strategy_name !Flags.gc_strategy ^ "_gc") ^^
+    match start_fi_o with
+    | Some fi ->
+      G.i (Call fi)
+    | None ->
+      Lifecycle.set env Lifecycle.PreInit
+  )) in
+
+  IC.default_exports env;
+
+  let func_imports = E.get_func_imports env in
+  let ni = List.length func_imports in
+  let ni' = Int32.of_int ni in
+
+  let other_imports = E.get_other_imports env in
+
+  let memories = [nr {mtype = MemoryType {min = E.mem_size env; max = None}} ] in
+
+  let funcs = E.get_funcs env in
+
+  let data = List.map (fun (offset, init) -> nr {
+    index = nr 0l;
+    offset = nr (G.to_instr_list (compile_unboxed_const offset));
+    init;
+    }) (E.get_static_memory env) in
+
+  let elems = List.map (fun (fi, fp) -> nr {
+    index = nr 0l;
+    offset = nr (G.to_instr_list (compile_unboxed_const fp));
+    init = [ nr fi ];
+    }) (E.get_elems env) in
+
+  let table_sz = E.get_end_of_table env in
+
+  let module_ = {
+      types = List.map nr (E.get_types env);
+      funcs = List.map (fun (f,_,_) -> f) funcs;
+      tables = [ nr { ttype = TableType ({min = table_sz; max = Some table_sz}, FuncRefType) } ];
+      elems;
+      start = Some (nr rts_start_fi);
+      globals = E.get_globals env;
+      memories;
+      imports = func_imports @ other_imports;
+      exports = E.get_exports env;
+      data
+    } in
+
+  let emodule =
+    let open Wasm_exts.CustomModule in
+    { module_;
+      dylink = None;
+      name = { empty_name_section with function_names =
+                 List.mapi (fun i (f,n,_) -> Int32.(add ni' (of_int i), n)) funcs;
+               locals_names =
+                 List.mapi (fun i (f,_,ln) -> Int32.(add ni' (of_int i), ln)) funcs; };
+      motoko = {
+        labels = E.get_labs env;
+        stable_types = !(env.E.stable_types);
+        compiler = metadata "motoko:compiler" (Lib.Option.get Source_id.release Source_id.id)
+      };
+      candid = {
+        args = !(env.E.args);
+        service = !(env.E.service);
+      };
+      source_mapping_url = None;
+    } in
+
+  match E.get_rts env with
+  | None -> emodule
+  | Some rts -> Linking.LinkModule.link emodule "rts" rts
+
+let compile mode rts (prog : Ir.prog) : Wasm_exts.CustomModule.extended_module =
+  let env = E.mk_global mode rts IC.trap_with (Lifecycle.end_ ()) in
+
+  IC.register_globals env;
+  Stack.register_globals env;
+  GC.register_globals env;
+  StableMem.register_globals env;
+  Serialization.Registers.register_globals env;
+
+  (* See Note [Candid subtype checks] *)
+  let set_serialization_globals = Serialization.register_delayed_globals env in
+
+  IC.system_imports env;
+  RTS.system_imports env;
+  RTS_Exports.system_exports env;
+
+  compile_init_func env prog;
+  let start_fi_o = match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      IC.export_init env;
+      None
+    | Flags.WASIMode ->
+      IC.export_wasi_start env;
+      None
+    | Flags.WasmMode ->
+      Some (nr (E.built_in env "init"))
+  in
+
+  conclude_module env set_serialization_globals start_fi_o
+
+
+
+ + + diff --git a/coverage/codegen/die.ml.html b/coverage/codegen/die.ml.html new file mode 100644 index 00000000000..3c3de70b8ef --- /dev/null +++ b/coverage/codegen/die.ml.html @@ -0,0 +1,1668 @@ + + + + + die.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+
+
open Mo_types
+open Wasm_exts.Dwarf5
+open Meta
+
+(* Note [Low_pc, High_pc, Ranges are special]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The DWARF attributes `Low_pc`, `High_pc` and `Ranges` carry information
+about the Wasm bytecode's layout in the emitted Code section for the
+compilation unit. The information is not available here, so these
+attributes have no payload at this side. Instead it is filled in
+in a tag-dependent manner by `customModuleEncode.ml`. For LexicalBlock
+the Low_pc and High_pc attributes are managed entirely by the emitter.
+ *)
+
+type dw_AT = Producer of string
+           | Language of int
+           | Name of string
+           | Stmt_list of int
+           | Comp_dir of string
+           | Use_UTF8 of bool
+           | Low_pc | High_pc | Ranges (* see Note [Low_pc, High_pc, Ranges are special] *)
+           | Addr_base of int
+           | Decl_file of string
+           | Decl_line of int
+           | Decl_column of int
+           | Prototyped of bool
+           | External of bool
+           | Byte_size of int
+           | Bit_size of int
+           | Data_bit_offset of int
+           | Discr of int (* reference *)
+           | Const_value of int
+           | Discr_value of int
+           | Artificial of bool
+           | TypeRef of int (* reference *)
+           | TypePromise of int Lib.Promise.t (* reference *)
+           | Encoding of int
+           | Location of int list
+           | DataMemberLocation of int
+
+(* DWARF tags *)
+
+type dw_TAG =
+  | Compile_unit of string * string                            (* compilation directory, file name *)
+  | Subprogram of string * Type.typ list * Source.pos          (* name, return types, location *)
+  | LexicalBlock of Source.pos
+  | Formal_parameter of (string * Source.pos * Type.typ * int) (* name, location, type, Wasm slot *)
+  | Variable of (string * Source.pos * Type.typ * int)         (* name, location, type, Wasm slot *)
+  | Type of Type.typ
+  | Typedef of string * Type.typ
+  (*| Member*)
+  | Variant_part
+  | Variant
+
+(* DWARF high-level structures *)
+
+let dw_attr' : dw_AT -> die =
+  let bool b = if b then 1 else 0 in
+  function
+  | Producer p -> StringAttribute (dw_AT_producer, p)
+  | Language l -> IntAttribute (dw_AT_language, l)
+  | Name n -> StringAttribute (dw_AT_name, n)
+  | Stmt_list l -> IntAttribute (dw_AT_stmt_list, l)
+  | Comp_dir d -> StringAttribute (dw_AT_comp_dir, d)
+  | Use_UTF8 b -> IntAttribute (dw_AT_use_UTF8, bool b)
+  | Addr_base b -> IntAttribute (dw_AT_addr_base, b)
+  | Low_pc -> OffsetAttribute dw_AT_low_pc
+  | High_pc -> OffsetAttribute dw_AT_high_pc
+  | Ranges -> OffsetAttribute dw_AT_ranges  (* see Note [Low_pc, High_pc, Ranges are special] *)
+  | Decl_file f -> StringAttribute (dw_AT_decl_file, f)
+  | Decl_line l -> IntAttribute (dw_AT_decl_line, l)
+  | Decl_column c -> IntAttribute (dw_AT_decl_column, c)
+  | Prototyped b -> IntAttribute (dw_AT_prototyped, bool b)
+  | External b -> IntAttribute (dw_AT_external, bool b)
+  | Byte_size s -> IntAttribute (dw_AT_byte_size, s)
+  | Bit_size s -> IntAttribute (dw_AT_bit_size, s)
+  | Data_bit_offset o -> IntAttribute (dw_AT_data_bit_offset, o)
+  | Artificial b -> IntAttribute (dw_AT_artificial, bool b)
+  | Discr r -> IntAttribute (dw_AT_discr, r)
+  | TypeRef r -> IntAttribute (dw_AT_type, r)
+  | TypePromise p ->
+    (* See Note [placeholder promises for typedefs] *)
+    IntAttribute (dw_AT_type, Wasm_exts.CustomModuleEncode.promise_reference_slot p)
+  | Encoding e -> IntAttribute (dw_AT_encoding, e)
+  | Discr_value v -> IntAttribute (dw_AT_discr_value, v)
+  | Const_value v -> IntAttribute (dw_AT_const_value, v)
+  | DataMemberLocation offs -> IntAttribute (dw_AT_data_member_location, offs)
+  | Location ops ->
+    let string_of_ops ops =
+      let open Buffer in
+      let buf = create 16 in
+      let rec stash = function
+        | i when i >= 0 -> assert (i < 0x100); add_char buf (Char.chr i)
+        | i when -i < 128 -> stash (-i) (* ULEB128 byte *)
+        | i -> (* needs ULEB128 chopping *)
+          let i = -i in
+          stash (i land 0x7F lor 0x80);
+          stash (- (i lsr 7)) in
+      List.iter stash ops;
+      contents buf in
+    StringAttribute (dw_AT_location, string_of_ops ops)
+
+let dw_attr at : die list = [dw_attr' at]
+
+let dw_attrs = List.map dw_attr'
+
+let unreferencable_tag tag attrs =
+  Tag (None, tag, attrs)
+
+
+let with_referencable_tag f tag attrs : die * int =
+  let refslot = Wasm_exts.CustomModuleEncode.allocate_reference_slot () in
+  f refslot;
+  Tag (Some refslot, tag, attrs),
+  refslot
+
+let with_referencable_tags f tag attrs : die list * int =
+  let t, r = with_referencable_tag f tag attrs in
+  [t], r
+
+let with_closed_referencable_tags f tag attrs : die list * int =
+  let t, r = with_referencable_tag f tag attrs in
+  [Grouped [TagClose; t]], r
+
+let referencable_tag = with_referencable_tag ignore
+
+let autoclose_unreferencable_tag tag attrs =
+  Grouped [TagClose; unreferencable_tag tag attrs]
+
+let autoclose_referencable_tag tag attrs =
+  let t, r = referencable_tag tag attrs in
+  Grouped [TagClose; t], r
+
+
+let obvious_prim_of_con c ty : Type.prim option =
+  match Type.normalize ty with
+  | Type.Prim p ->
+    if Arrange_type.(prim p = con c) then Some p else None
+  | _ -> None
+
+let is_enum =
+  let no_payload = function
+    | Type.{typ = Tup []; _} -> true
+    | _ -> false in
+  List.for_all no_payload
+
+(* Mutable state for the already referencable type DIEs *)
+let any_type = ref None
+module TypedefRefs = Map.Make (struct type t = Type.kind Cons.t let compare = compare end)
+let dw_typedefs = ref TypedefRefs.empty
+module PrimRefs = Map.Make (struct type t = Type.prim let compare = compare end)
+let dw_prims = ref PrimRefs.empty
+module EnumRefs = Map.Make (struct type t = string list let compare = compare end)
+let dw_enums = ref EnumRefs.empty
+module OptionRefs = Map.Make (struct type t = int let compare = compare end)
+let dw_options = ref OptionRefs.empty
+module VariantRefs = Map.Make (struct type t = (string * int) list let compare = compare end)
+let dw_variants = ref VariantRefs.empty
+module ObjectRefs = Map.Make (struct type t = (string * int) list let compare = compare end)
+let dw_objects = ref ObjectRefs.empty
+module TupleRefs = Map.Make (struct type t = int list let compare = compare end)
+let dw_tuples = ref TupleRefs.empty
+
+(* Factory for referencable type DIEs *)
+let rec type_ref : Type.typ -> die list * int =
+  let open Type in
+  function
+  | Any ->
+    begin match !any_type with
+    | Some r -> [], r
+    | None ->
+      let add r = any_type := Some r in
+      with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [Name "Any"; Bit_size 0; Data_bit_offset 0; Encoding dw_ATE_address])
+    end
+  | Prim pr -> prim_type_ref pr
+  | Variant vs when is_enum vs -> enum vs
+  | Variant vs -> variant vs
+  | Obj (Object, fs) -> object_ fs
+  | Tup cs -> tuple cs
+  | Con (c, _) as ty ->
+    begin match obvious_prim_of_con c ty with
+    | Some p -> type_ref (Prim p)
+    | None -> typedef_ref c ty
+    end
+  | Opt inner ->
+    let prereq, selector = type_ref inner in
+    let opt, r = option_instance selector in
+    prereq @ opt, r
+  | typ -> (*Printf.printf "Cannot type typ: %s\n" (Wasm.Sexpr.to_string 80 (Arrange_type.typ typ));*) type_ref Any (* FIXME: assert false *)
+
+and typedef_ref c ty : die list * int =
+  match TypedefRefs.find_opt c !dw_typedefs with
+  | Some r -> ([], r)
+  | None ->
+    let add r = dw_typedefs := TypedefRefs.add c r !dw_typedefs in
+    (* See Note [placeholder promises for typedefs] *)
+    let p = Lib.Promise.make () in
+    let name = match Arrange_type.con c with | Wasm.Sexpr.Atom n -> n | _ -> assert false in
+    let typedef_tag, typedef_ref = with_referencable_tag add dw_TAG_typedef (dw_attrs [Name name; TypePromise p]) in
+    let ds, reference = type_ref (Type.normalize ty) in
+    Lib.Promise.fulfill p reference;
+    typedef_tag :: ds, typedef_ref
+
+and prim_type_ref (prim : Type.prim) : die list * int =
+  match PrimRefs.find_opt prim !dw_prims with
+  | Some r -> [], r
+  | None ->
+    let name = Name (Type.string_of_prim prim) in
+    let add r = dw_prims := PrimRefs.add prim r !dw_prims in
+    let ds, r =
+      match prim with
+      | Type.Bool ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 1; Data_bit_offset 1; Encoding dw_ATE_boolean])
+      | Type.Char ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 29; Data_bit_offset 8; Encoding dw_ATE_UTF])
+      | Type.(Int | Nat) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.Text -> (* FIXME: should be dynamic, like Any *)
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_UTF])
+      | Type.(Int8|Int16|Int32) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.(Nat8|Nat16|Nat32) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_unsigned])
+      | Type.Int64 ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 64; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.Nat64 ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 64; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_unsigned])
+      | ty -> (*Printf.eprintf "Cannot type: %s\n" (Wasm.Sexpr.to_string 80 (Arrange_type.prim prim));*) type_ref Type.Any (* FIXME, this is "Any" for now *)
+(* | _ -> assert false (* TODO *)*)
+    in
+    ds, r
+
+and enum vnts : die list * int =
+  let selectors = List.map (fun Type.{lab; _} -> lab) vnts in
+  match EnumRefs.find_opt selectors !dw_enums with
+  | Some r -> [], r
+  | None ->
+    let add r = dw_enums := EnumRefs.add selectors r !dw_enums in
+    let enumerator name =
+        let hash = Int32.to_int (Mo_types.Hash.hash name) in
+        unreferencable_tag dw_TAG_enumerator (dw_attrs [Name name; Const_value hash]) in
+    (*  enumeration_type, useful only with location expression *)
+    with_closed_referencable_tags add
+       dw_TAG_enumeration_type
+       (dw_attr' (Artificial true) :: List.map enumerator selectors)
+
+and option_instance key : die list * int =
+  (* TODO: make this with DW_TAG_template_alias? ... lldb-10 is not ready yet *)
+  let open Wasm_exts.Abbreviation in
+  match OptionRefs.find_opt key !dw_options with
+  | Some r -> [], r
+  | None ->
+    let add r = dw_options := OptionRefs.add key r !dw_options in
+    let prereq name(*WAT?*) : die * die =
+      let overlay_die, overlay_ref =
+        autoclose_referencable_tag dw_TAG_structure_type
+          (unreferencable_tag dw_TAG_member_In_variant
+             (dw_attrs [Name "?"; TypeRef key; DataMemberLocation 4]) ::
+           dw_attrs [Name name; Byte_size 8 (*; Artificial *)]) in
+      overlay_die,
+      unreferencable_tag dw_TAG_member_In_variant
+        (dw_attrs [Name name; TypeRef overlay_ref; DataMemberLocation 4]) in
+    (* make sure all prerequisite types are around *)
+    let overlays = List.map prereq ["FIXME:none"; "FIXME:some"] in
+    (* struct_type, assumes location points at heap tag -- NO! FIXME *)
+    let discr_tag, discr_ref =
+      referencable_tag dw_TAG_member_Variant_mark
+        (dw_attrs [Artificial true; Byte_size 4; DataMemberLocation 0]) in
+    let summand ((name, discr), member) : die =
+      autoclose_unreferencable_tag dw_TAG_variant_Named
+        (member :: dw_attrs [Name name; Discr_value discr]) in
+    let internal_struct, struct_ref =
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (discr_tag ::
+         autoclose_unreferencable_tag dw_TAG_variant_part
+           (dw_attr' (Discr discr_ref) ::
+            List.map summand (List.map2 (fun nd (_, mem) -> nd, mem) ["FIXME:none", 0x0; "FIXME:some", 0x8] overlays)) ::
+         dw_attrs [Name "OPTION"; Byte_size 8]) in
+    List.map fst overlays @ internal_struct,
+    struct_ref
+
+and variant vnts : die list * int =
+  let open Wasm_exts.Abbreviation in
+  let selectors = List.map (fun Type.{lab; typ; _} -> lab, typ, type_ref typ) vnts in
+  (* make sure all prerequisite types are around *)
+  let prereqs = List.concat_map (fun (_, _, (dw, _)) -> dw) selectors in
+  let key = List.map (fun (name, _, (_, reference)) -> name, reference) selectors in
+  match VariantRefs.find_opt key !dw_variants with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_variants := VariantRefs.add key r !dw_variants in
+    let prereq (name, typ, _) : die list * die =
+      let (payload_pre, payload_mem) : die list * die list =
+        match typ with
+        | Type.Tup [] -> [], []
+        | _ ->
+          let ds, r = type_ref typ in
+          ds,
+          [unreferencable_tag dw_TAG_member_In_variant
+             (dw_attrs [Name ("#" ^ name); TypeRef r; DataMemberLocation 8])] in
+      let overlay_ds, (overlay_die, overlay_ref) =
+        payload_pre,
+        autoclose_referencable_tag dw_TAG_structure_type
+          (dw_attrs [Name name; Byte_size 12 (*; Artificial *)] @ payload_mem) in
+      overlay_ds @ [overlay_die],
+      unreferencable_tag dw_TAG_member_In_variant
+        (dw_attrs [Name name; TypeRef overlay_ref; DataMemberLocation 8]) in
+    (* make sure all artificial overlay types are around *)
+    let overlays = List.map prereq selectors in
+    let discr_tag, discr_ref =
+      referencable_tag dw_TAG_member_Variant_mark
+        (dw_attrs [Artificial true; Byte_size 4; DataMemberLocation 4]) in
+    (* struct_type, assumes location points at heap tag *)
+    let summand (name, member) : die =
+      let hash = Int32.to_int (Mo_types.Hash.hash name) in
+      autoclose_unreferencable_tag dw_TAG_variant_Named
+        (member :: dw_attrs [Name name; Discr_value hash]) in
+    let internal_struct, struct_ref =
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (autoclose_unreferencable_tag dw_TAG_member_Tag_mark
+           (dw_attrs [Artificial true; Byte_size 4]) ::
+        discr_tag ::
+        (autoclose_unreferencable_tag
+           dw_TAG_variant_part (
+             List.map summand (List.map2 (fun (name, _, _) (_, mem) -> name, mem) selectors overlays) @
+             dw_attrs [Discr discr_ref])) ::
+        dw_attrs [Name "VARIANT"; Byte_size 8]) in
+    prereqs @ List.concat_map fst overlays @ internal_struct, struct_ref
+
+and object_ fs : die list * int =
+  let open List in
+  let open Wasm_exts.Abbreviation in
+  let selectors = map (fun Type.{lab; typ; _} -> lab, type_ref typ) fs in
+  (* make sure all prerequisite types are around *)
+  let prereqs = concat_map (fun (_, (ds, _)) -> ds) selectors in
+  let key = map (fun (name, (_, reference)) -> name, reference) selectors in
+  match ObjectRefs.find_opt key !dw_objects with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_objects := ObjectRefs.add key r !dw_objects in
+    let ds, r =
+      let field (name, (_, r)) : die =
+        let _hash = Lib.Uint32.to_int (Idllib.IdlHash.idl_hash name) in (* TODO *)
+        unreferencable_tag dw_TAG_member_Word_sized_typed
+          (dw_attrs [Name name; TypeRef r; Byte_size 4 (*; Location search *)]) in
+      (* reference to structure_type *)
+      with_closed_referencable_tags add dw_TAG_structure_type
+          (dw_attrs [Name "@obj"; Byte_size (4 * length selectors)] @ map field selectors) in
+    prereqs @ ds, r
+
+and tuple ts : die list * int =
+  let open List in
+  let open Wasm_exts.Abbreviation in
+  let field_types_refs = map type_ref ts in
+  let field_refs = map snd field_types_refs in
+  let prereqs = concat_map fst field_types_refs in
+  match TupleRefs.find_opt field_refs !dw_tuples with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_tuples := TupleRefs.add field_refs r !dw_tuples in
+    let ds, r =
+      let field index (_, r) =
+        unreferencable_tag dw_TAG_member_Word_sized_typed
+          (dw_attrs [Name (Printf.sprintf ".%d" index); TypeRef r; Byte_size 4]) in
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (dw_attrs [Name "@tup"; Byte_size 4] @ mapi field field_types_refs) in
+    prereqs @ ds, r
+
+
+
+(* Location expressions for DWARF
+   These are instruction sequences that direct the debugger
+   at where the data resides.
+ *)
+let rec loc slot =
+  let unskew, past_tag = 1, 4 in
+  let open Type in
+  function (* See Note [locations for types] *)
+  | Type.Variant vs when is_enum vs ->
+    Location.local slot [ dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  | Type.Variant _ -> Location.local slot [ dw_OP_plus_uconst; unskew ]
+  | Prim Text -> Location.local slot [ dw_OP_plus_uconst; unskew; dw_OP_stack_value ]
+  | Prim Char -> Location.local slot [ dw_OP_lit8; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Bool -> Location.local slot [ dw_OP_lit1; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int8 -> Location.local slot [ dw_OP_lit24; dw_OP_shra; dw_OP_stack_value ]
+  | Prim Nat8 -> Location.local slot [ dw_OP_lit24; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int16 -> Location.local slot [ dw_OP_lit16; dw_OP_shra; dw_OP_stack_value ]
+  | Prim Nat16 -> Location.local slot [ dw_OP_lit16; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int32 -> Location.local slot [ dw_OP_dup; dw_OP_lit1; dw_OP_and; dw_OP_bra; 5; 0;
+                                        dw_OP_lit1; dw_OP_shra; dw_OP_skip; 3; 0;
+                                        dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  | Prim Nat32 -> Location.local slot [ dw_OP_dup; dw_OP_lit1; dw_OP_and; dw_OP_bra; 5; 0;
+                                                 dw_OP_lit1; dw_OP_shr; dw_OP_skip; 3; 0;
+                                                 dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  (* FIXME: for Int64|Nat64|Nat|Int the heap check is ignored for now *)
+  | Prim Int64 -> Location.local slot [ dw_OP_lit1; dw_OP_shra; dw_OP_const4u; 0xFF; 0xFF; 0xFF; 0xFF; dw_OP_and; dw_OP_stack_value ]
+  | Prim Nat64 -> Location.local slot [ dw_OP_lit1; dw_OP_shr; dw_OP_const4u; 0x7F; 0xFF; 0xFF; 0xFF; dw_OP_and; dw_OP_stack_value ]
+  | Prim (Nat|Int) -> Location.local slot [ dw_OP_lit1; dw_OP_shra; dw_OP_stack_value ]
+
+  | Tup _ -> Location.local slot []
+  | Con (c, _) as ty ->
+    begin match obvious_prim_of_con c ty with
+    | Some p -> loc slot (Prim p)
+    | _ -> Location.local slot [ dw_OP_stack_value ] (* FIXME: locate real type *)
+    end
+  | _ -> Location.local slot [ dw_OP_stack_value ] (* FIXME: objects, options *)
+
+
+(* Initiate a (hierarchical) DWARF tag
+   this might produce a list of DIEs
+   and might need a subsequent closing DIE.
+   See Note [emit a DW_TAG] *)
+let tag_open : dw_TAG -> die list =
+  let prim_type prim = fst (prim_type_ref prim) in
+  let type_ ty = fst (type_ref ty) in
+  let append_tag ds t ats = ds @ [unreferencable_tag t ats] in
+  let open Type in
+  function
+  | Compile_unit (dir, file) ->
+    let base_types = (* these are emitted for inspectionability, now *)
+      List.concat_map prim_type
+        [ Bool; Char; Text; Nat8; Int8; Nat16
+        ; Int16; Nat32; Int32; Nat64; Int64] in
+    let builtin_types =
+      type_ Any @
+      prim_type Nat @
+      prim_type Int in
+    [unreferencable_tag dw_TAG_compile_unit
+       (dw_attrs
+          [ Producer (Printf.sprintf "DFINITY Motoko compiler %s" Source_id.banner);
+            Language dw_LANG_Motoko; Name file; Stmt_list 0;
+            Comp_dir dir; Use_UTF8 true; Low_pc; Addr_base 8; Ranges ] @
+        base_types @ builtin_types)]
+  | Subprogram (name, [retty], pos) ->
+    let ds, ref_ret = type_ref retty in
+    append_tag ds Wasm_exts.Abbreviation.dw_TAG_subprogram_Ret
+      (dw_attrs [Low_pc; High_pc; Name name; TypeRef ref_ret; Decl_file pos.Source.file; Decl_line pos.Source.line; Decl_column pos.Source.column; Prototyped true; External false])
+  | Subprogram (name, _, pos) ->
+    [unreferencable_tag dw_TAG_subprogram
+       (dw_attrs [Low_pc; High_pc; Name name; Decl_file pos.Source.file; Decl_line pos.Source.line; Decl_column pos.Source.column; Prototyped true; External false])]
+  | Formal_parameter (name, pos, ty, slot) ->
+    let ds, reference = type_ref ty in
+    append_tag ds dw_TAG_formal_parameter
+      (dw_attrs [Name name; Decl_line pos.Source.line; Decl_column pos.Source.column; TypeRef reference; Location (loc slot ty)])
+  | LexicalBlock pos ->
+    [unreferencable_tag dw_TAG_lexical_block
+       (dw_attrs [Decl_line pos.Source.line; Decl_column pos.Source.column])]
+  | Variable (name, pos, ty, slot) ->
+    let ds, reference = type_ref ty in
+    append_tag ds dw_TAG_variable
+      (dw_attrs [Name name; Decl_line pos.Source.line; Decl_column pos.Source.column; TypeRef reference; Location (loc slot ty)])
+  | Type ty -> type_ ty
+  | _ -> assert false
+
+
+
+ + + diff --git a/coverage/codegen/instrList.ml.html b/coverage/codegen/instrList.ml.html new file mode 100644 index 00000000000..306ba68f43d --- /dev/null +++ b/coverage/codegen/instrList.ml.html @@ -0,0 +1,971 @@ + + + + + instrList.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+
+
(*
+This module provides some convenience to assemble WASM instruction lists. The
+features are
+
+ * O(1) concatenation (using difference list internally)
+ * Managing of label depths.
+ * Some simple peephole optimizations.
+*)
+
+open Wasm_exts.Ast
+open Wasm.Source
+open Wasm.Values
+
+let combine_shifts const op = function
+  | I32 opl, ({it = I32 l'; _} as cl), I32 opr, I32 r' when opl = opr ->
+    let l, r = Int32.(to_int l', to_int r') in
+    if (l >= 0 && l < 32 && r >= 0 && r < 32 && l + r < 32) then
+      Some [{const with it = Const {cl with it = I32 (Int32.add l' r')}}; {op with it = Binary (I32 opl)}]
+    else None
+  | _ -> None
+
+(* Some simple peephole optimizations, to make the output code look less stupid *)
+(* This uses a zipper.*)
+let optimize : instr list -> instr list = fun is ->
+  let rec go l r = match l, r with
+    (* Combine adjacent Metas *)
+    | {it = Meta m2; _} as n2 :: {it = Meta m1; _} :: l', r' ->
+      let combined =
+        let open Wasm_exts.Dwarf5.Meta in
+        match m1, m2 with
+        | StatementDelimiter _, StatementDelimiter _ -> m2
+        | StatementDelimiter _, Grouped (StatementDelimiter _ :: t) -> Grouped (m2 :: t)
+        | Grouped g1, Grouped g2 -> Grouped (g2 @ g1)
+        | Grouped g1, _ -> Grouped (m2 :: g1)
+        | _, Grouped g2 -> Grouped (g2 @ [m1])
+        | _, _ -> Grouped [m2; m1] in
+      go ({ n2 with it = Meta combined } :: l') r'
+
+    (* Loading and dropping is pointless *)
+    | { it = Const _ | LocalGet _; _} :: l', { it = Drop; _ } :: r' -> go l' r'
+    (* Loading and dropping is pointless, even with intervening Meta *)
+    | { it = Meta _; _} as m :: { it = Const _ | LocalGet _; _} :: l', { it = Drop; _ } :: r' -> go l' (m :: r')
+    (* The following is not semantics preserving for general Wasm (due to out-of-memory)
+       but should be fine for the code that we create *)
+    | { it = Load _; _} :: l', { it = Drop; _ } :: _ -> go l' r
+    (* Introduce LocalTee *)
+    | { it = LocalSet n1; _} :: l', ({ it = LocalGet n2; _ } as i) :: r' when n1 = n2 ->
+      go l' ({i with it = LocalTee n2 } :: r')
+    (* Introduce LocalTee with previously intervening Meta *)
+    | { it = Meta _; _} as m :: { it = LocalSet n1; _} :: l', ({ it = LocalGet n2; _ } as i) :: r' when n1 = n2 ->
+      go l' (m :: {i with it = LocalTee n2 } :: r')
+    (* Eliminate LocalTee followed by Drop (good for confluence) *)
+    | ({ it = LocalTee n; _} as i) :: l', { it = Drop; _ } :: r' ->
+      go l' ({i with it = LocalSet n } :: r')
+    (* Eliminate Get followed by Set (typical artifact from the multi-value emulation) *)
+    | { it = LocalGet n1; _} :: l', ({ it = LocalSet n2; _ }) :: r' when n1 = n2 ->
+      go l' r'
+    | { it = GlobalGet n1; _} :: l', ({ it = GlobalSet n2; _ }) :: r' when n1 = n2 ->
+      go l' r'
+    (* Code after Return, Br or Unreachable is dead *)
+    | _, ({ it = Return | Br _ | Unreachable; _ } as i) :: t ->
+      (* see Note [funneling DIEs through Wasm.Ast] *)
+      List.(rev (i :: l) @ find_all (fun instr -> Wasm_exts.Ast.is_dwarf_like instr.it) t)
+    (* Equals zero has a dedicated operation (and works well with leg swapping) *)
+    | ({it = Compare (I32 I32Op.Eq); _} as i) :: {it = Const {it = I32 0l; _}; _} :: l', r' ->
+      go l' ({ i with it = Test (I32 I32Op.Eqz)} :: r')
+    | ({it = Compare (I64 I64Op.Eq); _} as i) :: {it = Const {it = I64 0L; _}; _} :: l', r' ->
+      go l' ({ i with it = Test (I64 I64Op.Eqz)} :: r')
+    (* Constants before `Eqz` reduce trivially *)
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Const {it = I32 n; _}; _} :: l', r' ->
+      go l' ({ i with it = Const {it = I32 (if n = 0l then 1l else 0l); at = i.at}} :: r')
+    | ({it = Test (I64 I64Op.Eqz); _} as i) :: {it = Const {it = I64 n; _}; _} :: l', r' ->
+      go l' ({ i with it = Const {it = I32 (if n = 0L then 1l else 0l); at = i.at}} :: r')
+    (* eqz after eq/ne becomes ne/eq *)
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I32 I32Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (I32 I32Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I32 I32Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (I32 I32Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I64 I64Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (I64 I64Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I64 I64Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (I64 I64Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F32 F32Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (F32 F32Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F32 F32Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (F32 F32Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F64 F64Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (F64 F64Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F64 F64Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (F64 F64Op.Eq)} :: r')
+    (* LSBit masking before `If` is `Ctz` and switched `If` legs *)
+    | ({ it = Binary (I32 I32Op.And); _} as a) :: { it = Const {it = I32 1l; _}; _} :: l', ({it = If (res,then_,else_); _} as i) :: r' ->
+      go ({a with it = Unary (I32 I32Op.Ctz)} :: l') ({i with it = If (res,else_,then_)} :: r')
+    (* `If` blocks after pushed constants are simplifiable *)
+    | { it = Const {it = I32 0l; _}; _} :: l', ({it = If (res,_,else_); _} as i) :: r' ->
+      go l' ({i with it = Block (res, else_)} :: r')
+    | { it = Const {it = I32 _; _}; _} :: l', ({it = If (res,then_,_); _} as i) :: r' ->
+      go l' ({i with it = Block (res, then_)} :: r')
+    (* `If` blocks after negation can swap legs *)
+    | { it = Test (I32 I32Op.Eqz); _} :: l', ({it = If (res,then_,else_); _} as i) :: r' ->
+      go l' ({i with it = If (res,else_,then_)} :: r')
+    (* `If` blocks with empty legs just drop *)
+    | l', ({it = If (_,[],[]); _} as i) :: r' ->
+       go l' ({i with it = Drop} :: r')
+    (* `If` blocks with empty then after comparison can invert the comparison and swap legs *)
+    | { it = Compare (I32 I32Op.Eq); _} as comp :: l', ({it = If (res,[],else_); _} as i) :: r' ->
+      go ({comp with it = Compare (I32 I32Op.Ne)} :: l') ({i with it = If (res,else_,[])} :: r')
+    | { it = (Compare (I32 I32Op.Ne) | Binary (I32 I32Op.Xor)); _} as comp :: l', ({it = If (res,[],else_); _} as i) :: r' ->
+      go ({comp with it = Compare (I32 I32Op.Eq)} :: l') ({i with it = If (res,else_,[])} :: r')
+    (* Empty block is redundant *)
+    | l', ({ it = Block (_, []); _ }) :: r' -> go l' r'
+    (* Constant shifts can be combined *)
+    | {it = Binary (I32 I32Op.(Shl|ShrS|ShrU) as opl); _} :: {it = Const cl; _} :: l',
+      ({it = Const cr; _} as const) :: ({it = Binary opr; _} as op) :: r'
+        when Option.is_some (combine_shifts const op (opl, cl, opr, cr.it)) ->
+      go l' (Option.get (combine_shifts const op (opl, cl, opr, cr.it)) @ r')
+    (* Null shifts can be eliminated *)
+    | l', {it = Const {it = I32 0l; _}; _} :: {it = Binary (I32 I32Op.(Shl|ShrS|ShrU)); _} :: r' ->
+      go l' r'
+    (* Look further *)
+    | _, i::r' -> go (i::l) r'
+    (* Done looking *)
+    | l, [] -> List.rev l
+  in go [] is
+
+(* The main type of this module:
+   Arguments for the current depth and the current source region,
+   and producing a difference list *)
+type t = int32 -> Wasm.Source.region -> instr list -> instr list
+
+let to_instr_list (is : t) : instr list =
+  optimize (is 0l Wasm.Source.no_region [])
+
+let to_nested_list d pos is =
+  optimize (is Int32.(add d 1l) pos [])
+
+
+(* Do nothing *)
+let nop : t = fun _ _ rest -> rest
+
+(* The concatenation operator *)
+let (^^) (is1 : t) (is2 : t) : t = fun d pos rest -> is1 d pos (is2 d pos rest)
+
+(* Singletons *)
+let i (instr : instr') : t = fun _ pos rest -> (instr @@ pos) :: rest
+
+(* map and concat *)
+let concat xs = List.fold_right (^^) xs nop
+let concat_map f xs = List.fold_right (^^) (List.map f xs) nop
+let concat_mapi f xs = List.fold_right (^^) (List.mapi f xs) nop
+let table n f = List.fold_right (^^) (Lib.List.table n f) nop
+
+(* Region-managing combinator *)
+
+let cr at =
+  let left = Wasm.Source.{
+    file = at.Source.left.Source.file;
+    line = at.Source.left.Source.line;
+    column = at.Source.left.Source.column } in
+  let right = Wasm.Source.{
+    file = at.Source.right.Source.file;
+    line = at.Source.right.Source.line;
+    column = at.Source.right.Source.column } in
+  Wasm.Source.{ left; right }
+
+let with_region (pos : Source.region) (body : t) : t =
+  fun d _pos rest -> body d (cr pos) rest
+
+(* Depths-managing combinators *)
+
+let if_ (ty : block_type) (thn : t) (els : t) : t =
+  fun d pos rest ->
+    (If (ty, to_nested_list d pos thn, to_nested_list d pos els) @@ pos) :: rest
+
+(* Shortcuts for unary and nullary variants *)
+let if0 = if_ (ValBlockType None)
+let if1 ty = if_ (ValBlockType (Some ty))
+
+let block_ (ty : block_type) (body : t) : t =
+  fun d pos rest ->
+    (Block (ty, to_nested_list d pos body) @@ pos) :: rest
+let block0 = block_ (ValBlockType None)
+let block1 ty = block_ (ValBlockType (Some ty))
+
+let loop0 (body : t) : t =
+  fun d pos rest ->
+    (Loop (ValBlockType None, to_nested_list d pos body) @@ pos) :: rest
+
+(* Remember depth *)
+type depth = int32 Lib.Promise.t
+
+let new_depth_label () : depth =  Lib.Promise.make ()
+
+let remember_depth depth (is : t) : t =
+  fun d rest -> Lib.Promise.fulfill depth d; is d rest
+
+let with_current_depth (k : depth -> t) : t =
+  let depth = new_depth_label () in
+  remember_depth depth (k depth)
+
+let with_current_depth' (k : depth -> ('a * t)) : ('a * t) =
+  let depth = new_depth_label () in
+  let x, is = k depth in
+  (x, remember_depth depth is)
+
+let branch_to_ (p : depth) : t =
+  fun d pos rest ->
+    (Br (Int32.(sub d (Lib.Promise.value p)) @@ pos) @@ pos) :: rest
+
+(* Convenience combinators *)
+
+let labeled_block1 ty depth (body : t) : t =
+  block1 ty (remember_depth depth body)
+
+(* Obtain the setter from a known variable's getter *)
+
+let setter_for (getter : t) =
+  match List.map (fun {it; _} -> it) (getter 0l Wasm.Source.no_region []) with
+  | [LocalGet v] -> i (LocalSet v)
+  | [GlobalGet v] -> i (GlobalSet v)
+  | _ -> failwith "input must be a getter"
+
+(* Intended to be used within assert *)
+
+let is_nop (is : t) =
+  is 0l Wasm.Source.no_region [] = []
+
+(* DWARF tags and attributes: see Note [funneling DIEs through Wasm.Ast] *)
+
+open Wasm_exts.Dwarf5
+open Meta
+
+open Die
+
+(* Note [emit a DW_TAG]
+   ~~~~~~~~~~~~~~~~~~~~
+   There are two principal types of DWARF tags, those
+   which are intimately tied to the generated instructions
+   and those that are not. The latter ones include type
+   definitions which can be regarded as global, while
+   the former bracket or delimit instructions, like
+   scoping or variable definitions. These are required to
+   float with the instruction stream.
+
+   Another aspect of tags is whether a tag admits children.
+   When it admits children, these follow sequentially,
+   closed by dw_tag_close. The abbreviation table must
+   be consulted when deciding between
+   - dw_tag_no_children, or
+   - dw_tag.
+   The former is self-closing (no nested tags), and the
+   latter is high-level, straddling a region of code.
+   The low-level alternative to the latter is using the
+   dw_tag_open/dw_tag_close pair explicitly to demarcate
+   the enclosed instructions. This moves the burden of
+   balancing to the user.
+   See also: Note [funneling DIEs through Wasm.Ast]
+ *)
+
+(* Note [locations for types]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~
+   Motoko uses a variety of formats to store data depending on its type
+   and even the actual value. Location  expressions are necessary to teach
+   the debugger where the data can be found.
+   - For short numeric types we have a location expression that LSB-aligns
+     and leaves the value on the expression stack. This is a workaround for
+     `lldb`'s insufficiency to understand basic types that are bitfields
+     (http://lists.llvm.org/pipermail/lldb-dev/2020-August/016393.html).
+     This also implies that setting of such variables in `lldb` won't work.
+   - 32/64 bit-sized integrals may be stored on the heap, we use `DW_OP_bra`
+     to guide the debugger after examining the indirection bit.
+     We can't use the pointer key to be a discriminator for DW_TAG_variant_part
+     because of lldb (link above), and probably displaying issues.
+   - For arbitrary-precision integrals, we cannot inspect the multi-precision
+     heap representation yet
+   - Variants with no payload map to C-like `enum`s, the location expression
+     takes care of focussing on the hash value
+   - Variants map to `DW_TAG_variant_*` directly
+   - Tuples may use Rust-like decoding
+   - Objects need field search for members (when encoded as structure members)
+   - The `Any` type will need fully dynamic resolution by `lldb`
+   - Parameter types for polymorphic types/functions will be treated as `Any`.
+   - `Text` will be treated as `Any` as it needs pretty-printing in the presence
+     of concatenation nodes
+
+ *)
+
+(* injecting a tag into the instruction stream, see Note [emit a DW_TAG] *)
+let dw_tag_open tag : t =
+  let metas = concat_map (fun die -> i (Meta die)) in
+  metas (tag_open tag)
+
+let dw_tag die body =
+  let dw_tag_close : t = i (Meta TagClose) in
+  dw_tag_open die ^^ body ^^ dw_tag_close
+let dw_tag_no_children = dw_tag_open (* self-closing *)
+
+(* Marker for statement boundaries *)
+let dw_statement { Source.left; Source.right } =
+  let open Wasm.Source in
+  let left = { file = left.Source.file; line = left.Source.line; column = left.Source.column } in
+  i (Meta (StatementDelimiter left))
+
+
+
+ + + diff --git a/coverage/coverage.css b/coverage/coverage.css new file mode 100644 index 00000000000..35bb22a727f --- /dev/null +++ b/coverage/coverage.css @@ -0,0 +1,500 @@ +:root, .light:root { + --main-background: #fff; + --code-background: transparent; + --line-numbers-background: rgba(0, 0, 0, 0.025); + --navbar-background: #eee; + + --meter-unvisited-color: #f9c3c3; + --meter-visited-color: #9ed09f; + --meter-separator-color: white; + + --color: #000; + --dirname-color: #bbb; + --stats-color: #aaa; + --underline-color: #ddd; + --visited-color: #eaffea; + --visited-number-color: rgba(64, 192, 64, 0.2); + --unvisited-color: #ffecec; + --unvisited-number-color: rgba(255, 128, 128, 0.5); + --somevisited-color: #ffd; + --highlight-color: #a0fbff; + --line-number-color: rgba(0, 0, 0, 0.4); + --unvisited-margin-color: #d69e9e; + --border: #eee; + --navbar-border: #ddd; + --code-color: #000; + --hljs-link: #6a737d; + --hljs-keyword: #d73a49; + --hljs-regexp: #032f62; + --hljs-title: #900; + --hljs-type: #6f42c1; + --hljs-meta: #22863a; + --hljs-variable: #005cc5; +} + +.dark:root { + --main-background: #202020; + --code-background: #222; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --meter-unvisited-color: #622; + --meter-visited-color: #252; + --meter-separator-color: black; + + --color: #bebebe; + --dirname-color: #666; + --stats-color: #555; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #822; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; +} + +@media (prefers-color-scheme: dark) { + :root { + --main-background: #202020; + --code-background: #222; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --meter-unvisited-color: #622; + --meter-visited-color: #252; + --meter-separator-color: black; + + --color: #bebebe; + --dirname-color: #666; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #822; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5em; + background-color: var(--main-background); +} + +pre { + margin: 0; + font-family: "Fira Code", "Cascadia Code", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 13px; + color: var(--code-color); + cursor: text; +} + +code { + font-family: inherit; +} + +a { + text-decoration: none; + color: inherit; +} + +a:visited { + color: inherit; +} + +#header { + color: var(--color); +} + +h1 { + display: inline-block; + margin: 1.5em 1.5em 0.75em 1.5em; +} + +.dirname { + color: var(--dirname-color); +} + +h2 { + display: inline-block; + position: relative; + top: -1px; +} + +#footer { + margin: 1em 0 1em 4em; + color: #aaa; + font-size: 12px; +} + +#footer a { + color: #666; + border-bottom: 1px solid #ccc; +} + +#footer a:visited { + color: #666; +} + +#navbar { + position: fixed; + top: 0; + left: 0; + width: 1em; + height: 100%; + background-color: var(--navbar-background); + border-right: 1px solid var(--navbar-border); + cursor: pointer; +} + +#navbar span { + display: block; + position: absolute; + width: 100%; + height: 5px; +} + +#navbar .unvisited, #navbar .some-visited { + background-color: var(--unvisited-margin-color); +} + +#report { + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + overflow: hidden; +} + +#lines-layer { + position: absolute; + z-index: -100; + width: 100%; + background-color: var(--code-background); +} + +#lines-layer span { + display: inline-block; + width: 100%; +} + +a[id] { + display: block; + position: relative; + top: -5.5em; +} + +#lines-layer .unvisited { + background-color: var(--unvisited-color); +} + +#lines-layer .visited { + background-color: var(--visited-color); +} + +#lines-layer .some-visited { + background-color: var(--somevisited-color); +} + +a[id]:target + span { + -webkit-animation: highlight-blank 0.5s; + -moz-animation: highlight-blank 0.5s; + -o-animation: highlight-blank 0.5s; + animation: highlight-blank 0.5s; +} + +a[id]:target + .unvisited { + -webkit-animation: highlight-unvisited 0.5s; + -moz-animation: highlight-unvisited 0.5s; + -o-animation: highlight-unvisited 0.5s; + animation: highlight-unvisited 0.5s; +} + +a[id]:target + .visited { + -webkit-animation: highlight-visited 0.5s; + -moz-animation: highlight-visited 0.5s; + -o-animation: highlight-visited 0.5s; + animation: highlight-visited 0.5s; +} + +a[id]:target + .some-visited { + -webkit-animation: highlight-some-visited 0.5s; + -moz-animation: highlight-some-visited 0.5s; + -o-animation: highlight-some-visited 0.5s; + animation: highlight-some-visited 0.5s; +} + +@-webkit-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-moz-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-o-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-webkit-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-moz-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-o-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-webkit-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-moz-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-o-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-webkit-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@-moz-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@-o-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +#line-numbers { + float: left; + border-right: 1px solid var(--border); + margin-right: 1em; + color: var(--line-number-color); + background-color: var(--line-numbers-background); + text-align: right; +} + +#line-numbers a { + display: inline-block; + padding-left: 2.35em; + padding-right: 1em; + text-decoration: none; + color: var(--line-number-color); +} + +#line-numbers .unvisited { + background-color: var(--unvisted-number-color); +} + +#line-numbers .visited { + background-color: var(--visted-number-color); +} + +code span[data-count] { + background-color: var(--visited-number-color); +} + +code span[data-count="0"] { + background-color: var(--unvisited-number-color); +} + +#tool-tip { + display: none; + position: fixed; + padding: 0 0.25em; + background-color: black; + color: white; +} + +#tool-tip.visible { + display: block; +} + +#files { + padding: 1.5em 4em; + background-color: var(--code-background); + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.meter { + display: inline-block; + position: relative; + top: 3px; + width: 5em; + height: 1em; + background-color: var(--meter-unvisited-color); +} + +.covered { + display: inline-block; + position: absolute; + width: 50%; + height: 100%; + background-color: var(--meter-visited-color); + border-right: 1px solid var(--meter-separator-color); +} + +#files div { + display: flex; +} + +summary { + cursor: pointer; + display: flex; +} + +.summary-indicator { + display: inline-block; + width: 1em; + color: var(--color); +} + +/* Adds indentation to the directory tree */ +details > details, details > div { + margin-left: 1em; +} + +details > summary > .summary-indicator { + text-align: center; + font-weight: bold; +} + +details > summary > .summary-indicator::before { + content: "+"; +} + +details[open] > summary > .summary-indicator::before { + content: "-"; +} + +.percentage { + display: inline-block; + min-width: 7.5em; + margin: 0 0.5em; + font-size: 90%; + color: var(--color); +} + +.stats { + display: inline-block; + font-size: 70%; + color: var(--stats-color); +} + +#files a { + text-decoration: none; + border-bottom: 1px solid var(--underline-color); + color: var(--color); +} + +.hljs-link, +.hljs-comment, +.hljs-quote { + color: var(--hljs-link); +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: var(--hljs-keyword); +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: var(--hljs-variable); +} + +.hljs-regexp, +.hljs-string, +.hljs-doctag { + color: var(--hljs-regexp); +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: var(--hljs-title); +} + +.hljs-type, +.hljs-class .hljs-title { + color: var(--hljs-type); +} + +.hljs-meta, +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: var(--hljs-meta); +} diff --git a/coverage/coverage.js b/coverage/coverage.js new file mode 100644 index 00000000000..ef272543670 --- /dev/null +++ b/coverage/coverage.js @@ -0,0 +1,164 @@ +function tool_tip_element() +{ + var element = document.querySelector("#tool-tip"); + if (element === null) { + element = document.createElement("div"); + element.id = "tool-tip"; + document.querySelector("body").appendChild(element); + } + + return element; +}; + +var tool_tip = tool_tip_element(); +var html = document.getElementsByTagName("html")[0]; + +function attach_tool_tip() +{ + document.querySelector("body").onmousemove = function (event) + { + var element = event.target; + if (element.dataset.count === undefined) + element = event.target.parentNode; + + if (element.dataset.count && element.dataset.count !== "0") { + tool_tip.textContent = element.dataset.count; + tool_tip.classList.add("visible"); + + if (event.clientY < html.clientHeight - 48) + tool_tip.style.top = event.clientY + 7 + "px"; + else + tool_tip.style.top = event.clientY - 32 + "px"; + + tool_tip.style.left = event.clientX + 7 + "px"; + } + else + tool_tip.classList.remove("visible"); + } +}; + +attach_tool_tip(); + +function move_line_to_cursor(cursor_y, line_number) +{ + var id = "L" + line_number; + + var line_anchor = + document.querySelector("a[id=" + id + "] + span"); + if (line_anchor === null) + return; + + var line_y = line_anchor.getBoundingClientRect().top + 18; + + var y = window.scrollY; + window.location = "#" + id; + window.scrollTo(0, y + line_y - cursor_y); +}; + +function handle_navbar_clicks() +{ + var line_count = document.querySelectorAll("a[id]").length; + var navbar = document.querySelector("#navbar"); + + if (navbar === null) + return; + + navbar.onclick = function (event) + { + event.preventDefault(); + + var line_number = + Math.floor(event.clientY / navbar.clientHeight * line_count + 1); + + move_line_to_cursor(event.clientY, line_number); + }; +}; + +handle_navbar_clicks(); + +function handle_line_number_clicks() +{ + document.querySelector("body").onclick = function (event) + { + if (event.target.tagName != "A") + return; + + var line_number_location = event.target.href.search(/#L[0-9]+\$/); + if (line_number_location === -1) + return; + + var anchor = event.target.href.slice(line_number_location); + + event.preventDefault(); + + var y = window.scrollY; + window.location = anchor; + window.scrollTo(0, y); + }; +}; + +handle_line_number_clicks(); + +function handle_collapsible_click() +{ + document.querySelectorAll("summary").forEach( + function (summary) + { + summary.onclick = function (event) + { + var details = summary.parentElement; + + var all_open = function (sub_details) { + var all_are_open = true; + for (let details of sub_details) { + all_are_open = + all_are_open && + details.hasAttribute('open'); + } + return all_are_open; + }; + + var all_toggle = function (sub_details, toggle) { + for (let details of sub_details) { + if (toggle) + details.removeAttribute('open'); + else + details.setAttribute('open', ''); + } + }; + + // ctrl-click toggles the state of the folder and all sub-folders, recursively: + // - if all sub-folders are opened, then all sub-folders are closed + // - if at least one sub-folder is closed (or the folder itself), + // then all sub-folders are opened + if (event.ctrlKey) { + var sub_details = Array.prototype.slice.call( + details.querySelectorAll("details") + ); + sub_details.push(details); + all_toggle(sub_details, all_open(sub_details)); + return false; + } + + // shift-click toggles the state of all immediate sub-folders: + // - if the folder is closed, just open it + // - if the folder is opened: + // - if all sub-folders are opened, then all sub-folders are closed + // - if at least one sub-folder is closed, then all sub-folders are opened + if (event.shiftKey && details.hasAttribute('open')) { + details.setAttribute('open', ''); + var sub_details = + Array.prototype.filter.call( + details.querySelectorAll("details"), + function (sub_details) { + return sub_details.parentNode === details; + } + ); + all_toggle(sub_details, all_open(sub_details)); + return false; + } + }; + }); +} + +handle_collapsible_click(); diff --git a/coverage/exes/deser.ml.html b/coverage/exes/deser.ml.html new file mode 100644 index 00000000000..aa848f02ce6 --- /dev/null +++ b/coverage/exes/deser.ml.html @@ -0,0 +1,1860 @@ + + + + + deser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+
+
open Stdio.In_channel
+open Lazy
+
+(* The type of outputters
+
+ While decoding a type, we simultaneously build an outputter (IO action),
+ that reads bytes from the stdin and dumps to stdout in a formatted way.
+*)
+
+type outputter = unit -> unit
+
+(* noise reduction *)
+
+let chatty = ref false
+
+(* read nothing *)
+
+let epsilon : outputter = ignore
+
+(* reading at byte-level *)
+
+let read_byte () : int =
+  let b = input_byte stdin in
+  match b with
+  | Some b -> b
+  | None -> failwith "EOF"
+
+let read_2byte () : int =
+  let lsb = read_byte () in
+  let msb = read_byte () in
+  msb lsl 8 + lsb
+
+let read_4byte () : int =
+  let lsb = read_2byte () in
+  let msb = read_2byte () in
+  msb lsl 16 + lsb
+
+let read_8byte () : Big_int.big_int =
+  let lsb = read_4byte () in
+  let msb = read_4byte () in
+  Big_int.(add_int_big_int lsb (mult_int_big_int 4294967296 (big_int_of_int msb)))
+
+let read_signed_byte () : bool * int =
+  let b = read_byte () in
+  if b > 127 then true, b - 128 else false, b
+
+let read_known char : unit =
+  match read_byte () with
+  | b when b = Char.code char -> ()
+  | _ -> failwith "unexpected"
+
+(* reading numbers *)
+
+let read_leb128 () : int = (* TODO: should be bigint *)
+  let rec leb128 w : int =
+  match read_signed_byte () with
+  | (true, n) -> w * n + leb128 (w * 128)
+  | (_, n) -> w * n in
+  leb128 1
+
+let read_sleb128 () : int = (* TODO: should be bigint *)
+  let rec sleb128 w : int =
+    match read_signed_byte () with
+    | (true, n) -> w * n + sleb128 (w * 128)
+    | (_, n) -> w * if n > 63 then n - 128 else n in
+  sleb128 1
+
+let read_int8 () : int =
+  match read_signed_byte () with
+  | (true, n) -> n - 128
+  | (_, n) -> n
+
+let read_int16 () : int =
+  let lsb = read_byte () in
+  let msb = read_int8 () in
+  msb lsl 8 lor lsb
+
+let read_int32 () : int =
+  let lsb = read_2byte () in
+  let msb = read_int16 () in
+  msb lsl 16 lor lsb
+
+let read_int64 () : Big_int.big_int =
+  let lsb = read_4byte () in
+  let msb = read_int32 () in
+  Big_int.(add_int_big_int lsb (mult_int_big_int 4294967296 (big_int_of_int msb)))
+
+let read_bool () : bool =
+  match read_byte () with
+  | 0 -> false
+  | 1 -> true
+  | _ -> failwith "invalid boolean"
+
+(* Magic *)
+
+let read_magic () : unit =
+  read_known 'D';
+  read_known 'I';
+  read_known 'D';
+  read_known 'L'
+
+(* Repetition *)
+
+let read_star_heralding a (heralder : int -> outputter * ('a -> int -> outputter -> outputter)) (t : outputter) : unit =
+  let rep = read_leb128 () in
+  let herald_vector, herald_member = heralder rep in
+  herald_vector ();
+  for i = 0 to rep - 1 do
+    herald_member a i t ()
+  done
+
+let read_t_star (t : unit -> 'a) : 'a array =
+  let rep = read_leb128 () in
+  Array.init rep (fun _ -> t ())
+
+(* Annotations *)
+
+type ann = Pure | Oneway
+
+let read_annotation () : ann =
+  match read_byte () with
+  | 1 -> Pure
+  | 2 -> Oneway
+  | _ -> failwith "invalid annotation"
+
+type typ = Null | Bool | Nat | NatN of int
+         | Int | IntN of int | Text | Reserved | Empty
+         | Opt of typ Lazy.t | Vec of typ Lazy.t
+         | Record of fields
+         | Variant of alts
+         | Function of typ Lazy.t array * typ Lazy.t array * ann array
+         | Future of int * Buffer.t
+
+and alts = (int * typ Lazy.t) array
+and fields = (int * typ Lazy.t) array
+
+(* type index/ground type (negative) *)
+
+let read_type_index () = let ty = read_sleb128 () in assert (ty > -18); ty
+
+let read_assoc () = let hash = read_leb128 () in
+                    let tynum = read_type_index () in
+                    if !chatty then Printf.printf "hash: %d, tynum: %d\n" hash tynum; hash, tynum
+
+module type Dump =
+sig
+val output_nat : int -> unit
+val output_int : int -> unit
+val output_bool : bool -> unit
+val output_nil : outputter
+val output_byte : int -> unit
+val output_2byte : int -> unit
+val output_4byte : int -> unit
+val output_8byte : Big_int.big_int -> unit
+val output_int8 : int -> unit
+val output_int16 : int -> unit
+val output_int32 : int -> unit
+val output_int64 : Big_int.big_int -> unit
+val output_text : int -> Stdio.In_channel.t -> Stdio.Out_channel.t -> unit
+val output_some : outputter -> unit
+val output_arguments : int -> outputter * (unit -> int -> outputter -> outputter)
+val output_vector : int -> outputter * (unit -> int -> outputter -> outputter)
+val output_record : int -> outputter * (fields -> int -> outputter -> outputter)
+val output_variant : int -> outputter * (alts -> int -> outputter -> outputter)
+end
+
+
+module OutputProse : Dump = struct
+
+(* indentation *)
+
+let indent_amount : int = 4
+let indentation : int ref = ref 0
+let continue_line : bool ref = ref false
+
+let indent () = indentation := !indentation + indent_amount
+let outdent () = indentation := !indentation - indent_amount
+let ind i = if i = 0 then indent ()
+let outd max i = if i + 1 = max then outdent ()
+let bracket max g p i f () = ind i; g p i f; outd max i
+
+let fill () = if !continue_line then (continue_line := false; "") else String.make !indentation ' '
+
+let output_string what (s : string) = Printf.printf "%s%s: %s\n" (fill ()) what s
+let output_decimal what (i : int) = Printf.printf "%s%s: %d\n" (fill ()) what i
+let output_big_decimal what (i : Big_int.big_int) = Printf.printf "%s%s: %s\n" (fill ()) what (Big_int.string_of_big_int i)
+
+(* outputters *)
+let output_nat nat = output_decimal "output_nat" nat
+let output_int int = output_decimal "output_int" int
+let output_bool b = output_string "output_bool" (if b then "true" else "false")
+let output_nil () = Printf.printf "%snull (0 bytes)\n" (fill ())
+let output_some consumer = Printf.printf "%sSome: value follows on the next line\n"  (fill ()); consumer ()
+let output_byte b = output_decimal "output_byte" b
+let output_2byte b = output_decimal "output_2byte" b
+let output_4byte b = output_decimal "output_4byte" b
+let output_8byte b = output_big_decimal "output_8byte" b
+let output_int8 i = output_decimal "output_int8" i
+let output_int16 i = output_decimal "output_int16" i
+let output_int32 i = output_decimal "output_int32" i
+let output_int64 i = output_big_decimal "output_int64" i
+let output_text bytes from tostream =
+      let buf = Buffer.create 0 in
+      ignore (input_buffer from buf ~len:bytes);
+      Printf.printf "%sText: %d bytes follow on next line\n" (fill ()) bytes;
+      Printf.printf "%s---->" (fill ());
+      Stdio.Out_channel.output_buffer tostream buf;
+      print_string "\n"
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_arguments = function
+    | () when args = 0 -> Printf.printf "%sNo arguments...\n" (fill ())
+    | _ when args = 1 -> Printf.printf "%s1 argument follows\n" (fill ())
+    | _ -> Printf.printf "%s%d arguments follow\n" (fill ()) args in
+  let herald_member () i f = Printf.printf "%sArgument #%d%s: " (fill ()) i (if i + 1 = args then " (last)" else ""); continue_line := true; f () in
+  herald_arguments, bracket args herald_member
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_vector () = if members = 0 then Printf.printf "%sEmpty Vector\n" (fill ())
+                         else Printf.printf "%sVector with %d members follows\n" (fill ()) members in
+  let herald_member () i f = Printf.printf "%sVector member %d%s: " (fill ()) i (if i + 1 = members then " (last)" else ""); continue_line := true; f () in
+  herald_vector, bracket members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let herald_record () = if members = 0 then Printf.printf "%sEmpty Record\n" (fill ())
+                         else Printf.printf "%sRecord with %d members follows\n" (fill ()) members in
+  let herald_member fields i f = Printf.printf "%sRecord member %d%s: " (fill ()) (fst (Array.get fields i)) (if i + 1 = members then " (last)" else ""); continue_line := true; f () in
+  herald_record, bracket members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0);
+                          Printf.printf "%sVariant with %d members follows\n" (fill ()) members in
+  let herald_member alts i f () = indent (); Printf.printf "%sVariant member %d: " (fill ()) (fst (Array.get alts i)); continue_line := true; f (); outdent () in
+  herald_variant, herald_member
+
+end
+
+module OutputIdl : Dump = struct
+
+let output_string (s : string) = print_string s
+let chat_string s = if !chatty then output_string s
+let output_string_space (s : string) = output_string s; output_string " "
+let output_decimal (i : int) = Printf.printf "%d" i
+let output_big_decimal (i : Big_int.big_int) = output_string (Big_int.string_of_big_int i)
+(* let output_bignum (i : Big_int.big_int) = Printf.printf "%s" (Big_int.string_of_big_int i) *)
+let output_bignum (i : int) = output_decimal i (* for now, later: output_big_decimal *)
+let casted ty f v = match ty with
+  | IntN n -> f v; Printf.printf " : int%d" n
+  | NatN n -> f v; Printf.printf " : nat%d" n
+  | _ -> assert false
+
+let output_bool b = output_string (if b then "true" else "false")
+let output_nil () = output_string "null"
+let output_some consumer = output_string_space "opt"; consumer ()
+let output_byte, output_2byte, output_4byte =
+  casted (NatN 8) output_decimal, casted (NatN 16) output_decimal, casted (NatN 32) output_decimal
+let output_8byte = casted (NatN 64) output_big_decimal
+let output_nat, output_int = output_bignum, output_bignum
+let output_int8, output_int16, output_int32 =
+  casted (IntN 8) output_decimal, casted (IntN 16) output_decimal, casted (IntN 32) output_decimal
+let output_int64 = casted (IntN 64) output_big_decimal
+let output_text n froms tos =
+  output_string "\"";
+  let buf = Buffer.create 0 in
+  ignore (input_buffer froms buf ~len:n);
+  Stdio.Out_channel.output_buffer tos buf;
+  output_string "\""
+
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let last i = i + 1 = args in
+  let herald_arguments = function
+    | () when args = 0 -> chat_string "// No arguments...\n"; output_string "()"
+    | _ when args = 1 -> chat_string "// 1 argument follows\n"
+    | _ -> if !chatty then Printf.printf "// %d arguments follow\n" args in
+  let herald_member () i f () =
+    if !chatty then Printf.printf "// Argument #%d%s:\n" i (if last i then " (last)" else "");
+    output_string (if i = 0 then "( " else ", ");
+    f ();
+    output_string (if last i then "\n)" else "\n") in
+  herald_arguments, herald_member
+
+let start i = if i = 0 then output_string_space "{"
+let stop max i = if i + 1 = max then output_string " }"
+let bracket max g p i f () = start i; g p i f; stop max i
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_vector () = if members = 0 then output_string_space "vec { }"
+                         else output_string_space "vec" in
+  let herald_member () i f = f (); output_string_space ";" in
+  herald_vector, bracket members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let herald_record () = if members = 0 then output_string_space "record { }"
+                         else output_string_space "record" in
+  let herald_member fields i f = Printf.printf "%d : " (fst (Array.get fields i)); f (); output_string_space ";" in
+  herald_record, bracket members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0);
+                          output_string_space "variant" in
+  let herald_member alts i f () = start 0; Printf.printf "%d : " (fst (Array.get alts i)); f (); stop 1 0 in
+  herald_variant, herald_member
+end
+
+
+module OutputJson : Dump = struct
+
+let output_string (s : string) = print_string s
+let output_string_space (s : string) = Printf.printf "%s " s
+let output_decimal (i : int) = Printf.printf "%d" i
+let output_big_decimal (i : Big_int.big_int) = output_string (Big_int.string_of_big_int i)
+let output_bignum (i : int) = output_decimal i (* for now *)
+
+let output_bool b = output_string (if b then "true" else "false")
+let output_nil () = output_string "null"
+let output_some consumer = output_string "["; consumer (); output_string "]"
+let output_byte, output_2byte, output_4byte = output_decimal, output_decimal, output_decimal
+let output_8byte = output_big_decimal
+let output_nat, output_int = output_bignum, output_bignum
+let output_int8, output_int16, output_int32 = output_decimal, output_decimal, output_decimal
+let output_int64 = output_big_decimal
+let output_text n froms tos =
+  output_string "\"";
+  let buf = Buffer.create 0 in
+  ignore (input_buffer froms buf ~len:n);
+  Stdio.Out_channel.output_buffer tos buf;
+  output_string "\""
+
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_arguments = function
+    | () when args = 0 -> output_string "# No arguments...\n"
+    | _ when args = 1 -> output_string "# 1 argument follows"
+    | _ -> Printf.printf "# %d arguments follow" args in
+  let herald_member () i f () = Printf.printf "\n# Argument #%d%s:\n" i (if i + 1 = args then " (last)" else ""); f () in
+  herald_arguments, (*bracket args*) herald_member
+
+let start punct i = if i = 0 then output_string (String.make 1 punct)
+let stop punct max i = if i + 1 = max then output_string (String.make 1 punct)
+let bracket punct max g p i f () = start (punct.[0]) i; g p i f; stop (punct.[1]) max i
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let punct = "[]" in
+  let herald_vector () = if members = 0 then output_string_space punct in
+  let herald_member () i f = if (i > 0) then output_string_space ","; f () in
+  herald_vector, bracket punct members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let punct = "{}" in
+  let herald_record () = if members = 0 then output_string_space punct in
+  let herald_member fields i f = if (i > 0) then output_string_space ","; Printf.printf "\"_%d_\": " (fst (Array.get fields i)); f () in
+  herald_record, bracket punct members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0) in
+  let herald_member alts i f () = start '{' 0; Printf.printf "_%d_ : " (fst (Array.get alts i)); f (); stop '}' 1 0 in
+  herald_variant, herald_member
+end
+
+(* IDL binary mode:
+   - Legacy: top-level encoded as one value
+   - Default: top-level are several values
+ *)
+type mode = Unary | Nary
+
+module MakeOutputter(F : Dump) = struct
+
+let decode_primitive_type : int -> typ * outputter =
+  let open F in
+  function
+  | -1 -> Null, output_nil
+  | -2 -> Bool, (fun () -> output_bool (read_bool ()))
+  | -3 -> Nat, (fun () -> output_nat (read_leb128 ()))
+  | -4 -> Int, (fun () -> output_int (read_sleb128 ()))
+  | -5 -> NatN 8, (fun () -> output_byte (read_byte ()))
+  | -6 -> NatN 16, (fun () -> output_2byte (read_2byte ()))
+  | -7 -> NatN 32, (fun () -> output_4byte (read_4byte ()))
+  | -8 -> NatN 64, (fun () -> output_8byte (read_8byte ()))
+  | -9 -> IntN 8, (fun () -> output_int8 (read_int8 ()))
+  | -10 -> IntN 16, (fun () -> output_int16 (read_int16 ()))
+  | -11 -> IntN 32, (fun () -> output_int32 (read_int32 ()))
+  | -12 -> IntN 64, (fun () -> output_int64 (read_int64 ()))
+  | -13 | -14 -> failwith "no floats yet" (* TODO *)
+  | -15 -> Text, (fun () -> let len = read_leb128 () in output_text len stdin stdout)
+  | -16 -> Reserved, ignore
+  | -17 -> Empty, ignore
+  | _ -> failwith "unrecognised primitive type"
+
+
+let read_type lookup : (typ * outputter) Lazy.t =
+  let lprim_or_lookup = function
+    | p when p < -17 -> assert false
+    | p when p < 0 -> lazy (decode_primitive_type p)
+    | i -> lookup i in
+  let prim_or_lookup ty = force (lprim_or_lookup ty) in
+
+  let lfst p = lazy (let lazy (f, _) = p in f) in
+  let lsnd p = lazy (let lazy (_, s) = p in s) in
+
+  let open F in
+  match read_sleb128 () with
+  | p when p < 0 && p > -18 -> from_val (decode_primitive_type p)
+  | -18 ->
+    let reader consumer () =
+      match read_byte () with
+      | 0 -> output_nil ()
+      | 1 -> output_some (force consumer)
+      | _ -> failwith "invalid optional" in
+    let i = read_type_index () in
+    lazy (let p = lprim_or_lookup i in
+          Opt (lfst p), reader (lsnd p))
+  | -19 -> let i = read_type_index () in
+           lazy
+             (let p = lprim_or_lookup i in
+              Vec (lfst p), fun () -> read_star_heralding () output_vector (force (lsnd p)))
+  | -20 -> let assocs = read_t_star read_assoc in
+           lazy (let herald_record, herald_member = output_record (Array.length assocs) in
+                 let members = Array.map (fun (i, tynum) -> i, lfst (lprim_or_lookup tynum)) assocs in
+                 let consumers = Array.mapi (herald_member members) (Array.map (fun (_, tynum) () -> snd (prim_or_lookup tynum) ()) assocs) in
+                 Record members, fun () -> herald_record (); Array.iter (fun f -> f ()) consumers)
+  | -21 -> let assocs = read_t_star read_assoc in
+           lazy (let herald_variant, herald_member = output_variant (Array.length assocs) in
+                 let alts = Array.map (fun (i, tynum) -> i, lfst (lprim_or_lookup tynum)) assocs in
+                 let consumers = Array.map (fun (_, tynum) () -> snd (prim_or_lookup tynum) ()) assocs in
+                 Variant alts, fun () -> herald_variant (); let i = read_leb128 () in herald_member alts i (Array.get consumers i) ())
+  | -22 -> let types1 = read_t_star read_type_index in
+           let types2 = read_t_star read_type_index in
+           let anns = read_t_star read_annotation in
+           lazy (let args = Array.map (fun tynum -> lfst (lprim_or_lookup tynum)) types1 in
+                 let rslts = Array.map (fun tynum -> lfst (lprim_or_lookup tynum)) types2 in
+                 Function (args, rslts, anns), epsilon)
+
+(*
+T(service {<methtype>*}) = sleb128(-23) T*(<methtype>* )
+*)
+  | -23 -> failwith "service types not supported yet"
+
+  | t -> (* future type *)
+    let bytes = read_leb128 () in
+    let buf = Buffer.create 0 in
+    ignore (input_buffer stdin buf ~len:bytes);
+    let ingest () =
+      let bytes = read_leb128 () in
+      let refs = read_leb128 () in
+      let buf = Buffer.create 0 in
+      assert (refs = 0);
+      ignore (input_buffer stdin buf ~len:bytes) in
+    lazy (Future (t, buf), ingest)
+
+
+let read_type_table (t : unit -> (typ * outputter) Lazy.t) : (typ * outputter) Lazy.t array =
+  let rep = read_leb128 () in
+  Array.init rep (fun i -> if !chatty then Printf.printf "read_type_table: %d\n" i; t ())
+
+(* Utilities *)
+
+let chat_string = if !chatty then print_string else ignore
+
+(* Top-level *)
+
+let top_level md : unit =
+  chat_string "\nDESER, to your service!\n";
+  read_magic ();
+  chat_string "\n========================== Type section\n";
+  let tab =
+    let rec tab = lazy (read_type_table (fun () -> read_type lookup))
+    and lookup = fun indx -> (*Printf.printf "{indx: %d}" indx; *)Array.get (force tab) indx in
+    Array.map force (force tab) in
+  chat_string "\n========================== Value section\n";
+  let open F in
+  begin match md with
+  | Nary ->
+    let argtys = read_t_star read_type_index in
+    let herald_arguments, herald_member = output_arguments (Array.length argtys) in
+    herald_arguments ();
+    let typ_ingester = function
+      | prim when prim < 0 -> decode_primitive_type prim
+      | index -> Array.get tab index in
+    let consumers = Array.map (fun tynum -> let (ty, m) = typ_ingester tynum in m) argtys in
+    Array.iteri (fun i f -> herald_member () i f ()) consumers
+  | Unary ->
+    let argty = read_type_index () in
+    if !chatty then Printf.printf "# ARGTY: %d\n" argty;
+    snd (Array.get tab argty) ()
+  end;
+  chat_string "\n-------- DESER DONE\n"
+
+end
+
+(* CLI *)
+
+let name = "deser"
+let banner = "Candid toolkit " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+let mode = ref Nary
+
+let set_mode m () =
+  if !mode <> Nary then begin
+    Printf.eprintf "deser: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+type format = Idl | Prose | Json
+
+let output_format = ref Idl
+
+let set_format f () =
+  if !output_format <> Idl then begin
+    Printf.eprintf "deser: multiple output formats specified"; exit 1
+  end;
+  output_format := f
+
+let argspec = Arg.align
+[
+  "--unary", Arg.Unit (set_mode Unary), " decode legacy (unary) message API";
+  "--prose", Arg.Unit (set_format Prose), " output indented prose";
+  "--json", Arg.Unit (set_format Json), " output JSON values";
+  "--idl", Arg.Unit (set_format Idl), " output IDL values (default)";
+  "--verbose", Arg.Unit (fun () -> chatty := true), " amend commentary";
+  "--version",
+    Arg.Unit (fun () -> Printf.printf "%s\n" banner; exit 0), " show version";
+]
+
+let add_arg source = () (* args := !args @ [source] *)
+
+(* run it *)
+
+let () =
+  Arg.parse argspec add_arg usage;
+  begin match !output_format with
+  | Prose -> let module Prose = MakeOutputter(OutputProse) in Prose.top_level !mode;
+  | Idl -> let module Idl = MakeOutputter(OutputIdl) in Idl.top_level !mode;
+  | Json -> let module Json = MakeOutputter(OutputJson) in Json.top_level !mode;
+  end;
+  match input_byte stdin with
+  | Some _ -> failwith "surplus bytes in input"
+  | None -> ()
+
+
+
+(* TODOs:
+  - use bigint where necessary
+  - floats
+  - service types
+  - escaping in text
+  - heralding/outputting of type table
+ *)
+
+
+
+ + + diff --git a/coverage/exes/didc.ml.html b/coverage/exes/didc.ml.html new file mode 100644 index 00000000000..ed74e2b4440 --- /dev/null +++ b/coverage/exes/didc.ml.html @@ -0,0 +1,288 @@ + + + + + didc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
+
open Idllib
+open Printf
+
+let name = "didc"
+let banner = "Candid compiler " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+
+(* Argument handling *)
+
+type mode = Default | Check | Js | PrettyPrint
+
+let mode = ref Default
+let args = ref []
+let add_arg source = args := !args @ [source]
+
+let set_mode m () =
+  if !mode <> Default then begin
+    eprintf "didc: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+let out_file = ref ""
+
+let argspec =
+[
+  "--js", Arg.Unit (set_mode Js), " output JavaScript binding";
+  "--check", Arg.Unit (set_mode Check), " type-check only";
+  "--pp", Arg.Unit (set_mode PrettyPrint), " Pretty print did file";
+  "-v", Arg.Set Flags.verbose, " verbose output";
+  "-dp", Arg.Set Flags.dump_parse, " dump parse";
+  "-o", Arg.Set_string out_file, "<file>  output file";
+  "--version",
+    Arg.Unit (fun () -> printf "%s\n" banner; exit 0), " show version";
+]
+
+
+(* Main *)
+
+let process_file file : unit =
+  match !mode with
+  | Default ->
+     assert false
+  | Check ->
+     ignore (Diag.run (Pipeline.check_file file))
+  | PrettyPrint ->
+     let (ast, _, _) = Diag.run (Pipeline.check_file file) in
+     printf "%s" (Idllib.Arrange_idl.string_of_prog ast);
+  | Js ->
+     if !out_file = "" then
+         out_file := Filename.remove_extension (Filename.basename file) ^ ".js";
+     let buf = Diag.run Pipeline.(compile_js_file file) in
+     if Buffer.length buf = 0 then begin
+         eprintf "No actor found, cannot generate JS bindings"; exit 1
+     end;
+     let oc = open_out !out_file in
+     Buffer.add_string buf "\n";
+     Buffer.output_buffer oc buf;
+     close_out oc
+
+let print_exn exn =
+  Printf.printf "%!";
+  Printf.eprintf "Internal error, %s\n" (Printexc.to_string exn);
+  Printexc.print_backtrace stderr;
+  Printf.eprintf "%!"
+
+let () =
+  (*
+  Sys.catch_break true; - enable to get stacktrace on interrupt
+  (useful for debugging infinite loops)
+  *)
+  Printexc.record_backtrace true;
+  try
+    Arg.parse argspec add_arg usage;
+    if !mode = Default then mode := Js;
+    match !args with
+    | [file] -> process_file file
+    | _ -> eprintf "didc can only take one .did file\n"; exit 1
+  with exn ->
+    print_exn exn
+
+
+
+ + + diff --git a/coverage/exes/mo_ld.ml.html b/coverage/exes/mo_ld.ml.html new file mode 100644 index 00000000000..68b07167d8c --- /dev/null +++ b/coverage/exes/mo_ld.ml.html @@ -0,0 +1,268 @@ + + + + + mo_ld.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+
+
open Linking
+open Wasm_exts
+open Printf
+
+let name = "mo-ld"
+let version = "0.1"
+let banner = "Motoko " ^ version ^ " linker"
+let usage = "Usage: " ^ name ^ " -b base.wasm -l shared.wasm -o out.wasm"
+
+(* Argument handling *)
+
+let base_file = ref ""
+let lib_file = ref ""
+let lib_name = ref "rts"
+let out_file = ref ""
+
+let print_banner () =
+  printf "%s\n" banner;
+  exit 0
+
+let usage_err s =
+  eprintf "%s: %s\n" name s;
+  eprintf "%s\n" usage;
+  exit 1
+
+let argspec =
+[
+  "-b", Arg.Set_string base_file, "<file> base file (e.g. output of moc --no-link)";
+  "-l", Arg.Set_string lib_file, "<file> library file";
+  "-o", Arg.Set_string out_file, "<file> output file";
+  "-n", Arg.Set_string lib_name, "<name> library name (defaults to \"rts\")";
+  "--version", Arg.Unit print_banner, " show version";
+]
+
+(* IO *)
+
+let load_file f =
+  let ic = open_in_bin f in
+  let n = in_channel_length ic in
+  let s = Bytes.create n in
+  really_input ic s 0 n;
+  close_in ic;
+  Bytes.to_string s
+
+let decode_file f =
+  let wasm = load_file f in
+  CustomModuleDecode.decode "f" wasm
+
+let write_file f s =
+  let oc_ = open_out f in
+  output_string oc_ s;
+  close_out oc_
+
+(* Main *)
+let () =
+  if Array.length Sys.argv = 1 then print_banner ();
+  Arg.parse argspec (fun _ -> usage_err "no arguments expected") usage;
+  if !base_file = "" then usage_err "no base file specified";
+  if !lib_file = "" then usage_err "no library file specified";
+  if !out_file = "" then usage_err "no output file specified";
+
+  Mo_config.Flags.debug_info := true; (* linking mode: preserve debug info *)
+
+  let base = decode_file !base_file in
+  let lib = decode_file !lib_file in
+  let linked =
+    try LinkModule.link base !lib_name lib
+    with LinkModule.LinkError e ->
+      Printf.eprintf "%s\n" e;
+      exit 1
+  in
+  let (_map, wasm) = CustomModuleEncode.encode linked in
+  write_file !out_file wasm
+
+
+
+
+ + + diff --git a/coverage/exes/moc.ml.html b/coverage/exes/moc.ml.html new file mode 100644 index 00000000000..0081d8aa89b --- /dev/null +++ b/coverage/exes/moc.ml.html @@ -0,0 +1,1052 @@ + + + + + moc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+
+
open Wasm_exts
+open Mo_config
+
+open Printf
+
+let name = "moc"
+let banner = "Motoko compiler " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+
+(* Argument handling *)
+
+type mode = Default | Check | StableCompatible | Compile | Run | Interact | PrintDeps | Explain | Viper
+
+let mode = ref Default
+let args = ref []
+let add_arg source = args := !args @ [source]
+
+let set_mode m () =
+  if !mode <> Default && !mode <> m then begin
+    eprintf "moc: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+let out_file = ref ""
+let link = ref true
+let interpret_ir = ref false
+let gen_source_map = ref false
+let explain_code = ref ""
+let stable_types = ref false
+let idl = ref false
+
+let valid_metadata_names =
+    ["candid:args";
+     "candid:service";
+     "motoko:stable-types";
+     "motoko:compiler"]
+
+let argspec = [
+  "-c", Arg.Unit (set_mode Compile), " compile programs to WebAssembly";
+  "-g", Arg.Set Flags.debug_info, " generate source-level debug information";
+  "-r", Arg.Unit (set_mode Run), " interpret programs";
+  "-i", Arg.Unit (set_mode Interact), " run interactive REPL (implies -r)";
+  "--check", Arg.Unit (set_mode Check), " type-check only";
+  "--viper", Arg.Unit (set_mode Viper), " emit viper code";
+  "--stable-compatible",
+    Arg.Tuple [
+      Arg.String (fun fp -> Flags.pre_ref := Some fp);
+      Arg.String (fun fp -> Flags.post_ref := Some fp);
+      Arg.Unit (set_mode StableCompatible);
+      ],
+    "<pre> <post> test upgrade compatibility between stable-type signatures <pre> and <post>";
+  "--idl", Arg.Unit (fun () ->
+    idl := true;
+    set_mode Compile ()), (* similar to --stable-types *)
+      " compile and emit Candid IDL specification to `.did` file";
+  "--print-deps", Arg.Unit (set_mode PrintDeps), " prints the dependencies for a given source file";
+  "--explain", Arg.String (fun c -> explain_code := c; set_mode Explain ()), " provides a detailed explanation of an error message";
+  "-o", Arg.Set_string out_file, "<file>  output file";
+
+  "-v", Arg.Set Flags.verbose, " verbose output";
+  "-p", Arg.Set_int Flags.print_depth, "<n>  set print depth";
+  "--hide-warnings", Arg.Clear Flags.print_warnings, " hide warnings";
+  "-Werror", Arg.Set Flags.warnings_are_errors, " treat warnings as errors";
+  ]
+
+  @ Args.error_args
+
+  @ [
+
+  "--version",
+    Arg.Unit (fun () -> printf "%s\n%!" banner; exit 0), " show version";
+  "--map", Arg.Set gen_source_map, " output source map";
+
+  "-t", Arg.Set Flags.trace, " activate tracing in interpreters"]
+
+  @ Args.package_args
+
+  @ [
+  "--profile", Arg.Set Flags.profile, " activate profiling counters in interpreters ";
+  "--profile-file", Arg.Set_string Flags.profile_file, "<file>  set profiling output file ";
+  "--profile-line-prefix", Arg.Set_string Flags.profile_line_prefix, "<string>  prefix each profile line with the given string ";
+  "--profile-field",
+    Arg.String (fun n -> Flags.(profile_field_names := n :: !profile_field_names)),
+      "<field>  profile file includes the given field from the program result ";
+
+  "--public-metadata",
+    Arg.String (fun n -> Flags.(public_metadata_names := n :: !public_metadata_names)),
+    "<name>  emit icp custom section <name> (" ^
+      String.concat " or " valid_metadata_names ^
+      ") as `public` (default is `private`)";
+
+  "--omit-metadata",
+    Arg.String (fun n -> Flags.(omit_metadata_names := n :: !omit_metadata_names)),
+    "<name>  omit icp custom section <name> (" ^
+      String.concat " or " valid_metadata_names ^
+      ")";
+
+  "-iR", Arg.Set interpret_ir, " interpret the lowered code";
+  "-measure-rts-stack", Arg.Set Flags.measure_rts_stack, " measure the maximum rts stack usage (reported by prim \"rts_max_stack\")";
+  "-no-await", Arg.Clear Flags.await_lowering, " no await-lowering (with -iR)";
+  "-no-async", Arg.Clear Flags.async_lowering, " no async-lowering (with -iR)";
+
+  "-no-link", Arg.Clear link, " do not statically link-in runtime";
+  "-no-timer", Arg.Clear Flags.global_timer, " do not create a global timer expiration endpoint";
+  "-no-system-api",
+    Arg.Unit (fun () -> Flags.(compile_mode := WasmMode)),
+      " do not import any system API";
+  "-wasi-system-api",
+    Arg.Unit (fun () -> Flags.(compile_mode := WASIMode)),
+      " use the WASI system API (wasmtime)";
+  "-ref-system-api",
+  Arg.Unit (fun () -> Flags.(compile_mode := RefMode)),
+      " use the reference implementation of the Internet Computer system API (ic-ref-run)";
+  (* TODO: bring this back (possibly with flipped default)
+           as soon as the multi-value `wasm` library is out.
+  "-multi-value", Arg.Set Flags.multi_value, " use multi-value extension";
+  "-no-multi-value", Arg.Clear Flags.multi_value, " avoid multi-value extension";
+   *)
+
+  "-dp", Arg.Set Flags.dump_parse, " dump parse";
+  "-dt", Arg.Set Flags.dump_tc, " dump type-checked AST";
+  "-dl", Arg.Set Flags.dump_lowering, " dump intermediate representation";
+  "-no-check-ir", Arg.Clear Flags.check_ir, " do not check intermediate code";
+  "--release",
+  Arg.Unit
+    (fun () -> Flags.release_mode := true),
+      " ignore debug expressions in source";
+  "--debug",
+  Arg.Unit
+    (fun () -> Flags.release_mode := false),
+      " respect debug expressions in source (the default)";
+  "--sanity-checks",
+  Arg.Unit
+    (fun () -> Flags.sanity := true),
+  " enable sanity checking in the RTS and generated code";
+
+  "--stable-types",
+  Arg.Unit (fun () ->
+    stable_types := true;
+    set_mode Compile ()), (* similar to --idl *)
+      " compile and emit signature of stable types to `.most` file";
+
+  "--generational-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Generational),
+  " use generational GC";
+
+  "--incremental-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Incremental),
+  " use incremental GC";
+    
+  "--compacting-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.MarkCompact),
+  " use compacting GC";
+
+  "--copying-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Copying),
+  " use copying GC (default)";
+
+  "--force-gc",
+  Arg.Unit (fun () -> Flags.force_gc := true),
+  " disable GC scheduling, always do GC after an update message (for testing)";
+
+  "--max-stable-pages",
+  Arg.Set_int Flags.max_stable_pages,
+  "<n>  set maximum number of pages available for library `ExperimentalStableMemory.mo` (default " ^ (Int.to_string Flags.max_stable_pages_default) ^ ")";
+
+  "--experimental-field-aliasing",
+  Arg.Unit (fun () -> Flags.experimental_field_aliasing := true),
+  " enable experimental support for aliasing of var fields";
+
+  "--rts-stack-pages",
+  Arg.Set_int Flags.rts_stack_pages,
+  "<n>  set maximum number of pages available for runtime system stack (default " ^ (Int.to_string Flags.rts_stack_pages_default) ^ ")";
+
+  "--trap-on-call-error",
+  Arg.Unit (fun () -> Flags.trap_on_call_error := true),
+  " Trap, don't throw an `Error`, when an IC call fails due to destination queue full or freezing threshold is crossed. Emulates behaviour of moc versions < 0.8.0."
+  ]
+
+  @ Args.inclusion_args
+
+
+
+let set_out_file files ext =
+  if !out_file = "" then begin
+    match files with
+    | [n] -> out_file := Filename.remove_extension (Filename.basename n) ^ ext
+    | ns -> eprintf "moc: no output file specified"; exit 1
+  end
+
+(* Main *)
+
+let exit_on_none = function
+  | None -> exit 1
+  | Some x -> x
+
+let process_files files : unit =
+  match !mode with
+  | Default ->
+    assert false
+  | Run ->
+    if !interpret_ir
+    then exit_on_none (Pipeline.interpret_ir_files files)
+    else exit_on_none (Pipeline.run_files files)
+  | Interact ->
+    printf "%s\n%!" banner;
+    exit_on_none (Pipeline.run_files_and_stdin files)
+  | Check ->
+    Diag.run (Pipeline.check_files files)
+  | Viper ->
+    let (s, _) = Diag.run (Pipeline.viper_files files) in
+    printf "%s" s
+  | StableCompatible ->
+    begin
+      match (!Flags.pre_ref, !Flags.post_ref) with
+      | Some pre, Some post ->
+        Diag.run (Pipeline.stable_compatible pre post); (* exit 1 on error *)
+        exit 0;
+      | _ -> assert false
+    end
+  | Compile ->
+    set_out_file files ".wasm";
+    let source_map_file = !out_file ^ ".map" in
+    let (idl_prog, module_) = Diag.run Pipeline.(compile_files !Flags.compile_mode !link files) in
+    let module_ = CustomModule.{ module_ with
+      source_mapping_url =
+        if !gen_source_map
+        then Some (Filename.basename source_map_file)
+        else None
+    } in
+
+    let oc = open_out !out_file in
+    let (source_map, wasm) = CustomModuleEncode.encode module_ in
+    output_string oc wasm; close_out oc;
+
+    if !gen_source_map then begin
+      let oc_ = open_out source_map_file in
+      output_string oc_ source_map; close_out oc_
+      end;
+
+    if !idl then begin
+      let did_file = Filename.remove_extension !out_file ^ ".did" in
+      let oc = open_out did_file in
+      let idl_code = Idllib.Arrange_idl.string_of_prog idl_prog in
+      output_string oc idl_code; close_out oc
+    end;
+
+    if !stable_types then begin
+      let sig_file = Filename.remove_extension !out_file ^ ".most"
+      in
+      CustomModule.(
+        match module_.motoko.stable_types with
+        | Some (_, txt) ->
+          let oc_ = open_out sig_file in
+          output_string oc_ txt; close_out oc_
+        | _ -> ())
+    end
+
+  | PrintDeps -> begin
+     match files with
+     | [file] -> Pipeline.print_deps file
+     | _ ->
+        (eprintf "--print-deps expects exactly one source file as an argument";
+         exit 1)
+    end
+  | Explain ->
+     match List.find_opt (fun (c, _) -> String.equal c !explain_code) Error_codes.error_codes with
+     | Some (_, Some(explanation)) ->
+        printf "%s" explanation
+     | Some (_, None) ->
+        printf "Unfortunately there is no detailed explanation for this error yet"
+     | None ->
+        printf "%s is not a known error code. Make sure you pass a code format like this: '--explain M0123'" !explain_code
+
+(* Copy relevant flags into the profiler library's (global) settings.
+   This indirection affords the profiler library an independence from the (hacky) Flags library.
+   See also, this discussion:
+   https://github.com/dfinity/motoko/pull/405#issuecomment-503326551
+*)
+let process_profiler_flags () =
+  ProfilerFlags.profile             := !Flags.profile;
+  ProfilerFlags.profile_verbose     := !Flags.profile_verbose;
+  ProfilerFlags.profile_file        := !Flags.profile_file;
+  ProfilerFlags.profile_line_prefix := !Flags.profile_line_prefix;
+  ProfilerFlags.profile_field_names := !Flags.profile_field_names;
+  ()
+
+let process_metadata_names kind =
+  List.iter
+    (fun s ->
+      if not (List.mem s valid_metadata_names) then
+        begin
+          eprintf "moc: --%s-metadata argument %s must be one of %s"
+            kind
+            s
+            (String.concat ", " valid_metadata_names);
+          exit 1
+        end)
+
+let () =
+  (*
+  Sys.catch_break true; - enable to get stacktrace on interrupt
+  (useful for debugging infinite loops)
+  *)
+  Internal_error.setup_handler ();
+  Arg.parse_expand argspec add_arg usage;
+  if !mode = Default then mode := (if !args = [] then Interact else Compile);
+  Flags.compiled := !mode = Compile;
+
+  if !Flags.warnings_are_errors && (not !Flags.print_warnings)
+  then begin
+    eprintf "moc: --hide-warnings and -Werror together do not make sense"; exit 1
+  end;
+
+  process_profiler_flags ();
+  process_metadata_names "public" !Flags.public_metadata_names;
+  process_metadata_names "omit" !Flags.omit_metadata_names;
+  try
+    process_files !args
+  with
+  | Sys_error msg ->
+    (* IO error *)
+    eprintf "%s\n" msg;
+    exit 1
+
+
+
+ + + diff --git a/coverage/highlight.pack.js b/coverage/highlight.pack.js new file mode 100644 index 00000000000..2e55d491547 --- /dev/null +++ b/coverage/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.15.8 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("reasonml",function(r){var e="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",c="("+["||","&&","++","**","+.","*","/","*.","/.","...","|>"].map(function(r){return r.split("").map(function(r){return"\\"+r}).join("")}).join("|")+"|==|===)",n="\\s+"+c+"\\s+",t={keyword:"and as asr assert begin class constraint do done downto else end exception externalfor fun function functor if in include inherit initializerland lazy let lor lsl lsr lxor match method mod module mutable new nonrecobject of open or private rec sig struct then to try type val virtual when while with",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",literal:"true false"},i="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",s={cN:"number",r:0,v:[{b:i},{b:"\\(\\-"+i+"\\)"}]},b={cN:"operator",r:0,b:c},o=[{cN:"identifier",r:0,b:e},b,s],l=[r.QSM,b,{cN:"module",b:"\\b"+a,rB:!0,e:".",c:[{cN:"identifier",b:a,r:0}]}],u=[{cN:"module",b:"\\b"+a,rB:!0,e:".",r:0,c:[{cN:"identifier",b:a,r:0}]}],_={cN:"function",r:0,k:t,v:[{b:"\\s(\\(\\.?.*?\\)|"+e+")\\s*=>",e:"\\s*=>",rB:!0,r:0,c:[{cN:"params",v:[{b:e},{b:"~?[a-z$_][0-9a-zA-Z$_]*(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?"},{b:/\(\s*\)/}]}]},{b:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",e:"\\s=>",rB:!0,r:0,c:[{cN:"params",r:0,v:[{b:e,e:"(,|\\n|\\))",r:0,c:[b,{cN:"typing",b:":",e:"(,|\\n)",rB:!0,r:0,c:u}]}]}]},{b:"\\(\\.\\s"+e+"\\)\\s*=>"}]};l.push(_);var N={cN:"constructor",b:a+"\\(",e:"\\)",i:"\\n",k:t,c:[r.QSM,b,{cN:"params",b:"\\b"+e}]},d={cN:"pattern-match",b:"\\|",rB:!0,k:t,e:"=>",r:0,c:[N,b,{r:0,cN:"constructor",b:a}]},z={cN:"module-access",k:t,rB:!0,v:[{b:"\\b("+a+"\\.)+"+e},{b:"\\b("+a+"\\.)+\\(",e:"\\)",rB:!0,c:[_,{b:"\\(",e:"\\)",skip:!0}].concat(l)},{b:"\\b("+a+"\\.)+{",e:"}"}],c:l};return u.push(z),{aliases:["re"],k:t,i:"(:\\-|:=|\\${|\\+=)",c:[r.C("/\\*","\\*/",{i:"^(\\#,\\/\\/)"}),{cN:"character",b:"'(\\\\[^']+|[^'])'",i:"\\n",r:0},r.QSM,{cN:"literal",b:"\\(\\)",r:0},{cN:"literal",b:"\\[\\|",e:"\\|\\]",r:0,c:o},{cN:"literal",b:"\\[",e:"\\]",r:0,c:o},N,{cN:"operator",b:n,i:"\\-\\->",r:0},s,r.CLCM,d,_,{cN:"module-def",b:"\\bmodule\\s+"+e+"\\s+"+a+"\\s+=\\s+{",e:"}",rB:!0,k:t,r:0,c:[{cN:"module",r:0,b:a},{b:"{",e:"}",skip:!0}].concat(l)},z]}}); \ No newline at end of file diff --git a/coverage/ic/url.ml.html b/coverage/ic/url.ml.html new file mode 100644 index 00000000000..5bb4394e96e --- /dev/null +++ b/coverage/ic/url.ml.html @@ -0,0 +1,317 @@ + + + + + url.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+
+
(* Parsing known URLs from mo: and ic: URLs *)
+
+(*
+   For usage examples take a look at url_test.ml
+*)
+
+let checkbytes s : string =
+  let buf = Buffer.create 4 in
+  Buffer.add_int32_be buf (Lib.CRC.crc32 s); (* NB: big endian *)
+  Buffer.contents buf
+
+let rec group s =
+  let open String in
+  if length s <= 5 then s else
+  sub s 0 5 ^ "-" ^ group (sub s 5 (length s - 5))
+
+let encode_principal bytes : string =
+  group (String.map Char.lowercase_ascii (Lib.Base32.encode (checkbytes bytes ^ bytes)))
+
+(* Decode a principal according to https://sdk.dfinity.org/docs/interface-spec/index.html#textual-ids *)
+let decode_principal principal : (string, string) result =
+  let open Stdlib.String in
+
+  if principal = "" then Error "principal cannot be empty" else
+  let filtered =
+    to_seq principal |>
+      Seq.map Char.uppercase_ascii |>
+      Seq.filter (fun c -> c >= '0' && c <= '9' || c >= 'A' && c <= 'Z') |>
+      of_seq in
+  match Lib.Base32.decode filtered with
+  | Error e -> Error e
+  | Ok bytes ->
+    if length bytes < 4 then Error "principal too short" else
+    let payload = sub bytes 4 (length bytes - 4) in
+    let expected = encode_principal payload in
+    if principal <> expected
+    then Error (Printf.sprintf "invalid principal. Did you mean %S?" expected)
+    else Ok payload
+
+type parsed =
+  | Package of (string * string)
+  | Relative of string
+  | Ic of string
+  | IcAlias of string
+  | Prim
+
+let string_of_parsed = function
+  | Package (x, y) -> Printf.sprintf "Package (%s, %s)" x y
+  | Relative x -> Printf.sprintf "Relative %s" x
+  | Ic x -> Printf.sprintf "Ic %s" x
+  | IcAlias x -> Printf.sprintf "IcAlias %s" x
+  | Prim -> "Prim"
+
+let parse (f: string) : (parsed, string) result =
+  match Lib.String.chop_prefix "mo:" f with
+  | Some suffix ->
+    begin match Stdlib.String.index_opt suffix '/' with
+    | None ->
+      if suffix = "prim" || suffix = "⛔"
+      then Ok Prim
+      else Ok (Package (suffix, ""))
+    | Some i ->
+      if suffix = "prim" || suffix = "⛔"
+      then Error "The prim package has no modules"
+      else
+        let pkg = Stdlib.String.sub suffix 0 i in
+        let path = Stdlib.String.sub suffix (i+1) (Stdlib.String.length suffix - (i+1)) in
+        if Option.is_some (Lib.String.chop_prefix ".." (Lib.FilePath.normalise path))
+        then Error (Printf.sprintf "Package imports musn't access parent directories: %s is invalid." path)
+        else Ok (Package (pkg, path))
+    end
+  | None ->
+    match Lib.String.chop_prefix "ic:" f with
+    | Some principal -> begin match decode_principal principal with
+      | Ok bytes -> Ok (Ic bytes)
+      | Error err -> Error err
+      end
+    | None ->
+      match Lib.String.chop_prefix "canister:" f with
+      | Some suffix -> Ok (IcAlias suffix)
+      | None ->
+        begin match Stdlib.String.index_opt f ':' with
+        | Some _ -> Error "Unrecognized URL"
+        | None -> Ok (Relative (Lib.FilePath.normalise f))
+        end
+
+
+(* Basename of the IDL file searched (see DFX-Interface.md) *)
+let idl_basename_of_blob bytes =
+  encode_principal bytes ^ ".did"
+
+
+
+ + + diff --git a/coverage/idllib/arrange_idl.ml.html b/coverage/idllib/arrange_idl.ml.html new file mode 100644 index 00000000000..602df9e3ac8 --- /dev/null +++ b/coverage/idllib/arrange_idl.ml.html @@ -0,0 +1,818 @@ + + + + + arrange_idl.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+
+
open Source
+open Syntax
+open Wasm.Sexpr
+
+let string_of_prim p =
+  match p with
+  | Nat -> "nat"
+  | Nat8 -> "nat8"
+  | Nat16 -> "nat16"
+  | Nat32 -> "nat32"
+  | Nat64 -> "nat64"
+  | Int -> "int"
+  | Int8 -> "int8"
+  | Int16 -> "int16"
+  | Int32 -> "int32"
+  | Int64 -> "int64"
+  | Float32 -> "float32"
+  | Float64 -> "float64"
+  | Bool -> "bool"
+  | Text -> "text"
+  | Null -> "null"
+  | Reserved -> "reserved"
+  | Empty -> "empty"
+
+let string_of_mode m =
+  match m.it with
+  | Oneway -> " oneway"
+  | Query -> " query"
+  | Composite -> " composite_query"
+
+
+let ($$) head inner = Node (head, inner)
+
+and id i = Atom i.it
+and tag i = Atom ("#" ^ i.it)
+
+let field_tag (tf : field_label)
+  = match tf.it with
+  | Id n -> Lib.Uint32.to_string n
+  | Named name -> name
+  | Unnamed n -> Lib.Uint32.to_string n
+
+let rec typ_field (tf : typ_field)
+  = field_tag (tf.it.label) $$ [typ tf.it.typ]
+
+and typ_meth (tb : typ_meth)
+  = tb.it.var.it $$ [typ tb.it.meth]
+
+and mode m = Atom (string_of_mode m)
+
+and typ t = match t.it with
+  | VarT s        -> "VarT" $$ [id s]
+  | PrimT p             -> "PrimT" $$ [Atom (string_of_prim p)]
+  | RecordT ts        -> "RecordT" $$ List.map typ_field ts
+  | VecT t       -> "VecT" $$ [typ t]
+  | BlobT -> Atom "BlobT"
+  | OptT t              -> "OptT" $$ [typ t]
+  | VariantT cts        -> "VariantT" $$ List.map typ_field cts
+  | FuncT (ms, s, t) -> "FuncT" $$ List.map typ s @ List.map typ t @ List.map mode ms
+  | ServT ts -> "ServT" $$ List.map typ_meth ts
+  | ClassT (ts, t) -> "ClassT" $$ List.map typ ts @ [typ t]
+  | PrincipalT -> Atom "PrincipalT"
+  | PreT -> Atom "PreT"
+
+and dec d = match d.it with
+  | TypD (x, t) ->
+     "TypD" $$ [id x] @ [typ t]
+  | ImportD (f, fp) ->
+     "ImportD" $$ [Atom (if !fp = "" then f else !fp)]
+
+and actor = function
+  | None -> Atom "NoActor"
+  | Some t ->
+     "Actor" $$ [typ t]
+
+and prog prog = "Decs" $$ List.map dec prog.it.decs @ [actor prog.it.actor]
+
+
+(* Pretty printing  *)
+open Format
+let str ppf s = pp_print_string ppf s
+let space = pp_print_space
+let kwd ppf s = str ppf s; space ppf ()
+let quote ppf s =
+  pp_open_hbox ppf ();
+  str ppf "\""; str ppf (Lib.String.lightweight_escaped s); str ppf "\"";
+  pp_close_box ppf ()
+let text ppf s =
+  if Escape.needs_candid_quote s then quote ppf s else str ppf s
+
+let rec pp_typ ppf t =
+  pp_open_hovbox ppf 1;
+  (match t.it with
+  | VarT id -> str ppf id.it
+  | PrimT p -> str ppf (string_of_prim p)
+  | OptT t -> kwd ppf "opt"; pp_typ ppf t
+  | VecT t -> kwd ppf "vec"; pp_typ ppf t
+  | BlobT -> str ppf "blob"
+  | RecordT fs -> pp_fields ppf "record" fs
+  | VariantT fs -> pp_fields ppf "variant" fs
+  | FuncT (ms,s,t) ->
+     kwd ppf "func";
+     pp_func ppf (ms,s,t)
+  | ServT ms ->
+     pp_open_vbox ppf 2;
+     str ppf "service {";
+     List.iter (fun m -> pp_print_cut ppf (); pp_meth ppf m; str ppf ";") ms;
+     pp_print_break ppf 0 (-2);
+     str ppf "}";
+     pp_close_box ppf ()
+  | PrincipalT -> str ppf "principal"
+  | ClassT _ -> assert false
+  | PreT -> assert false);
+  pp_close_box ppf ()
+and pp_fields ppf name fs =
+  let is_variant = name = "variant" in
+  if List.length fs > 1 then
+    pp_open_vbox ppf 2
+  else
+    pp_open_hovbox ppf 2;
+  str ppf (name ^ " {");
+  List.iter (fun f -> pp_print_cut ppf (); pp_field ppf is_variant f; str ppf ";") fs;
+  pp_print_break ppf 0 (-2);
+  str ppf "}";
+  pp_close_box ppf ()
+and pp_field ppf is_variant f =
+  let hide_type = is_variant && f.it.typ.it = PrimT Null in
+  pp_open_hovbox ppf 1;
+  (match f.it.label.it with
+  | Named name ->
+     text ppf name;
+     if not hide_type then
+       (kwd ppf ":"; pp_typ ppf f.it.typ)
+  | Id n ->
+     str ppf (Lib.Uint32.to_string n);
+     if not hide_type then
+       (kwd ppf ":"; pp_typ ppf f.it.typ)
+  | Unnamed _ -> pp_typ ppf f.it.typ);
+  pp_close_box ppf ()
+
+and pp_func ppf (ms,s,t) =
+  pp_args ppf s;
+  kwd ppf " ->";
+  pp_args ppf t;
+  List.iter (fun m -> str ppf (string_of_mode m)) ms
+
+and pp_args ppf fs =
+  let n = List.length fs in
+  str ppf "(";
+  List.iteri (fun i f ->
+      pp_typ ppf f;
+      if i < n-1 then
+        kwd ppf ",";
+    ) fs;
+  str ppf ")"
+
+and pp_meth ppf m =
+  pp_open_hovbox ppf 1;
+  text ppf m.it.var.it;
+  kwd ppf ":";
+  (match m.it.meth.it with
+   | FuncT (ms,s,t) -> pp_func ppf (ms,s,t)
+   | _ -> pp_typ ppf m.it.meth);
+  pp_close_box ppf ()
+
+let rec is_linebreak_type t =
+  match t.it with
+  | ServT _ -> true
+  | RecordT fs | VariantT fs -> List.length fs > 1
+  | VecT t | OptT t -> is_linebreak_type t
+  | _ -> false
+
+let pp_dec ppf d =
+  pp_open_vbox ppf 1;
+  (match d.it with
+   | TypD (id, typ) ->
+      pp_open_hbox ppf ();
+      kwd ppf "type";
+      kwd ppf id.it;
+      kwd ppf "=";
+      pp_close_box ppf ();
+      if is_linebreak_type typ then
+        pp_print_cut ppf ();
+      pp_typ ppf typ
+   | ImportD (f, fp) ->
+      str ppf "import \"";
+      str ppf f;
+      str ppf "\""
+  );
+  pp_close_box ppf ()
+
+let pp_actor ppf actor =
+  (match actor with
+  | None -> ()
+  | Some {it=ServT ms; _} ->
+     pp_open_vbox ppf 2;
+     pp_open_hbox ppf ();
+     str ppf "service : {";
+     pp_close_box ppf ();
+     List.iter (fun m -> pp_print_cut ppf (); pp_meth ppf m; str ppf ";") ms;
+     pp_print_break ppf 0 (-2);
+     str ppf "}";
+     pp_close_box ppf ()
+  | Some {it=VarT x; _} ->
+     pp_open_hbox ppf ();
+     kwd ppf "service";
+     kwd ppf ":";
+     str ppf x.it;
+     pp_close_box ppf ()
+  | Some {it=ClassT(args, t); _} ->
+     pp_open_hbox ppf ();
+     kwd ppf "service";
+     kwd ppf ":";
+     pp_args ppf args;
+     str ppf " -> ";
+     pp_typ ppf t;
+     pp_close_box ppf ()
+  | _ -> assert false);
+  pp_print_cut ppf ()
+
+let pp_prog ppf prog =
+  pp_open_vbox ppf 0;
+  List.iter (fun d ->
+      pp_dec ppf d;
+      str ppf ";";
+      pp_print_cut ppf ()
+    ) prog.it.decs;
+  pp_actor ppf prog.it.actor;
+  pp_close_box ppf ()
+
+let string_of_typ t =
+  let buf = Buffer.create 100 in
+  let ppf = formatter_of_buffer buf in
+  pp_typ ppf t;
+  pp_print_flush ppf ();
+  Buffer.contents buf
+
+let string_of_prog prog =
+  let buf = Buffer.create 100 in
+  let ppf = formatter_of_buffer buf in
+  pp_prog ppf prog;
+  pp_print_flush ppf ();
+  Buffer.contents buf
+
+let string_of_args ts =
+  let buf = Buffer.create 100 in
+  let ppf = formatter_of_buffer buf in
+  pp_args ppf ts;
+  pp_print_flush ppf ();
+  Buffer.contents buf
+
+
+
+ + + diff --git a/coverage/idllib/compile_js.ml.html b/coverage/idllib/compile_js.ml.html new file mode 100644 index 00000000000..a0805333292 --- /dev/null +++ b/coverage/idllib/compile_js.ml.html @@ -0,0 +1,851 @@ + + + + + compile_js.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+
+

+open Format
+open Syntax
+open Source
+
+module Env = Typing.Env
+module TS = Set.Make(String)
+
+type typ_info = {
+    var : string;
+    typ : typ;
+    is_rec : bool;
+  }
+
+let as_tuple fs =
+  let open List in
+  let fs2 = mapi (fun i f -> (i, f)) fs in
+  let is_tuple = length fs > 0 && for_all (fun (i, f) ->
+      match f.it.label.it with
+      | Unnamed id -> Lib.Uint32.to_int id = i
+      | _ -> false) fs2 in
+  if is_tuple then
+    Some (map (fun (f : typ_field) -> f.it.typ) fs)
+  else
+    None
+
+(* Gather type definitions from actor and sort the definitions in topological order *)
+let chase_env env actor =
+  let new_env = ref [] in
+  let seen = ref TS.empty in
+  let rec chase t =
+    match t.it with
+    | PrimT _ -> ()
+    | PrincipalT -> ()
+    | BlobT -> ()
+    | VarT id ->
+       if not (TS.mem id.it !seen) then begin
+         seen := TS.add id.it !seen;
+         let t = Env.find id.it env in
+         chase t;
+         new_env := {var = id.it; typ = t; is_rec = false} :: !new_env;
+         end
+    | ServT ms -> List.iter (fun m -> chase m.it.meth) ms
+    | OptT t -> chase t
+    | VecT t -> chase t
+    | RecordT fs -> chase_fields fs
+    | VariantT fs -> chase_fields fs
+    | FuncT (ms, fs1, fs2) -> List.iter chase fs1; List.iter chase fs2
+    | ClassT _ -> assert false
+    | PreT -> assert false
+  and chase_fields fs =
+    List.iter (fun (f : typ_field) -> chase f.it.typ) fs
+  in
+  chase actor;
+  List.rev (!new_env)
+
+(* Given a topologically sorted type definition list, infer which types are recursive *)
+let infer_rec env_list =
+  let seen = ref TS.empty in
+  let recs = ref TS.empty in
+  let rec go t =
+    match t.it with
+    | PrimT _ -> ()
+    | PrincipalT -> ()
+    | BlobT -> ()
+    | VarT id ->
+       if not (TS.mem id.it !seen) then begin
+         seen := TS.add id.it !seen;
+         recs := TS.add id.it !recs
+         end
+    | ServT ms -> List.iter (fun m -> go m.it.meth) ms
+    | OptT t -> go t
+    | VecT t -> go t
+    | RecordT fs -> go_fields fs
+    | VariantT fs -> go_fields fs
+    | FuncT (_, fs1, fs2) -> List.iter go fs1; List.iter go fs2
+    | ClassT _ -> assert false
+    | PreT -> assert false
+  and go_fields fs =
+    List.iter (fun (f:typ_field) -> go f.it.typ) fs
+  in
+  List.iter (fun {var;typ;_} -> go typ; seen := TS.add var !seen) env_list;
+  !recs
+
+let str ppf s = pp_print_string ppf s; pp_print_cut ppf ()
+let id ppf s = str ppf s.it; pp_print_cut ppf ()
+let space = pp_print_space
+let kwd ppf s = str ppf s; space ppf ()
+let quote_name ppf s = pp_open_hbox ppf (); str ppf "'"; str ppf (Lib.String.lightweight_escaped s); str ppf "'"; pp_close_box ppf (); pp_print_cut ppf ()
+
+let pp_prim p =
+  match p with
+  | Nat -> "Nat"
+  | Nat8 -> "Nat8"
+  | Nat16 -> "Nat16"
+  | Nat32 -> "Nat32"
+  | Nat64 -> "Nat64"
+  | Int -> "Int"
+  | Int8 -> "Int8"
+  | Int16 -> "Int16"
+  | Int32 -> "Int32"
+  | Int64 -> "Int64"
+  | Float32 -> "Float32"
+  | Float64 -> "Float64"
+  | Bool -> "Bool"
+  | Text -> "Text"
+  | Null -> "Null"
+  | Reserved -> "None"
+  | Empty -> "None"
+
+let pp_mode ppf m =
+  match m.it with
+  | Oneway -> str ppf "'oneway'"
+  | Query -> str ppf "'query'"
+  | Composite -> str ppf "'composite_query'"
+
+let rec concat ppf f sep list =
+  match list with
+  | [] -> ()
+  | e::[] -> f ppf e; pp_print_cut ppf ()
+  | e::tail -> f ppf e; str ppf sep; space ppf (); concat ppf f sep tail
+
+let rec pp_typ ppf t =
+  pp_open_box ppf 1;
+  (match t.it with
+  | VarT s -> id ppf s
+  | PrimT p -> str ppf ("IDL."^(pp_prim p))
+  | PrincipalT -> str ppf "IDL.Principal"
+  | RecordT ts -> pp_fields ppf ts
+  | VecT t -> str ppf "IDL.Vec("; pp_typ ppf t; str ppf ")";
+  | BlobT -> str ppf "IDL.Vec(IDL.Nat8)";
+  | OptT t -> str ppf "IDL.Opt("; pp_typ ppf t; str ppf ")";
+  | VariantT ts -> str ppf "IDL.Variant({"; concat ppf pp_field "," ts; str ppf "})";
+  | FuncT (ms, t1, t2) ->
+     str ppf "IDL.Func(";
+     pp_args ppf t1;
+     kwd ppf ",";
+     pp_args ppf t2;
+     kwd ppf ",";
+     pp_modes ppf ms;
+     str ppf ")";
+  | ServT ts ->
+     pp_open_hovbox ppf 1;
+     str ppf "IDL.Service({";
+     concat ppf pp_meth "," ts;
+     str ppf "})";
+     pp_close_box ppf ();
+  | ClassT _ -> assert false
+  | PreT -> assert false
+  );
+  pp_close_box ppf ()
+
+and pp_args ppf args =
+  pp_open_box ppf 1;
+  str ppf "[";
+  concat ppf pp_typ "," args;
+  str ppf "]";
+  pp_close_box ppf ()
+
+and pp_modes ppf modes =
+  pp_open_box ppf 1;
+  str ppf "[";
+  concat ppf pp_mode "," modes;
+  str ppf "]";
+  pp_close_box ppf ()
+
+and pp_fields ppf fs =
+  pp_open_box ppf 1;
+  (match as_tuple fs with
+  | None ->
+     str ppf "IDL.Record({";
+     concat ppf pp_field "," fs;
+     str ppf "})";
+  | Some typs ->
+     str ppf "IDL.Tuple(";
+     concat ppf pp_typ "," typs;
+     str ppf ")");
+  pp_close_box ppf ()
+
+and pp_field ppf tf =
+  pp_open_box ppf 1;
+  let f_name =
+    match tf.it.label.it with
+    | Named name -> name
+    | Id n | Unnamed n -> "_" ^ (Lib.Uint32.to_string n) ^ "_"
+  in quote_name ppf f_name; kwd ppf ":"; pp_typ ppf tf.it.typ;
+  pp_close_box ppf ()
+
+and pp_meth ppf meth =
+  pp_open_box ppf 1;
+  quote_name ppf meth.it.var.it;
+  kwd ppf ":";
+  pp_typ ppf meth.it.meth;
+  pp_close_box ppf ()
+
+let pp_dec ppf {var;typ;is_rec} =
+  pp_open_hovbox ppf 1;
+  if is_rec then begin
+      str ppf var;
+      str ppf ".fill(";
+      pp_typ ppf typ;
+      str ppf ")";
+    end
+  else begin
+      kwd ppf "const";
+      kwd ppf var;
+      kwd ppf "=";
+      pp_typ ppf typ;
+    end;
+  pp_close_box ppf ();
+  pp_print_cut ppf ()
+
+let pp_rec ppf x =
+  pp_open_hovbox ppf 1;
+  kwd ppf "const";
+  kwd ppf x;
+  kwd ppf "=";
+  str ppf "IDL.Rec()";
+  pp_close_box ppf ();
+  pp_print_cut ppf ()
+
+let pp_actor ppf t recs =
+  pp_open_hovbox ppf 1;
+  kwd ppf "return";
+  (match t.it with
+   | ServT tp ->
+      str ppf "IDL.Service({";
+      concat ppf pp_meth "," tp;
+      str ppf "});"
+   | VarT var ->
+      if TS.mem var.it recs then
+        str ppf (var.it ^ ".getType();")
+      else
+        str ppf var.it;
+   | _ -> assert false
+  );
+  pp_close_box ppf ()
+
+let pp_header ppf () =
+  pp_open_vbox ppf 1;
+  str ppf "export default ({ IDL }) => {"
+
+let pp_footer ppf () =
+  pp_close_box ppf ();
+  pp_force_newline ppf ();
+  pp_print_string ppf "};"
+
+let pp_prog ppf env prog =
+  match prog.it.actor with
+  | None -> ()
+  | Some actor ->
+     let env_list = chase_env env actor in
+     let recs = infer_rec env_list in
+     let env_list =
+       List.map (fun (e:typ_info) ->
+           if TS.mem e.var recs then {e with is_rec = true} else e)
+         env_list in
+     pp_header ppf ();
+     TS.iter (pp_rec ppf) recs;
+     List.iter (pp_dec ppf) env_list;
+     pp_actor ppf actor recs;
+     pp_footer ppf ()
+
+let compile (scope : Typing.scope) (prog : Syntax.prog) =
+  let buf = Buffer.create 100 in
+  let ppf = formatter_of_buffer buf in
+  pp_prog ppf scope prog;
+  pp_print_flush ppf ();
+  buf
+
+
+
+ + + diff --git a/coverage/idllib/escape.ml.html b/coverage/idllib/escape.ml.html new file mode 100644 index 00000000000..38f9b63dce0 --- /dev/null +++ b/coverage/idllib/escape.ml.html @@ -0,0 +1,601 @@ + + + + + escape.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+
+
(*
+This module implements the field name mapping from Motoko to IDL
+and back.
+
+(It could live in mo_idl/, but mo_idl depends on mo_def/, codegen/ needs this
+encoding, but codegen/ should not depend on mo_def/.)
+*)
+
+(* Utilities (cf. lexer.mll) *)
+
+let is_underscore c = c = '_'
+let is_letter c = ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
+let is_digit c = '0' <= c && c <= '9'
+
+let is_valid_as_id str = match Lib.String.explode str with
+  | c::cs ->
+    (is_underscore c || is_letter c) &&
+    List.for_all (fun c -> is_underscore c || is_letter c || is_digit c) cs
+  | _ -> false
+
+let ends_with_underscore str = Lib.String.chop_suffix "_" str <> None
+
+let is_candid_keyword = function
+  | "import"
+  | "service"
+  | "func"
+  | "type"
+  | "opt"
+  | "vec"
+  | "record"
+  | "variant"
+  | "blob"
+  | "principal"
+  | "nat"
+  | "nat8"
+  | "nat16"
+  | "nat32"
+  | "nat64"
+  | "int"
+  | "int8"
+  | "int16"
+  | "int32"
+  | "int64"
+  | "float32"
+  | "float64"
+  | "bool"
+  | "text"
+  | "null"
+  | "reserved"
+  | "empty"
+  | "oneway"
+  | "query"
+  -> true
+  | _
+  -> false
+
+let is_motoko_keyword = function
+  | "actor"
+  | "and"
+  | "async"
+  | "async*"
+  | "assert"
+  | "await"
+  | "await*"
+  | "break"
+  | "case"
+  | "catch"
+  | "class"
+  | "continue"
+  | "composite"
+  | "debug"
+  | "debug_show"
+  | "do"
+  | "else"
+  | "false"
+  | "flexible"
+  | "for"
+  | "from_candid"
+  | "func"
+  | "if"
+  | "ignore"
+  | "in"
+  | "import"
+  | "module"
+  | "not"
+  | "null"
+  | "object"
+  | "or"
+  | "label"
+  | "let"
+  | "loop"
+  | "private"
+  | "public"
+  | "query"
+  | "return"
+  | "shared"
+  | "stable"
+  | "switch"
+  | "system"
+  | "try"
+  | "throw"
+  | "to_candid"
+  | "true"
+  | "type"
+  | "var"
+  | "while"
+  | "with"
+  -> true
+  | _
+  -> false
+
+(* Escaping (used for Candid → Motoko) *)
+
+let escape_num h = Printf.sprintf "_%s_" (Lib.Uint32.to_string h)
+
+let escape str =
+  if is_motoko_keyword str then str ^ "_" else
+  if is_valid_as_id str
+  then if ends_with_underscore str then str ^ "_" else str
+  else escape_num (IdlHash.idl_hash str)
+
+let escape_method at str =
+  if is_motoko_keyword str then str ^ "_" else
+  if is_valid_as_id str
+  then if ends_with_underscore str then str ^ "_" else str
+  else raise (Exception.UnsupportedCandidFeature
+    (Diag.error_message at "M0160" "import"
+      (Printf.sprintf "Candid method name '%s' is not a valid Motoko identifier" str)))
+
+(* Unescaping (used for Motoko → Candid) *)
+
+let is_escaped_num str =
+  match Lib.String.chop_prefix "_" str with
+  | Some str ->
+    begin match Lib.String.chop_suffix "_" str with
+    | Some str
+      when String.length str > 0 &&
+           List.for_all is_digit (Lib.String.explode str)
+      -> Lib.Uint32.of_string_opt str
+    | _ -> None
+    end
+  | _ -> None
+
+(* This (or a type like this) could move into the IDL AST *)
+type label = Nat of Lib.Uint32.t | Id of string
+
+let unescape str =
+  match is_escaped_num str with
+  | Some h -> Nat h
+  | _ -> match Lib.String.chop_suffix "_" str with
+    | Some str' -> Id str'
+    | _ -> Id str
+
+let unescape_hash str = match unescape str with
+  | Nat h -> h
+  | Id s -> IdlHash.idl_hash s
+
+let unescape_method str =
+  match Lib.String.chop_suffix "_" str with
+    | Some str' -> str'
+    | _ -> str
+
+let needs_candid_quote str =
+  not (is_valid_as_id str) || is_candid_keyword str
+
+
+
+ + + diff --git a/coverage/idllib/exception.ml.html b/coverage/idllib/exception.ml.html new file mode 100644 index 00000000000..11da02d0961 --- /dev/null +++ b/coverage/idllib/exception.ml.html @@ -0,0 +1,41 @@ + + + + + exception.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+
+
+
+
+1
+2
+
+
exception UnsupportedCandidFeature of Diag.message
+
+
+
+
+ + + diff --git a/coverage/idllib/flags.ml.html b/coverage/idllib/flags.ml.html new file mode 100644 index 00000000000..5858ac7cfd0 --- /dev/null +++ b/coverage/idllib/flags.ml.html @@ -0,0 +1,47 @@ + + + + + flags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+
+
let verbose = ref false
+let dump_parse = ref false
+
+
+
+
+
+ + + diff --git a/coverage/idllib/idlHash.ml.html b/coverage/idllib/idlHash.ml.html new file mode 100644 index 00000000000..bf52f23c6c0 --- /dev/null +++ b/coverage/idllib/idlHash.ml.html @@ -0,0 +1,59 @@ + + + + + idlHash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+
+
(* IDL field hashes *)
+let idl_hash : string -> Lib.Uint32.t = fun s ->
+  let open Lib.Uint32 in
+  List.fold_left
+    (fun s c -> add (mul s (of_int 223)) (of_int (Char.code c)))
+    zero
+    (* TODO: also unescape the string, once #465 is approved *)
+    (Lib.String.explode s)
+
+
+
+ + + diff --git a/coverage/idllib/lexer.ml.html b/coverage/idllib/lexer.ml.html new file mode 100644 index 00000000000..7dcb59c6285 --- /dev/null +++ b/coverage/idllib/lexer.ml.html @@ -0,0 +1,9559 @@ + + + + + lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+
+
# 1 "idllib/lexer.mll"
+ 
+open Parser
+module Utf8 = Lib.Utf8
+
+let convert_pos pos =
+  { Source.file = pos.Lexing.pos_fname;
+    Source.line = pos.Lexing.pos_lnum;
+    Source.column = pos.Lexing.pos_cnum - pos.Lexing.pos_bol
+  }
+
+let region lexbuf =
+  let left = convert_pos (Lexing.lexeme_start_p lexbuf) in
+  let right = convert_pos (Lexing.lexeme_end_p lexbuf) in
+  {Source.left = left; Source.right = right}
+
+let error lexbuf msg = raise (Source.ParseError (region lexbuf, msg))
+let error_nest start lexbuf msg =
+  lexbuf.Lexing.lex_start_p <- start;
+  error lexbuf msg
+
+
+let utf8 s i =
+  let len = if s.[!i] < '\xe0' then 1 else if s.[!i] < '\xf0' then 2 else 3 in
+  i := !i + len;
+  List.hd (Utf8.decode (String.sub s (!i - len) (1 + len)))
+
+let codepoint lexbuf s i =
+  let u =
+    if s.[!i] >= '\x80' then Utf8.encode [utf8 s i] else
+    if s.[!i] <> '\\' then Utf8.encode [Char.code s.[!i]] else
+    match (incr i; s.[!i]) with
+    | 'n' -> Utf8.encode [Char.code '\n']
+    | 'r' -> Utf8.encode [Char.code '\r']
+    | 't' -> Utf8.encode [Char.code '\t']
+    | '\\' -> Utf8.encode [Char.code '\\']
+    | '\'' -> Utf8.encode [Char.code '\'']
+    | '\"' -> Utf8.encode [Char.code '\"']
+    | 'u' ->
+      let j = !i + 2 in
+      i := String.index_from s j '}';
+      Utf8.encode [
+        try
+          let n = int_of_string ("0x" ^ String.sub s j (!i - j)) in
+          if 0 <= n && n < 0xD800 || 0xE000 <= n && n < 0x110000 then n else raise (Failure "")
+        with Failure _ -> error lexbuf "unicode escape out of range"
+      ]
+    | h ->
+      incr i;
+      let b = int_of_string ("0x" ^ String.make 1 h ^ String.make 1 s.[!i]) in
+      String.of_seq (Seq.return (Char.chr b))
+  in incr i; u
+
+let text lexbuf s =
+  let b = Buffer.create (String.length s) in
+  let i = ref 1 in
+  while !i < String.length s - 1 do
+    let bs = codepoint lexbuf s i in
+    Buffer.add_substring b bs 0 (String.length bs)
+  done;
+  Buffer.contents b
+
+# 64 "idllib/lexer.ml"
+let __ocaml_lex_tables = {
+  Lexing.lex_base =
+   "\000\000\214\255\000\000\129\000\129\000\193\000\001\001\001\001\
+    \065\001\215\255\216\255\217\255\218\255\203\000\209\001\028\002\
+    \103\002\178\002\253\002\072\003\147\003\222\003\041\004\116\004\
+    \191\004\010\005\133\005\120\005\131\005\130\000\188\000\132\000\
+    \248\255\249\255\250\255\251\255\252\255\253\255\254\255\255\255\
+    \246\255\244\255\245\255\243\255\141\005\179\005\086\006\109\006\
+    \238\255\239\255\240\255\164\006\154\006\107\006\202\006\037\007\
+    \101\007\101\007\165\007\101\008\230\008\038\009\102\009\166\009\
+    \230\009\038\010\102\010\166\010\230\010\237\255\124\000\166\011\
+    \088\008\111\008\153\011\119\012\157\012\232\012\051\013\126\013\
+    \201\013\020\014\095\014\170\014\245\014\064\015\139\015\214\015\
+    \033\016\108\016\183\016\002\017\077\017\152\017\227\017\046\018\
+    \121\018\196\018\015\019\090\019\165\019\240\019\059\020\134\020\
+    \209\020\028\021\103\021\178\021\253\021\072\022\147\022\222\022\
+    \041\023\116\023\191\023\010\024\085\024\160\024\235\024\054\025\
+    \129\025\204\025\023\026\098\026\173\026\248\026\067\027\142\027\
+    \217\027\036\028\111\028\186\028\005\029\080\029\155\029\230\029\
+    \049\030\124\030\199\030\018\031\093\031\168\031\219\255\174\031\
+    \221\255\222\255\047\032\010\007\095\032\159\032\223\032\223\032\
+    \031\033\095\033\159\033\223\033\031\034\095\034\159\034\223\034\
+    \031\035\095\035\159\035\223\035\031\036\095\036\159\036\223\036\
+    \031\037\095\037\159\037\085\038\250\255\005\038\096\011\198\038\
+    \006\039\070\039\070\039\134\039\251\255\252\255\253\255\206\000\
+    \204\000\255\255\254\255\198\039\006\040\070\040\134\040\198\040\
+    \006\041\070\041\134\041\198\041";
+  Lexing.lex_backtrk =
+   "\255\255\255\255\041\000\041\000\041\000\041\000\041\000\041\000\
+    \041\000\255\255\255\255\255\255\255\255\040\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\040\000\014\000\014\000\013\000\040\000\008\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\014\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\
+    \018\000\255\255\255\255\255\255\032\000\032\000\032\000\032\000\
+    \019\000\032\000\032\000\032\000\032\000\032\000\020\000\032\000\
+    \032\000\021\000\032\000\032\000\022\000\032\000\032\000\023\000\
+    \032\000\032\000\032\000\029\000\032\000\032\000\024\000\032\000\
+    \032\000\032\000\032\000\026\000\032\000\032\000\032\000\032\000\
+    \025\000\032\000\032\000\027\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\028\000\032\000\032\000\032\000\030\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\031\000\255\255\035\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\255\255\255\255\255\255\004\000\
+    \004\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_default =
+   "\001\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\000\000\000\000\000\000\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\059\000\255\255\255\255\255\255\255\255\255\255\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\
+    \000\000\000\000\000\000\069\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\059\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\000\255\255\059\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\000\000\143\000\
+    \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\180\000\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\000\000\000\000\255\255\
+    \255\255\000\000\000\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_trans =
+   "\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\012\000\011\000\009\000\009\000\012\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \012\000\030\000\026\000\009\000\009\000\009\000\009\000\009\000\
+    \039\000\038\000\009\000\009\000\034\000\029\000\033\000\013\000\
+    \028\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\032\000\035\000\009\000\031\000\009\000\009\000\
+    \009\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\009\000\009\000\009\000\009\000\014\000\
+    \009\000\014\000\018\000\015\000\014\000\014\000\023\000\014\000\
+    \014\000\025\000\014\000\014\000\014\000\014\000\014\000\021\000\
+    \017\000\016\000\019\000\024\000\022\000\014\000\020\000\014\000\
+    \014\000\014\000\014\000\037\000\009\000\036\000\009\000\009\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \043\000\040\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \007\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\006\000\005\000\005\000\
+    \004\000\002\000\002\000\002\000\003\000\142\000\042\000\073\000\
+    \186\000\041\000\143\000\185\000\000\000\000\000\000\000\000\000\
+    \010\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\128\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\124\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\116\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\113\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\108\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\100\000\014\000\014\000\014\000\
+    \101\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\093\000\014\000\094\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\090\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\087\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\081\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\076\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\049\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\000\000\000\000\050\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\000\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\046\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\045\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\051\000\045\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\044\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\048\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\057\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\056\000\055\000\055\000\054\000\052\000\052\000\
+    \052\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\049\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\047\000\000\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\071\000\000\000\
+    \000\000\000\000\000\000\071\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\072\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\072\000\072\000\072\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\000\000\000\000\000\000\000\000\000\000\
+    \071\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\071\000\000\000\000\000\000\000\071\000\000\000\
+    \071\000\070\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\255\255\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\049\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\000\000\000\000\050\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\059\000\059\000\059\000\059\000\059\000\059\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\059\000\059\000\059\000\059\000\059\000\059\000\000\000\
+    \000\000\051\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\048\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\057\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\056\000\055\000\055\000\054\000\052\000\052\000\
+    \052\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\049\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \049\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\000\000\000\000\
+    \050\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \075\000\000\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \000\000\000\000\051\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\059\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\048\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\057\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\056\000\055\000\055\000\054\000\052\000\
+    \052\000\052\000\053\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\049\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\077\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\078\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\079\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\080\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\082\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\083\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\084\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \085\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\086\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\088\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\089\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\091\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\092\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\096\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\095\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \097\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\098\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \099\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\103\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\102\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\104\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\105\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\106\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\107\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \109\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\110\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\111\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\112\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\114\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\115\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\117\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\118\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\119\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\120\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\121\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\122\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\123\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\125\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\126\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\127\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\129\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\130\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\131\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\132\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\133\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\134\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \135\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\136\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\137\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\138\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\139\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\140\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \144\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\141\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\151\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\150\000\149\000\149\000\148\000\146\000\
+    \146\000\146\000\147\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\145\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\182\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\184\000\
+    \000\000\000\000\000\000\000\000\183\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\178\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\177\000\176\000\176\000\175\000\173\000\173\000\
+    \173\000\174\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\181\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000";
+  Lexing.lex_check =
+   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \029\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\013\000\030\000\070\000\
+    \183\000\030\000\013\000\184\000\255\255\255\255\255\255\255\255\
+    \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\255\255\255\255\255\255\255\255\
+    \014\000\255\255\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\255\255\
+    \255\255\255\255\255\255\015\000\255\255\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\255\255\255\255\255\255\255\255\016\000\255\255\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\255\255\255\255\255\255\
+    \255\255\017\000\255\255\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \255\255\255\255\255\255\255\255\018\000\255\255\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\255\255\255\255\255\255\255\255\019\000\
+    \255\255\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\255\255\255\255\
+    \255\255\255\255\020\000\255\255\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\255\255\255\255\255\255\255\255\021\000\255\255\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\255\255\255\255\255\255\255\255\
+    \022\000\255\255\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\255\255\
+    \255\255\255\255\255\255\023\000\255\255\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\255\255\255\255\255\255\255\255\024\000\255\255\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\255\255\255\255\255\255\
+    \255\255\025\000\255\255\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\255\255\255\255\026\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\255\255\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\044\000\044\000\044\000\
+    \044\000\044\000\044\000\044\000\044\000\044\000\044\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\044\000\044\000\
+    \044\000\044\000\044\000\044\000\255\255\255\255\255\255\027\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\026\000\028\000\045\000\045\000\045\000\045\000\045\000\
+    \045\000\045\000\045\000\045\000\045\000\255\255\044\000\044\000\
+    \044\000\044\000\044\000\044\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\028\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\046\000\
+    \046\000\046\000\046\000\046\000\046\000\047\000\047\000\047\000\
+    \047\000\047\000\047\000\047\000\047\000\047\000\047\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\047\000\047\000\
+    \047\000\047\000\047\000\047\000\255\255\046\000\255\255\046\000\
+    \046\000\046\000\046\000\046\000\046\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\051\000\255\255\
+    \255\255\255\255\255\255\051\000\255\255\255\255\047\000\047\000\
+    \047\000\047\000\047\000\047\000\051\000\051\000\051\000\051\000\
+    \051\000\051\000\051\000\051\000\051\000\051\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\051\000\051\000\051\000\
+    \051\000\051\000\051\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\
+    \051\000\255\255\255\255\255\255\255\255\051\000\051\000\051\000\
+    \051\000\051\000\051\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\051\000\255\255\255\255\255\255\051\000\255\255\
+    \051\000\051\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\051\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\255\255\255\255\059\000\
+    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
+    \072\000\072\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\072\000\072\000\072\000\072\000\072\000\072\000\073\000\
+    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
+    \073\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\000\073\000\073\000\073\000\073\000\073\000\255\255\255\255\
+    \255\255\072\000\072\000\072\000\072\000\072\000\072\000\255\255\
+    \255\255\059\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\000\073\000\073\000\073\000\073\000\073\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\255\255\255\255\
+    \071\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\074\000\074\000\074\000\074\000\074\000\074\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \074\000\255\255\074\000\074\000\074\000\074\000\074\000\074\000\
+    \255\255\255\255\071\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\074\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\075\000\
+    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
+    \075\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \075\000\075\000\075\000\075\000\075\000\075\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\255\255\
+    \075\000\075\000\075\000\075\000\075\000\075\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \255\255\255\255\255\255\255\255\076\000\255\255\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\255\255\255\255\255\255\255\255\077\000\
+    \255\255\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\255\255\255\255\
+    \255\255\255\255\078\000\255\255\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\255\255\255\255\255\255\255\255\079\000\255\255\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\255\255\255\255\255\255\255\255\
+    \080\000\255\255\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\255\255\
+    \255\255\255\255\255\255\081\000\255\255\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\255\255\255\255\255\255\255\255\082\000\255\255\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\255\255\255\255\255\255\
+    \255\255\083\000\255\255\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \255\255\255\255\255\255\255\255\084\000\255\255\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\255\255\255\255\255\255\255\255\085\000\
+    \255\255\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\255\255\255\255\
+    \255\255\255\255\086\000\255\255\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\255\255\255\255\255\255\255\255\087\000\255\255\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\255\255\255\255\255\255\255\255\
+    \088\000\255\255\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\255\255\
+    \255\255\255\255\255\255\089\000\255\255\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\255\255\255\255\255\255\255\255\090\000\255\255\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\255\255\255\255\255\255\
+    \255\255\091\000\255\255\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \255\255\255\255\255\255\255\255\092\000\255\255\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\255\255\255\255\255\255\255\255\093\000\
+    \255\255\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\255\255\255\255\
+    \255\255\255\255\094\000\255\255\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\255\255\255\255\255\255\255\255\095\000\255\255\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\255\255\255\255\255\255\255\255\
+    \096\000\255\255\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\255\255\
+    \255\255\255\255\255\255\097\000\255\255\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\255\255\255\255\255\255\255\255\098\000\255\255\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\255\255\255\255\255\255\
+    \255\255\099\000\255\255\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \255\255\255\255\255\255\255\255\100\000\255\255\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\255\255\255\255\255\255\255\255\101\000\
+    \255\255\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\255\255\255\255\
+    \255\255\255\255\102\000\255\255\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\255\255\255\255\255\255\255\255\103\000\255\255\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\255\255\255\255\255\255\255\255\
+    \104\000\255\255\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\255\255\
+    \255\255\255\255\255\255\105\000\255\255\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\255\255\255\255\255\255\255\255\106\000\255\255\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\255\255\255\255\255\255\
+    \255\255\107\000\255\255\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \255\255\255\255\255\255\255\255\108\000\255\255\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\255\255\255\255\255\255\255\255\109\000\
+    \255\255\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\
+    \255\255\255\255\110\000\255\255\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\255\255\255\255\255\255\255\255\111\000\255\255\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\255\255\255\255\255\255\255\255\
+    \112\000\255\255\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\255\255\
+    \255\255\255\255\255\255\113\000\255\255\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\255\255\255\255\255\255\255\255\114\000\255\255\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\255\255\255\255\255\255\
+    \255\255\115\000\255\255\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \255\255\255\255\255\255\255\255\116\000\255\255\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\255\255\255\255\255\255\255\255\117\000\
+    \255\255\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\255\255\255\255\
+    \255\255\255\255\118\000\255\255\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\255\255\255\255\255\255\255\255\119\000\255\255\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\255\255\255\255\255\255\255\255\
+    \120\000\255\255\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\255\255\
+    \255\255\255\255\255\255\121\000\255\255\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\255\255\255\255\255\255\255\255\122\000\255\255\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\255\255\255\255\255\255\
+    \255\255\123\000\255\255\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\124\000\255\255\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\255\255\255\255\255\255\255\255\125\000\
+    \255\255\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\255\255\255\255\
+    \255\255\255\255\126\000\255\255\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\255\255\255\255\255\255\255\255\127\000\255\255\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\255\255\255\255\255\255\255\255\
+    \128\000\255\255\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\255\255\
+    \255\255\255\255\255\255\129\000\255\255\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\255\255\255\255\255\255\255\255\130\000\255\255\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\255\255\255\255\255\255\
+    \255\255\131\000\255\255\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \255\255\255\255\255\255\255\255\132\000\255\255\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\255\255\255\255\255\255\255\255\133\000\
+    \255\255\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\255\255\255\255\
+    \255\255\255\255\134\000\255\255\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\255\255\255\255\255\255\255\255\135\000\255\255\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\255\255\255\255\255\255\255\255\
+    \136\000\255\255\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\255\255\
+    \255\255\255\255\255\255\137\000\255\255\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\255\255\255\255\255\255\255\255\138\000\255\255\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\255\255\255\255\255\255\
+    \255\255\139\000\255\255\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \143\000\255\255\255\255\255\255\140\000\255\255\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\255\255\255\255\255\255\255\255\141\000\
+    \255\255\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\171\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\171\000\
+    \255\255\255\255\255\255\255\255\171\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255";
+  Lexing.lex_base_code =
+   "";
+  Lexing.lex_backtrk_code =
+   "";
+  Lexing.lex_default_code =
+   "";
+  Lexing.lex_trans_code =
+   "";
+  Lexing.lex_check_code =
+   "";
+  Lexing.lex_code =
+   "";
+}
+
+let rec token lexbuf =
+   __ocaml_lex_token_rec lexbuf 0
+and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 104 "idllib/lexer.mll"
+        ( LPAR )
+# 2905 "idllib/lexer.ml"
+
+  | 1 ->
+# 105 "idllib/lexer.mll"
+        ( RPAR )
+# 2910 "idllib/lexer.ml"
+
+  | 2 ->
+# 106 "idllib/lexer.mll"
+        ( LCURLY )
+# 2915 "idllib/lexer.ml"
+
+  | 3 ->
+# 107 "idllib/lexer.mll"
+        ( RCURLY )
+# 2920 "idllib/lexer.ml"
+
+  | 4 ->
+# 108 "idllib/lexer.mll"
+        ( SEMICOLON )
+# 2925 "idllib/lexer.ml"
+
+  | 5 ->
+# 109 "idllib/lexer.mll"
+        ( COMMA )
+# 2930 "idllib/lexer.ml"
+
+  | 6 ->
+# 110 "idllib/lexer.mll"
+        ( PERIOD )
+# 2935 "idllib/lexer.ml"
+
+  | 7 ->
+# 111 "idllib/lexer.mll"
+        ( COLON )
+# 2940 "idllib/lexer.ml"
+
+  | 8 ->
+# 112 "idllib/lexer.mll"
+        ( EQ )
+# 2945 "idllib/lexer.ml"
+
+  | 9 ->
+# 113 "idllib/lexer.mll"
+         ( EQQ )
+# 2950 "idllib/lexer.ml"
+
+  | 10 ->
+# 114 "idllib/lexer.mll"
+         ( NOTCOLON )
+# 2955 "idllib/lexer.ml"
+
+  | 11 ->
+# 115 "idllib/lexer.mll"
+         ( NOTEQ )
+# 2960 "idllib/lexer.ml"
+
+  | 12 ->
+# 116 "idllib/lexer.mll"
+         ( ARROW )
+# 2965 "idllib/lexer.ml"
+
+  | 13 ->
+# 117 "idllib/lexer.mll"
+        ( MINUS )
+# 2970 "idllib/lexer.ml"
+
+  | 14 ->
+let
+# 119 "idllib/lexer.mll"
+           s
+# 2976 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 119 "idllib/lexer.mll"
+             ( NAT s )
+# 2980 "idllib/lexer.ml"
+
+  | 15 ->
+let
+# 120 "idllib/lexer.mll"
+            s
+# 2986 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 120 "idllib/lexer.mll"
+              ( TEXT (text lexbuf s) )
+# 2990 "idllib/lexer.ml"
+
+  | 16 ->
+# 122 "idllib/lexer.mll"
+    ( error lexbuf "unclosed text literal" )
+# 2995 "idllib/lexer.ml"
+
+  | 17 ->
+# 124 "idllib/lexer.mll"
+    ( error lexbuf "illegal control character in text literal" )
+# 3000 "idllib/lexer.ml"
+
+  | 18 ->
+# 126 "idllib/lexer.mll"
+    ( error_nest (Lexing.lexeme_end_p lexbuf) lexbuf "illegal escape" )
+# 3005 "idllib/lexer.ml"
+
+  | 19 ->
+# 128 "idllib/lexer.mll"
+             ( IMPORT )
+# 3010 "idllib/lexer.ml"
+
+  | 20 ->
+# 129 "idllib/lexer.mll"
+              ( SERVICE )
+# 3015 "idllib/lexer.ml"
+
+  | 21 ->
+# 130 "idllib/lexer.mll"
+           ( FUNC )
+# 3020 "idllib/lexer.ml"
+
+  | 22 ->
+# 131 "idllib/lexer.mll"
+           ( TYPE )
+# 3025 "idllib/lexer.ml"
+
+  | 23 ->
+# 132 "idllib/lexer.mll"
+          ( OPT )
+# 3030 "idllib/lexer.ml"
+
+  | 24 ->
+# 133 "idllib/lexer.mll"
+          ( VEC )
+# 3035 "idllib/lexer.ml"
+
+  | 25 ->
+# 134 "idllib/lexer.mll"
+             ( RECORD )
+# 3040 "idllib/lexer.ml"
+
+  | 26 ->
+# 135 "idllib/lexer.mll"
+              ( VARIANT )
+# 3045 "idllib/lexer.ml"
+
+  | 27 ->
+# 136 "idllib/lexer.mll"
+           ( BLOB )
+# 3050 "idllib/lexer.ml"
+
+  | 28 ->
+# 137 "idllib/lexer.mll"
+                ( PRINCIPAL )
+# 3055 "idllib/lexer.ml"
+
+  | 29 ->
+# 138 "idllib/lexer.mll"
+             ( ONEWAY )
+# 3060 "idllib/lexer.ml"
+
+  | 30 ->
+# 139 "idllib/lexer.mll"
+            ( QUERY )
+# 3065 "idllib/lexer.ml"
+
+  | 31 ->
+# 140 "idllib/lexer.mll"
+                      ( COMPOSITE_QUERY )
+# 3070 "idllib/lexer.ml"
+
+  | 32 ->
+let
+# 142 "idllib/lexer.mll"
+          s
+# 3076 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 142 "idllib/lexer.mll"
+            ( ID s )
+# 3080 "idllib/lexer.ml"
+
+  | 33 ->
+# 144 "idllib/lexer.mll"
+                       ( EOF )
+# 3085 "idllib/lexer.ml"
+
+  | 34 ->
+# 145 "idllib/lexer.mll"
+                        ( Lexing.new_line lexbuf; token lexbuf )
+# 3090 "idllib/lexer.ml"
+
+  | 35 ->
+# 146 "idllib/lexer.mll"
+                    ( token lexbuf (* causes error on following position *) )
+# 3095 "idllib/lexer.ml"
+
+  | 36 ->
+# 147 "idllib/lexer.mll"
+         ( comment (Lexing.lexeme_start_p lexbuf) lexbuf; token lexbuf )
+# 3100 "idllib/lexer.ml"
+
+  | 37 ->
+# 148 "idllib/lexer.mll"
+               ( token lexbuf )
+# 3105 "idllib/lexer.ml"
+
+  | 38 ->
+# 149 "idllib/lexer.mll"
+         ( Lexing.new_line lexbuf; token lexbuf )
+# 3110 "idllib/lexer.ml"
+
+  | 39 ->
+# 150 "idllib/lexer.mll"
+        ( EOF )
+# 3115 "idllib/lexer.ml"
+
+  | 40 ->
+# 152 "idllib/lexer.mll"
+         ( error lexbuf "malformed operator" )
+# 3120 "idllib/lexer.ml"
+
+  | 41 ->
+# 153 "idllib/lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 3125 "idllib/lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_token_rec lexbuf __ocaml_lex_state
+
+and comment start lexbuf =
+   __ocaml_lex_comment_rec start lexbuf 171
+and __ocaml_lex_comment_rec start lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 156 "idllib/lexer.mll"
+         ( () )
+# 3137 "idllib/lexer.ml"
+
+  | 1 ->
+# 157 "idllib/lexer.mll"
+         ( comment (Lexing.lexeme_start_p lexbuf) lexbuf; comment start lexbuf )
+# 3142 "idllib/lexer.ml"
+
+  | 2 ->
+# 158 "idllib/lexer.mll"
+         ( Lexing.new_line lexbuf; comment start lexbuf )
+# 3147 "idllib/lexer.ml"
+
+  | 3 ->
+# 159 "idllib/lexer.mll"
+        ( error_nest start lexbuf "unclosed comment" )
+# 3152 "idllib/lexer.ml"
+
+  | 4 ->
+# 160 "idllib/lexer.mll"
+         ( comment start lexbuf )
+# 3157 "idllib/lexer.ml"
+
+  | 5 ->
+# 161 "idllib/lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 3162 "idllib/lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_comment_rec start lexbuf __ocaml_lex_state
+
+;;
+
+
+
+
+ + + diff --git a/coverage/idllib/parser.ml.html b/coverage/idllib/parser.ml.html new file mode 100644 index 00000000000..559a8ad11ec --- /dev/null +++ b/coverage/idllib/parser.ml.html @@ -0,0 +1,17726 @@ + + + + + parser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+
+

+module MenhirBasics = struct
+  
+  exception Error
+  
+  let _eRR =
+    fun _s ->
+      raise Error
+  
+  type token = 
+    | VEC
+    | VARIANT
+    | TYPE
+    | TEXT of (
+# 60 "idllib/parser.mly"
+      (string)
+# 18 "idllib/parser.ml"
+  )
+    | SERVICE
+    | SEMICOLON
+    | RPAR
+    | RECORD
+    | RCURLY
+    | QUERY
+    | PRINCIPAL
+    | PERIOD
+    | OPT
+    | ONEWAY
+    | NOTEQ
+    | NOTCOLON
+    | NAT of (
+# 58 "idllib/parser.mly"
+      (string)
+# 35 "idllib/parser.ml"
+  )
+    | MINUS
+    | LPAR
+    | LCURLY
+    | IMPORT
+    | ID of (
+# 59 "idllib/parser.mly"
+      (string)
+# 44 "idllib/parser.ml"
+  )
+    | FUNC
+    | EQQ
+    | EQ
+    | EOF
+    | COMPOSITE_QUERY
+    | COMMA
+    | COLON
+    | BLOB
+    | ARROW
+  
+end
+
+include MenhirBasics
+
+# 1 "idllib/parser.mly"
+  
+
+open Syntax
+open Source
+
+module Uint32 = Lib.Uint32
+
+(* Position handling *)
+
+let position_to_pos position =
+  (* TBR: Remove assertion once the menhir bug is fixed. *)
+  assert (Obj.is_block (Obj.repr position));
+  { file = position.Lexing.pos_fname;
+    line = position.Lexing.pos_lnum;
+    column = position.Lexing.pos_cnum - position.Lexing.pos_bol
+  }
+
+let positions_to_region position1 position2 =
+  { left = position_to_pos position1;
+    right = position_to_pos position2
+  }
+
+let at (startpos, endpos) = positions_to_region startpos endpos
+
+let _anon sort at = "anon-" ^ sort ^ "-" ^ string_of_pos at.left
+
+let prim_typs = ["nat", Nat; "nat8", Nat8; "nat16", Nat16; "nat32", Nat32; "nat64", Nat64;
+                 "int", Int; "int8", Int8; "int16", Int16; "int32", Int32; "int64", Int64;
+                 "float32", Float32; "float64", Float64; "bool", Bool; "text", Text;
+                 "null", Null; "reserved", Reserved; "empty", Empty]
+let is_prim_typs t = List.assoc_opt t prim_typs
+
+let hash = IdlHash.idl_hash
+let record_fields get_label fs =
+  let open Uint32 in
+  let rec go start fs =
+    match fs with
+    | [] -> []
+    | hd :: tl ->
+       let field = hd start in
+       let next =
+         (match (get_label field.it).it with
+         | Id n -> succ n
+         | Named name -> succ (hash name)
+         | Unnamed n -> succ n) in
+       field :: (go next tl)
+  in go zero fs
+
+# 109 "idllib/parser.ml"
+
+type ('s, 'r) _menhir_state = 
+  | MenhirState001 : ('s _menhir_cell0_LPAR, _menhir_box_parse_args) _menhir_state
+    (** State 001.
+        Stack shape : LPAR.
+        Start symbol: parse_args. *)
+
+  | MenhirState003 : (('s, _menhir_box_parse_args) _menhir_cell1_VEC _menhir_cell0_LCURLY, _menhir_box_parse_args) _menhir_state
+    (** State 003.
+        Stack shape : VEC LCURLY.
+        Start symbol: parse_args. *)
+
+  | MenhirState007 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_TEXT, _menhir_box_parse_args) _menhir_state
+    (** State 007.
+        Stack shape : VARIANT LCURLY TEXT.
+        Start symbol: parse_args. *)
+
+  | MenhirState013 : (('s, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY, _menhir_box_parse_args) _menhir_state
+    (** State 013.
+        Stack shape : RECORD LCURLY.
+        Start symbol: parse_args. *)
+
+  | MenhirState015 : (('s, _menhir_box_parse_args) _menhir_cell1_TEXT, _menhir_box_parse_args) _menhir_state
+    (** State 015.
+        Stack shape : TEXT.
+        Start symbol: parse_args. *)
+
+  | MenhirState019 : (('s, _menhir_box_parse_args) _menhir_cell1_OPT, _menhir_box_parse_args) _menhir_state
+    (** State 019.
+        Stack shape : OPT.
+        Start symbol: parse_args. *)
+
+  | MenhirState021 : (('s, _menhir_box_parse_args) _menhir_cell1_NAT _menhir_cell0_PERIOD, _menhir_box_parse_args) _menhir_state
+    (** State 021.
+        Stack shape : NAT PERIOD.
+        Start symbol: parse_args. *)
+
+  | MenhirState023 : (('s, _menhir_box_parse_args) _menhir_cell1_MINUS, _menhir_box_parse_args) _menhir_state
+    (** State 023.
+        Stack shape : MINUS.
+        Start symbol: parse_args. *)
+
+  | MenhirState042 : (('s, _menhir_box_parse_args) _menhir_cell1_NAT, _menhir_box_parse_args) _menhir_state
+    (** State 042.
+        Stack shape : NAT.
+        Start symbol: parse_args. *)
+
+  | MenhirState045 : (('s, _menhir_box_parse_args) _menhir_cell1_ID, _menhir_box_parse_args) _menhir_state
+    (** State 045.
+        Stack shape : ID.
+        Start symbol: parse_args. *)
+
+  | MenhirState051 : (('s, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON, _menhir_box_parse_args) _menhir_state
+    (** State 051.
+        Stack shape : field_value SEMICOLON.
+        Start symbol: parse_args. *)
+
+  | MenhirState055 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_NAT, _menhir_box_parse_args) _menhir_state
+    (** State 055.
+        Stack shape : VARIANT LCURLY NAT.
+        Start symbol: parse_args. *)
+
+  | MenhirState058 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_ID, _menhir_box_parse_args) _menhir_state
+    (** State 058.
+        Stack shape : VARIANT LCURLY ID.
+        Start symbol: parse_args. *)
+
+  | MenhirState063 : (('s, _menhir_box_parse_args) _menhir_cell1_value _menhir_cell0_SEMICOLON, _menhir_box_parse_args) _menhir_state
+    (** State 063.
+        Stack shape : value SEMICOLON.
+        Start symbol: parse_args. *)
+
+  | MenhirState072 : (('s, _menhir_box_parse_args) _menhir_cell1_annval, _menhir_box_parse_args) _menhir_state
+    (** State 072.
+        Stack shape : annval.
+        Start symbol: parse_args. *)
+
+  | MenhirState075 : ('s, _menhir_box_parse_prog) _menhir_state
+    (** State 075.
+        Stack shape : .
+        Start symbol: parse_prog. *)
+
+  | MenhirState078 : (('s, 'r) _menhir_cell1_TYPE _menhir_cell0_ID, 'r) _menhir_state
+    (** State 078.
+        Stack shape : TYPE ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState079 : (('s, 'r) _menhir_cell1_VEC, 'r) _menhir_state
+    (** State 079.
+        Stack shape : VEC.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState081 : (('s, 'r) _menhir_cell1_VARIANT _menhir_cell0_LCURLY, 'r) _menhir_state
+    (** State 081.
+        Stack shape : VARIANT LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState083 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 083.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState084 : (('s, 'r) _menhir_cell1_SERVICE, 'r) _menhir_state
+    (** State 084.
+        Stack shape : SERVICE.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState085 : (('s, 'r) _menhir_cell1_LCURLY, 'r) _menhir_state
+    (** State 085.
+        Stack shape : LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState087 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 087.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState088 : (('s, 'r) _menhir_cell1_LPAR, 'r) _menhir_state
+    (** State 088.
+        Stack shape : LPAR.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState090 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 090.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState092 : (('s, 'r) _menhir_cell1_RECORD _menhir_cell0_LCURLY, 'r) _menhir_state
+    (** State 092.
+        Stack shape : RECORD LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState095 : (('s, 'r) _menhir_cell1_OPT, 'r) _menhir_state
+    (** State 095.
+        Stack shape : OPT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState097 : (('s, 'r) _menhir_cell1_FUNC, 'r) _menhir_state
+    (** State 097.
+        Stack shape : FUNC.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState099 : (('s, 'r) _menhir_cell1_param_typs, 'r) _menhir_state
+    (** State 099.
+        Stack shape : param_typs.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState100 : ((('s, 'r) _menhir_cell1_param_typs, 'r) _menhir_cell1_param_typs, 'r) _menhir_state
+    (** State 100.
+        Stack shape : param_typs param_typs.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState105 : (('s, 'r) _menhir_cell1_func_mode, 'r) _menhir_state
+    (** State 105.
+        Stack shape : func_mode.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState114 : (('s, 'r) _menhir_cell1_NAT, 'r) _menhir_state
+    (** State 114.
+        Stack shape : NAT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState117 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 117.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState122 : (('s, 'r) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 122.
+        Stack shape : record_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState129 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 129.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState134 : (('s, 'r) _menhir_cell1_param_typ, 'r) _menhir_state
+    (** State 134.
+        Stack shape : param_typ.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState140 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 140.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState146 : (('s, 'r) _menhir_cell1_meth_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 146.
+        Stack shape : meth_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState153 : (('s, 'r) _menhir_cell1_variant_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 153.
+        Stack shape : variant_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState167 : (('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_state
+    (** State 167.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt.
+        Start symbol: parse_prog. *)
+
+  | MenhirState168 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_ID, _menhir_box_parse_prog) _menhir_state
+    (** State 168.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt ID.
+        Start symbol: parse_prog. *)
+
+  | MenhirState172 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_param_typs, _menhir_box_parse_prog) _menhir_state
+    (** State 172.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt param_typs.
+        Start symbol: parse_prog. *)
+
+  | MenhirState175 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_typ, _menhir_box_parse_prog) _menhir_state
+    (** State 175.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt actor_typ.
+        Start symbol: parse_prog. *)
+
+  | MenhirState177 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_class_typ, _menhir_box_parse_prog) _menhir_state
+    (** State 177.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt actor_class_typ.
+        Start symbol: parse_prog. *)
+
+  | MenhirState183 : (('s, 'r) _menhir_cell1_def _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 183.
+        Stack shape : def SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState185 : ('s, _menhir_box_parse_tests) _menhir_state
+    (** State 185.
+        Stack shape : .
+        Start symbol: parse_tests. *)
+
+  | MenhirState187 : (('s, _menhir_box_parse_tests) _menhir_cell1_endlist_def_SEMICOLON_, _menhir_box_parse_tests) _menhir_state
+    (** State 187.
+        Stack shape : endlist(def,SEMICOLON).
+        Start symbol: parse_tests. *)
+
+  | MenhirState188 : (('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_state
+    (** State 188.
+        Stack shape : ID.
+        Start symbol: parse_tests. *)
+
+  | MenhirState193 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input, _menhir_box_parse_tests) _menhir_state
+    (** State 193.
+        Stack shape : ID input.
+        Start symbol: parse_tests. *)
+
+  | MenhirState197 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input, _menhir_box_parse_tests) _menhir_state
+    (** State 197.
+        Stack shape : ID input.
+        Start symbol: parse_tests. *)
+
+  | MenhirState201 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion, _menhir_box_parse_tests) _menhir_state
+    (** State 201.
+        Stack shape : ID assertion.
+        Start symbol: parse_tests. *)
+
+  | MenhirState206 : (('s, _menhir_box_parse_tests) _menhir_cell1_test _menhir_cell0_SEMICOLON, _menhir_box_parse_tests) _menhir_state
+    (** State 206.
+        Stack shape : test SEMICOLON.
+        Start symbol: parse_tests. *)
+
+  | MenhirState211 : (('s, _menhir_box_parse_tests) _menhir_cell1_def _menhir_cell0_SEMICOLON, _menhir_box_parse_tests) _menhir_state
+    (** State 211.
+        Stack shape : def SEMICOLON.
+        Start symbol: parse_tests. *)
+
+
+and ('s, 'r) _menhir_cell1_actor_class_typ = 
+  | MenhirCell1_actor_class_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_actor_typ = 
+  | MenhirCell1_actor_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_meth list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_annval = 
+  | MenhirCell1_annval of 's * ('s, 'r) _menhir_state * (Syntax.value)
+
+and ('s, 'r) _menhir_cell1_assertion = 
+  | MenhirCell1_assertion of 's * ('s, 'r) _menhir_state * (Syntax.test_assertion)
+
+and ('s, 'r) _menhir_cell1_def = 
+  | MenhirCell1_def of 's * ('s, 'r) _menhir_state * (Syntax.dec) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_endlist_def_SEMICOLON_ = 
+  | MenhirCell1_endlist_def_SEMICOLON_ of 's * ('s, 'r) _menhir_state * (Syntax.dec list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_field_value = 
+  | MenhirCell1_field_value of 's * ('s, 'r) _menhir_state * (Uint32.t -> Syntax.field_value)
+
+and ('s, 'r) _menhir_cell1_func_mode = 
+  | MenhirCell1_func_mode of 's * ('s, 'r) _menhir_state * (Syntax.func_mode)
+
+and 's _menhir_cell0_id_opt = 
+  | MenhirCell0_id_opt of 's * (unit)
+
+and ('s, 'r) _menhir_cell1_input = 
+  | MenhirCell1_input of 's * ('s, 'r) _menhir_state * (Syntax.input)
+
+and ('s, 'r) _menhir_cell1_meth_typ = 
+  | MenhirCell1_meth_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_meth' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_param_typ = 
+  | MenhirCell1_param_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ)
+
+and ('s, 'r) _menhir_cell1_param_typs = 
+  | MenhirCell1_param_typs of 's * ('s, 'r) _menhir_state * (Syntax.typ list) * Lexing.position
+
+and ('s, 'r) _menhir_cell1_record_typ = 
+  | MenhirCell1_record_typ of 's * ('s, 'r) _menhir_state * (Uint32.t -> Syntax.typ_field' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_seplist_def_SEMICOLON_ = 
+  | MenhirCell1_seplist_def_SEMICOLON_ of 's * ('s, 'r) _menhir_state * (Syntax.dec list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_test = 
+  | MenhirCell1_test of 's * ('s, 'r) _menhir_state * (Syntax.test' Source.phrase) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_value = 
+  | MenhirCell1_value of 's * ('s, 'r) _menhir_state * (Syntax.value' Source.phrase) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_variant_typ = 
+  | MenhirCell1_variant_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_field' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_FUNC = 
+  | MenhirCell1_FUNC of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_ID = 
+  | MenhirCell1_ID of 's * ('s, 'r) _menhir_state * (
+# 59 "idllib/parser.mly"
+      (string)
+# 439 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_ID = 
+  | MenhirCell0_ID of 's * (
+# 59 "idllib/parser.mly"
+      (string)
+# 446 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_LCURLY = 
+  | MenhirCell1_LCURLY of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_LCURLY = 
+  | MenhirCell0_LCURLY of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_LPAR = 
+  | MenhirCell1_LPAR of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_LPAR = 
+  | MenhirCell0_LPAR of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_MINUS = 
+  | MenhirCell1_MINUS of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_NAT = 
+  | MenhirCell1_NAT of 's * ('s, 'r) _menhir_state * (
+# 58 "idllib/parser.mly"
+      (string)
+# 468 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_NAT = 
+  | MenhirCell0_NAT of 's * (
+# 58 "idllib/parser.mly"
+      (string)
+# 475 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_OPT = 
+  | MenhirCell1_OPT of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_PERIOD = 
+  | MenhirCell0_PERIOD of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_RECORD = 
+  | MenhirCell1_RECORD of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_SEMICOLON = 
+  | MenhirCell0_SEMICOLON of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_SERVICE = 
+  | MenhirCell1_SERVICE of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_SERVICE = 
+  | MenhirCell0_SERVICE of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_TEXT = 
+  | MenhirCell1_TEXT of 's * ('s, 'r) _menhir_state * (
+# 60 "idllib/parser.mly"
+      (string)
+# 500 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_TEXT = 
+  | MenhirCell0_TEXT of 's * (
+# 60 "idllib/parser.mly"
+      (string)
+# 507 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_TYPE = 
+  | MenhirCell1_TYPE of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_VARIANT = 
+  | MenhirCell1_VARIANT of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_VEC = 
+  | MenhirCell1_VEC of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and _menhir_box_parse_tests = 
+  | MenhirBox_parse_tests of (string -> Syntax.tests) [@@unboxed]
+
+and _menhir_box_parse_prog = 
+  | MenhirBox_parse_prog of (string -> Syntax.prog) [@@unboxed]
+
+and _menhir_box_parse_args = 
+  | MenhirBox_parse_args of (Syntax.value list Source.phrase) [@@unboxed]
+
+let _menhir_action_003 =
+  fun () ->
+    (
+# 195 "idllib/parser.mly"
+                ( None )
+# 533 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_004 =
+  fun _endpos_tys_ _startpos_tys_ tys ->
+    let _loc_tys_ = (_startpos_tys_, _endpos_tys_) in
+    (
+# 197 "idllib/parser.mly"
+    ( Some (ServT tys @@ at _loc_tys_) )
+# 542 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_005 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 554 "idllib/parser.ml"
+      
+    in
+    (
+# 199 "idllib/parser.mly"
+    ( Some (VarT x @@ x.at) )
+# 560 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_006 =
+  fun t ->
+    (
+# 201 "idllib/parser.mly"
+    ( Some t )
+# 568 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_007 =
+  fun _endpos_tys_ _startpos_args_ _startpos_tys_ args tys ->
+    let _endpos = _endpos_tys_ in
+    let _symbolstartpos = _startpos_args_ in
+    let _loc_tys_ = (_startpos_tys_, _endpos_tys_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 190 "idllib/parser.mly"
+    ( ClassT (args, ServT tys @@ at _loc_tys_) @@ at _sloc )
+# 580 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_008 =
+  fun _endpos_id_ _startpos_args_ _startpos_id_ args id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 592 "idllib/parser.ml"
+      
+    in
+    let _endpos_x_ = _endpos_id_ in
+    let _endpos = _endpos_x_ in
+    let _symbolstartpos = _startpos_args_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 192 "idllib/parser.mly"
+    ( ClassT (args, VarT x @@ x.at) @@ at _sloc )
+# 602 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_009 =
+  fun ds ->
+    (
+# 173 "idllib/parser.mly"
+    ( ds )
+# 610 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_010 =
+  fun v ->
+    (
+# 263 "idllib/parser.mly"
+            ( v )
+# 618 "idllib/parser.ml"
+     : (Syntax.value))
+
+let _menhir_action_011 =
+  fun input ->
+    (
+# 276 "idllib/parser.mly"
+                         ( ParsesAs (true,  input) )
+# 626 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_012 =
+  fun input ->
+    (
+# 277 "idllib/parser.mly"
+                         ( ParsesAs (false, input) )
+# 634 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_013 =
+  fun i1 i2 ->
+    (
+# 278 "idllib/parser.mly"
+                                  ( ParsesEqual (true,  i1, i2) )
+# 642 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_014 =
+  fun i1 i2 ->
+    (
+# 279 "idllib/parser.mly"
+                                  ( ParsesEqual (false, i1, i2) )
+# 650 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_015 =
+  fun _endpos_t_ _startpos__1_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 133 "idllib/parser.mly"
+                   ( OptT t @@ at _sloc )
+# 661 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_016 =
+  fun _endpos_t_ _startpos__1_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 134 "idllib/parser.mly"
+                   ( VecT t @@ at _sloc )
+# 672 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_017 =
+  fun _endpos_fs_ _startpos__1_ fs ->
+    let _endpos = _endpos_fs_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 135 "idllib/parser.mly"
+                          ( RecordT fs @@ at _sloc )
+# 683 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_018 =
+  fun _endpos_fs_ _startpos__1_ fs ->
+    let _endpos = _endpos_fs_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 136 "idllib/parser.mly"
+                            ( VariantT fs @@ at _sloc )
+# 694 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_019 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 137 "idllib/parser.mly"
+         ( BlobT @@ at _sloc )
+# 705 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_020 =
+  fun t ->
+    (
+# 140 "idllib/parser.mly"
+               ( t )
+# 713 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_021 =
+  fun t ->
+    (
+# 141 "idllib/parser.mly"
+              ( t )
+# 721 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_022 =
+  fun t ->
+    (
+# 142 "idllib/parser.mly"
+               ( t )
+# 729 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_023 =
+  fun _endpos_id_ _endpos_t_ _startpos__1_ _startpos_id_ id t ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 741 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 179 "idllib/parser.mly"
+    ( TypD(x, t) @@ at _sloc )
+# 750 "idllib/parser.ml"
+     : (Syntax.dec))
+
+let _menhir_action_024 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let file =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 764 "idllib/parser.ml"
+      
+    in
+    let _endpos_file_ = _endpos_s_ in
+    let _endpos = _endpos_file_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 182 "idllib/parser.mly"
+    ( ImportD (file, ref "") @@ at _sloc )
+# 774 "idllib/parser.ml"
+     : (Syntax.dec))
+
+let _menhir_action_025 =
+  fun () ->
+    (
+# 71 "idllib/parser.mly"
+                ( [] )
+# 782 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_026 =
+  fun x xs ->
+    (
+# 72 "idllib/parser.mly"
+                               ( x::xs )
+# 790 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_027 =
+  fun _endpos_n_ _endpos_t_ _startpos_n_ n t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 109 "idllib/parser.mly"
+    ( { label = Id (Uint32.of_string n) @@ at _loc_n_; typ = t } @@ at _sloc )
+# 802 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_028 =
+  fun _endpos_id_ _endpos_t_ _startpos_id_ id t ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 814 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 111 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = t } @@ at _sloc )
+# 825 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_029 =
+  fun _endpos_s_ _endpos_t_ _startpos_s_ s t ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 840 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 850 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 111 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = t } @@ at _sloc )
+# 861 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_030 =
+  fun _endpos_n_ _endpos_v_ _startpos_n_ n v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 256 "idllib/parser.mly"
+    ( fun _ -> (Id (Uint32.of_string n) @@ at _loc_n_, v) @@ at _sloc )
+# 873 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_031 =
+  fun _endpos_id_ _endpos_v_ _startpos_id_ id v ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 885 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 258 "idllib/parser.mly"
+    ( fun _ -> (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 896 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_032 =
+  fun _endpos_s_ _endpos_v_ _startpos_s_ s v ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 911 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 921 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 258 "idllib/parser.mly"
+    ( fun _ -> (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 932 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_033 =
+  fun _endpos_v_ _startpos_v_ v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_v_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 260 "idllib/parser.mly"
+    ( fun n -> (Unnamed n @@ no_region, v) @@ at _sloc )
+# 943 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_034 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 153 "idllib/parser.mly"
+           ( Oneway @@ at _sloc )
+# 954 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_035 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 154 "idllib/parser.mly"
+          ( Query @@ at _sloc )
+# 965 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_036 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 155 "idllib/parser.mly"
+                    ( Composite @@ at _sloc )
+# 976 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_037 =
+  fun () ->
+    (
+# 158 "idllib/parser.mly"
+                ( [] )
+# 984 "idllib/parser.ml"
+     : (Syntax.func_mode list))
+
+let _menhir_action_038 =
+  fun m ms ->
+    (
+# 159 "idllib/parser.mly"
+                                  ( m::ms )
+# 992 "idllib/parser.ml"
+     : (Syntax.func_mode list))
+
+let _menhir_action_039 =
+  fun _endpos_ms_ _startpos_t1_ ms t1 t2 ->
+    let _endpos = _endpos_ms_ in
+    let _symbolstartpos = _startpos_t1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 163 "idllib/parser.mly"
+    ( FuncT(ms, t1, t2) @@ at _sloc )
+# 1003 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_040 =
+  fun () ->
+    (
+# 185 "idllib/parser.mly"
+                ( )
+# 1011 "idllib/parser.ml"
+     : (unit))
+
+let _menhir_action_041 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let _1 =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1023 "idllib/parser.ml"
+      
+    in
+    (
+# 186 "idllib/parser.mly"
+       ( )
+# 1029 "idllib/parser.ml"
+     : (unit))
+
+let _menhir_action_042 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let text =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1043 "idllib/parser.ml"
+      
+    in
+    (
+# 272 "idllib/parser.mly"
+              ( TextualInput text )
+# 1049 "idllib/parser.ml"
+     : (Syntax.input))
+
+let _menhir_action_043 =
+  fun text ->
+    (
+# 273 "idllib/parser.mly"
+                   ( BinaryInput text )
+# 1057 "idllib/parser.ml"
+     : (Syntax.input))
+
+let _menhir_action_044 =
+  fun _endpos_id_ _endpos_t_ _startpos_id_ id t ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1069 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_id_ in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 167 "idllib/parser.mly"
+    ( { var = x; meth = t } @@ at _sloc )
+# 1079 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_045 =
+  fun _endpos_s_ _endpos_t_ _startpos_s_ s t ->
+    let x =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1094 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1104 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_s_ in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 167 "idllib/parser.mly"
+    ( { var = x; meth = t } @@ at _sloc )
+# 1114 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_046 =
+  fun _endpos_id_ _endpos_id_inlined1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1126 "idllib/parser.ml"
+      
+    in
+    let x =
+      let (_endpos_id_, _startpos_id_, id) = (_endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) in
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1137 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_id_inlined1_ in
+    let _endpos = _endpos_id_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 169 "idllib/parser.mly"
+    ( { var = x; meth = VarT id @@ at _sloc } @@ at _sloc )
+# 1147 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_047 =
+  fun _endpos_id_ _endpos_s_ _startpos_id_ _startpos_s_ id s ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1159 "idllib/parser.ml"
+      
+    in
+    let x =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1172 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1182 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_s_ in
+    let _endpos = _endpos_id_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 169 "idllib/parser.mly"
+    ( { var = x; meth = VarT id @@ at _sloc } @@ at _sloc )
+# 1192 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_048 =
+  fun n n2 ->
+    (
+# 214 "idllib/parser.mly"
+                        ( n ^ "." ^ n2 )
+# 1200 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_049 =
+  fun n ->
+    (
+# 215 "idllib/parser.mly"
+                 ( n ^ "." )
+# 1208 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_050 =
+  fun n ->
+    (
+# 216 "idllib/parser.mly"
+          ( n )
+# 1216 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_051 =
+  fun () ->
+    (
+# 111 "<standard.mly>"
+    ( None )
+# 1224 "idllib/parser.ml"
+     : (unit option))
+
+let _menhir_action_052 =
+  fun x ->
+    (
+# 113 "<standard.mly>"
+    ( Some x )
+# 1232 "idllib/parser.ml"
+     : (unit option))
+
+let _menhir_action_053 =
+  fun () ->
+    (
+# 111 "<standard.mly>"
+    ( None )
+# 1240 "idllib/parser.ml"
+     : (string option))
+
+let _menhir_action_054 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let x =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1254 "idllib/parser.ml"
+      
+    in
+    (
+# 113 "<standard.mly>"
+    ( Some x )
+# 1260 "idllib/parser.ml"
+     : (string option))
+
+let _menhir_action_055 =
+  fun t ->
+    (
+# 149 "idllib/parser.mly"
+               ( t )
+# 1268 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_056 =
+  fun _endpos_id_ _startpos_id_ id t ->
+    let _1 =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1280 "idllib/parser.ml"
+      
+    in
+    (
+# 150 "idllib/parser.mly"
+                          ( t )
+# 1286 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_057 =
+  fun _endpos_s_ _startpos_s_ s t ->
+    let _1 =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1301 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1311 "idllib/parser.ml"
+      
+    in
+    (
+# 150 "idllib/parser.mly"
+                          ( t )
+# 1317 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_058 =
+  fun fs ->
+    (
+# 146 "idllib/parser.mly"
+    ( fs )
+# 1325 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_059 =
+  fun _endpos__4_ _startpos__1_ vs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 266 "idllib/parser.mly"
+                                            ( vs @@ at _sloc )
+# 1336 "idllib/parser.ml"
+     : (Syntax.value list Source.phrase))
+
+let _menhir_action_060 =
+  fun _endpos__3_ _endpos_actor_ _endpos_ds_ _startpos__3_ _startpos_actor_ _startpos_ds_ actor ds ->
+    let _endpos = _endpos__3_ in
+    let _symbolstartpos = if _startpos_ds_ != _endpos_ds_ then
+      _startpos_ds_
+    else
+      if _startpos_actor_ != _endpos_actor_ then
+        _startpos_actor_
+      else
+        _startpos__3_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 207 "idllib/parser.mly"
+    ( fun filename -> { it = {decs=ds; actor=actor}; at = at _sloc; note = filename} )
+# 1353 "idllib/parser.ml"
+     : (string -> Syntax.prog))
+
+let _menhir_action_061 =
+  fun _endpos__3_ _endpos_tdecs_ _endpos_tests_ _startpos__3_ _startpos_tdecs_ _startpos_tests_ tdecs tests ->
+    let _endpos = _endpos__3_ in
+    let _symbolstartpos = if _startpos_tdecs_ != _endpos_tdecs_ then
+      _startpos_tdecs_
+    else
+      if _startpos_tests_ != _endpos_tests_ then
+        _startpos_tests_
+      else
+        _startpos__3_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 288 "idllib/parser.mly"
+    ( fun filename -> { it = {tdecs; tests}; at = at _sloc; note = filename} )
+# 1370 "idllib/parser.ml"
+     : (string -> Syntax.tests))
+
+let _menhir_action_062 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1382 "idllib/parser.ml"
+      
+    in
+    let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_x_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 98 "idllib/parser.mly"
+    ( (match is_prim_typs x.it with
+         None -> VarT x
+       | Some t -> PrimT t) @@ at _sloc )
+# 1394 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_063 =
+  fun f ->
+    (
+# 114 "idllib/parser.mly"
+                ( fun _ -> f )
+# 1402 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.typ_field' Source.phrase))
+
+let _menhir_action_064 =
+  fun _endpos_t_ _startpos_t_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_t_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 116 "idllib/parser.mly"
+    ( fun x -> { label = Unnamed x @@ no_region; typ = t } @@ at _sloc )
+# 1413 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.typ_field' Source.phrase))
+
+let _menhir_action_065 =
+  fun fs ->
+    (
+# 127 "idllib/parser.mly"
+    ( record_fields (fun f -> f.label) fs )
+# 1421 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_066 =
+  fun t ->
+    (
+# 103 "idllib/parser.mly"
+                    ( t )
+# 1429 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_067 =
+  fun _endpos_ts_ _startpos__1_ ts ->
+    let _endpos = _endpos_ts_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 104 "idllib/parser.mly"
+                         ( ServT ts @@ at _sloc )
+# 1440 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_068 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 105 "idllib/parser.mly"
+              ( PrincipalT @@ at _sloc )
+# 1451 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_069 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1459 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_070 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1467 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_071 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1475 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_072 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1483 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_073 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1491 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_074 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1499 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_075 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1507 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_076 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1515 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_077 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1523 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_078 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1531 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_079 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1539 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_080 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1547 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_081 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1555 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_082 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1563 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_083 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1571 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_084 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1579 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_085 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1587 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_086 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1595 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_087 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1603 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_088 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1611 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_089 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1619 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_090 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1627 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_091 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1635 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_092 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1643 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_093 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1651 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_094 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1659 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_095 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1667 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_096 =
+  fun n ->
+    (
+# 219 "idllib/parser.mly"
+                ( "-" ^ n )
+# 1675 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_097 =
+  fun n ->
+    (
+# 220 "idllib/parser.mly"
+          ( n )
+# 1683 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_098 =
+  fun _endpos_desc_ _endpos_id_ _startpos_id_ assertion desc id tys ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1695 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_desc_ in
+    let _symbolstartpos = _startpos_id_ in
+    let _loc_id_ = (_startpos_id_, _endpos_id_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 283 "idllib/parser.mly"
+    ( if id.it <> "assert" then raise (ParseError (at _loc_id_, id.it))
+      else { ttyp=tys; assertion; desc } @@ at _sloc )
+# 1706 "idllib/parser.ml"
+     : (Syntax.test' Source.phrase))
+
+let _menhir_action_099 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 223 "idllib/parser.mly"
+                 ( NumV n @@ at _sloc )
+# 1717 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_100 =
+  fun _endpos_v_ _startpos__1_ v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 224 "idllib/parser.mly"
+                ( OptV v @@ at _sloc )
+# 1728 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_101 =
+  fun _endpos__4_ _startpos__1_ vs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 226 "idllib/parser.mly"
+    ( VecV vs @@ at _sloc )
+# 1739 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_102 =
+  fun _endpos_text_ _startpos__1_ text ->
+    let _endpos = _endpos_text_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 227 "idllib/parser.mly"
+                   ( BlobV text @@ at _sloc )
+# 1750 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_103 =
+  fun _endpos_text_ _startpos_text_ text ->
+    let _endpos = _endpos_text_ in
+    let _symbolstartpos = _startpos_text_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 228 "idllib/parser.mly"
+              ( TextV text @@ at _sloc )
+# 1761 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_104 =
+  fun _endpos__4_ _startpos__1_ fs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 230 "idllib/parser.mly"
+    ( RecordV (record_fields (fun f -> fst f) fs) @@ at _sloc )
+# 1772 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_105 =
+  fun _endpos__4_ _startpos__1_ f ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 232 "idllib/parser.mly"
+    ( VariantV f @@ at _sloc )
+# 1783 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_106 =
+  fun _endpos_id_ _startpos__1_ _startpos_id_ id ->
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1795 "idllib/parser.ml"
+      
+    in
+    let _endpos_s_ = _endpos_id_ in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 233 "idllib/parser.mly"
+                   ( ServiceV s.it @@ at _sloc )
+# 1805 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_107 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1820 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1830 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 233 "idllib/parser.mly"
+                   ( ServiceV s.it @@ at _sloc )
+# 1839 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_108 =
+  fun _endpos_id_ _endpos_id_inlined1_ _startpos__1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 ->
+    let m =
+      let (_endpos_id_, _startpos_id_, id) = (_endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) in
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1852 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_id_inlined1_ in
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1863 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 234 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1872 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_109 =
+  fun _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s ->
+    let m =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1887 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1897 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_s_ in
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1908 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 234 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1917 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_110 =
+  fun _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s ->
+    let m =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1929 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_id_ in
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1943 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1953 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 234 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1962 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_111 =
+  fun _endpos_s_ _endpos_s_inlined1_ _startpos__1_ _startpos_s_ _startpos_s_inlined1_ s s_inlined1 ->
+    let m =
+      let (_endpos_s_, _startpos_s_, s) = (_endpos_s_inlined1_, _startpos_s_inlined1_, s_inlined1) in
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1978 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1988 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_s_inlined1_ in
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2002 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2012 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 234 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 2021 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_112 =
+  fun _endpos_id_ _startpos__1_ _startpos_id_ id ->
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2033 "idllib/parser.ml"
+      
+    in
+    let _endpos_s_ = _endpos_id_ in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 235 "idllib/parser.mly"
+                     ( PrincipalV s.it @@ at _sloc )
+# 2043 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_113 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2058 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2068 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 235 "idllib/parser.mly"
+                     ( PrincipalV s.it @@ at _sloc )
+# 2077 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_114 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let b =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2089 "idllib/parser.ml"
+      
+    in
+    let (_endpos_b_, _startpos_b_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_b_ in
+    let _symbolstartpos = _startpos_b_ in
+    let _loc_b_ = (_startpos_b_, _endpos_b_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 237 "idllib/parser.mly"
+    ( match b.it with
+      | "null" -> NullV @@ at _sloc
+      | "true" -> BoolV true @@ at _sloc
+      | "false" -> BoolV false @@ at _sloc
+      | _ -> raise (ParseError (at _loc_b_, b.it))
+    )
+# 2105 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_115 =
+  fun f ->
+    (
+# 119 "idllib/parser.mly"
+                ( f )
+# 2113 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_116 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2125 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 121 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2136 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_117 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2151 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2161 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 121 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2172 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_118 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 123 "idllib/parser.mly"
+    ( { label = Id (Uint32.of_string n) @@ at _loc_n_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2184 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_119 =
+  fun fs ->
+    (
+# 130 "idllib/parser.mly"
+                                                     ( fs )
+# 2192 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_120 =
+  fun _endpos_n_ _endpos_v_ _startpos_n_ n v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 246 "idllib/parser.mly"
+    ( (Id (Uint32.of_string n) @@ at _loc_n_, v ) @@ at _sloc )
+# 2204 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_121 =
+  fun _endpos_id_ _endpos_v_ _startpos_id_ id v ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2216 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 248 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 2227 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_122 =
+  fun _endpos_s_ _endpos_v_ _startpos_s_ s v ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2242 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2252 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 248 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 2263 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_123 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 250 "idllib/parser.mly"
+    ( (Id (Uint32.of_string n) @@ at _loc_n_, NullV @@ no_region) @@ at _sloc )
+# 2275 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_124 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2287 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 252 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, NullV @@ no_region) @@ at _sloc )
+# 2298 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_125 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2313 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2323 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 252 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, NullV @@ no_region) @@ at _sloc )
+# 2334 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_print_token : token -> string =
+  fun _tok ->
+    match _tok with
+    | ARROW ->
+        "ARROW"
+    | BLOB ->
+        "BLOB"
+    | COLON ->
+        "COLON"
+    | COMMA ->
+        "COMMA"
+    | COMPOSITE_QUERY ->
+        "COMPOSITE_QUERY"
+    | EOF ->
+        "EOF"
+    | EQ ->
+        "EQ"
+    | EQQ ->
+        "EQQ"
+    | FUNC ->
+        "FUNC"
+    | ID _ ->
+        "ID"
+    | IMPORT ->
+        "IMPORT"
+    | LCURLY ->
+        "LCURLY"
+    | LPAR ->
+        "LPAR"
+    | MINUS ->
+        "MINUS"
+    | NAT _ ->
+        "NAT"
+    | NOTCOLON ->
+        "NOTCOLON"
+    | NOTEQ ->
+        "NOTEQ"
+    | ONEWAY ->
+        "ONEWAY"
+    | OPT ->
+        "OPT"
+    | PERIOD ->
+        "PERIOD"
+    | PRINCIPAL ->
+        "PRINCIPAL"
+    | QUERY ->
+        "QUERY"
+    | RCURLY ->
+        "RCURLY"
+    | RECORD ->
+        "RECORD"
+    | RPAR ->
+        "RPAR"
+    | SEMICOLON ->
+        "SEMICOLON"
+    | SERVICE ->
+        "SERVICE"
+    | TEXT _ ->
+        "TEXT"
+    | TYPE ->
+        "TYPE"
+    | VARIANT ->
+        "VARIANT"
+    | VEC ->
+        "VEC"
+
+let _menhir_fail : unit -> 'a =
+  fun () ->
+    Printf.eprintf "Internal failure -- please contact the parser generator's developers.\n%!";
+    assert false
+
+include struct
+  
+  [@@@ocaml.warning "-4-37-39"]
+  
+  let rec _menhir_run_068 : type  ttv_stack. ttv_stack _menhir_cell0_LPAR -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EOF ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let MenhirCell0_LPAR (_menhir_stack, _startpos__1_) = _menhir_stack in
+          let (_endpos__4_, vs) = (_endpos, _v) in
+          let _v = _menhir_action_059 _endpos__4_ _startpos__1_ vs in
+          MenhirBox_parse_args _v
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_073 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_annval -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell1_annval (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_071 x xs in
+      _menhir_goto_seplist_annval_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_annval_COMMA_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_073 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState001 ->
+          _menhir_run_068 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  let rec _menhir_run_002 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | TEXT _v ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos_1, _v) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos_text_ _v MenhirState003 _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState003
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | ID _v ->
+              let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_2, _v) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v MenhirState003 _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | RCURLY ->
+              let _v = _menhir_action_090 () in
+              _menhir_run_065 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_004 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_TEXT (_menhir_stack, _v, _startpos_1, _endpos) in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | TEXT _v_2 ->
+                      let _startpos_3 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_4 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_text_, _startpos_text_, text) = (_endpos_4, _startpos_3, _v_2) in
+                      let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+                      _menhir_run_053 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | NAT _v_6 ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_6 MenhirState007
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | ID _v_7 ->
+                      let _startpos_8 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_9 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_id_, _startpos_id_, id) = (_endpos_9, _startpos_8, _v_7) in
+                      let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+                      _menhir_run_053 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState007
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos_1, _v) in
+                  let _v = _menhir_action_125 _endpos_s_ _startpos_s_ s in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | NAT _v ->
+              let _startpos_11 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_NAT (_menhir_stack, _v, _startpos_11, _endpos) in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | TEXT _v_12 ->
+                      let _startpos_13 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_14 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_text_, _startpos_text_, text) = (_endpos_14, _startpos_13, _v_12) in
+                      let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+                      _menhir_run_056 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | NAT _v_16 ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_16 MenhirState055
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | ID _v_17 ->
+                      let _startpos_18 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_19 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_id_, _startpos_id_, id) = (_endpos_19, _startpos_18, _v_17) in
+                      let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+                      _menhir_run_056 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState055
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos_11, _v) in
+                  let _v = _menhir_action_123 _endpos_n_ _startpos_n_ n in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | ID _v ->
+              let _startpos_21 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_ID (_menhir_stack, _v, _startpos_21, _endpos) in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | TEXT _v_22 ->
+                      let _startpos_23 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_24 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_text_, _startpos_text_, text) = (_endpos_24, _startpos_23, _v_22) in
+                      let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+                      _menhir_run_059 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | NAT _v_26 ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_26 MenhirState058
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | ID _v_27 ->
+                      let _startpos_28 = _menhir_lexbuf.Lexing.lex_start_p in
+                      let _endpos_29 = _menhir_lexbuf.Lexing.lex_curr_p in
+                      let _tok = _menhir_lexer _menhir_lexbuf in
+                      let (_endpos_id_, _startpos_id_, id) = (_endpos_29, _startpos_28, _v_27) in
+                      let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+                      _menhir_run_059 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState058
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_21, _v) in
+                  let _v = _menhir_action_124 _endpos_id_ _startpos_id_ id in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_053 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_TEXT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_TEXT (_menhir_stack, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_122 _endpos_s_ _endpos_v_ _startpos_s_ s v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_goto_variant_value : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | RCURLY ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+          let MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+          let (_endpos__4_, f) = (_endpos, _v) in
+          let _v = _menhir_action_105 _endpos__4_ _startpos__1_ f in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_value : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_067_spec_072 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState001 ->
+          _menhir_run_067_spec_001 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState063 ->
+          _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState003 ->
+          _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState058 ->
+          _menhir_run_059 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState055 ->
+          _menhir_run_056 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState007 ->
+          _menhir_run_053 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState051 ->
+          _menhir_run_047_spec_051 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState013 ->
+          _menhir_run_047_spec_013 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState045 ->
+          _menhir_run_046 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState042 ->
+          _menhir_run_043 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState015 ->
+          _menhir_run_040 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState019 ->
+          _menhir_run_037 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_067_spec_072 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_annval -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let v = _v in
+      let _v = _menhir_action_010 v in
+      _menhir_run_071 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState072 _tok
+  
+  and _menhir_run_071 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COMMA ->
+          let _menhir_stack = MenhirCell1_annval (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | TEXT _v_0 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos, _v_0) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_067_spec_072 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | NAT _v_2 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState072
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | ID _v_3 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v_3) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_067_spec_072 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | RPAR ->
+              let _v = _menhir_action_069 () in
+              _menhir_run_073 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RPAR ->
+          let x = _v in
+          let _v = _menhir_action_070 x in
+          _menhir_goto_seplist_annval_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_009 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_107 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | ID _v ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_id_, _startpos_id_, id, _startpos__1_) = (_endpos, _startpos_1, _v, _startpos) in
+          let _v = _menhir_action_106 _endpos_id_ _startpos__1_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_012 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | TEXT _v ->
+              _menhir_run_014 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | NAT _v ->
+              _menhir_run_041 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | ID _v ->
+              _menhir_run_044 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | RCURLY ->
+              let _v = _menhir_action_075 () in
+              _menhir_run_048 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_014 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EQ ->
+          let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | TEXT _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos_2, _startpos_1, _v_0) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_040 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | NAT _v_4 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_4 MenhirState015
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | ID _v_5 ->
+              let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_7, _startpos_6, _v_5) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_040 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState015
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos_text_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_040 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_032 _endpos_s_ _endpos_v_ _startpos_s_ s v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_field_value : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      _menhir_run_050 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_050 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_field_value (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | TEXT _v ->
+              _menhir_run_014 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState051
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | NAT _v ->
+              _menhir_run_041 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState051
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | ID _v ->
+              _menhir_run_044 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState051
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | RCURLY ->
+              let _v = _menhir_action_075 () in
+              _menhir_run_052 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_076 x in
+          _menhir_goto_seplist_field_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_016 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos_1, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_113 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | ID _v ->
+          let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_3 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_id_, _startpos_id_, id, _startpos__1_) = (_endpos_3, _startpos_2, _v, _startpos) in
+          let _v = _menhir_action_112 _endpos_id_ _startpos__1_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_019 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | VARIANT ->
+          _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos_0, _v) in
+          let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+          _menhir_run_037 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+      | SERVICE ->
+          _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | RECORD ->
+          _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | PRINCIPAL ->
+          _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | OPT ->
+          _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | NAT _v ->
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState019
+      | MINUS ->
+          _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | ID _v ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_1, _v) in
+          let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+          _menhir_run_037 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+      | FUNC ->
+          _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | BLOB ->
+          _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState019
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_037 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_OPT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_100 _endpos_v_ _startpos__1_ v in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_v_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_020 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | PERIOD ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_021 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | COMMA | RCURLY | RPAR | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_050 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_021 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | NAT _v ->
+          let _menhir_stack = MenhirCell0_PERIOD (_menhir_stack, _endpos) in
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState021
+      | COMMA | RCURLY | RPAR | SEMICOLON ->
+          let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _) = _menhir_stack in
+          let _endpos__2_ = _endpos in
+          let _v = _menhir_action_049 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__2_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_num : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_039_spec_072 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState001 ->
+          _menhir_run_039_spec_001 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState003 ->
+          _menhir_run_039_spec_003 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState063 ->
+          _menhir_run_039_spec_063 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState058 ->
+          _menhir_run_039_spec_058 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState055 ->
+          _menhir_run_039_spec_055 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState007 ->
+          _menhir_run_039_spec_007 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState051 ->
+          _menhir_run_039_spec_051 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState013 ->
+          _menhir_run_039_spec_013 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState045 ->
+          _menhir_run_039_spec_045 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState042 ->
+          _menhir_run_039_spec_042 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState015 ->
+          _menhir_run_039_spec_015 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState019 ->
+          _menhir_run_039_spec_019 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState023 ->
+          _menhir_run_024 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState021 ->
+          _menhir_run_022 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_039_spec_072 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_annval -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_067_spec_072 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_039_spec_001 : type  ttv_stack. ttv_stack _menhir_cell0_LPAR -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_067_spec_001 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_067_spec_001 : type  ttv_stack. ttv_stack _menhir_cell0_LPAR -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let v = _v in
+      let _v = _menhir_action_010 v in
+      _menhir_run_071 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState001 _tok
+  
+  and _menhir_run_039_spec_003 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VEC _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v MenhirState003 _tok
+  
+  and _menhir_run_062 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_value (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | TEXT _v_1 ->
+              let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_3 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos_3, _startpos_2, _v_1) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos_text_ _v MenhirState063 _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | NAT _v_5 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_5 MenhirState063
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | ID _v_6 ->
+              let _startpos_7 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_8 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_8, _startpos_7, _v_6) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v MenhirState063 _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | RCURLY ->
+              let _v = _menhir_action_090 () in
+              _menhir_run_064 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_091 x in
+          _menhir_goto_seplist_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_023 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_MINUS (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | NAT _v ->
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState023
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_026 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | PERIOD ->
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | TEXT _v_2 ->
+                  let _startpos_3 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_4 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_s_, _startpos_s_, s, _startpos__1_, _endpos_s_inlined1_, _startpos_s_inlined1_, s_inlined1) = (_endpos, _startpos_0, _v, _startpos, _endpos_4, _startpos_3, _v_2) in
+                  let _v = _menhir_action_111 _endpos_s_ _endpos_s_inlined1_ _startpos__1_ _startpos_s_ _startpos_s_inlined1_ s s_inlined1 in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_inlined1_ _startpos__1_ _v _menhir_s _tok
+              | ID _v_5 ->
+                  let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos_7, _startpos_6, _v_5, _endpos, _startpos_0, _v, _startpos) in
+                  let _v = _menhir_action_110 _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | ID _v ->
+          let _startpos_8 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | PERIOD ->
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | TEXT _v_10 ->
+                  let _startpos_11 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_12 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_8, _v, _endpos_12, _startpos_11, _v_10, _startpos) in
+                  let _v = _menhir_action_109 _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+              | ID _v_13 ->
+                  let _startpos_14 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_15 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _startpos__1_, _endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) = (_endpos, _startpos_8, _v, _startpos, _endpos_15, _startpos_14, _v_13) in
+                  let _v = _menhir_action_108 _endpos_id_ _endpos_id_inlined1_ _startpos__1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_inlined1_ _startpos__1_ _v _menhir_s _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_035 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_text_, text, _startpos__1_) = (_endpos_1, _v, _startpos) in
+          let _v = _menhir_action_102 _endpos_text_ _startpos__1_ text in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_064 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_value (_menhir_stack, _menhir_s, x, _, _) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_092 x xs in
+      _menhir_goto_seplist_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_value_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState003 ->
+          _menhir_run_065 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState063 ->
+          _menhir_run_064 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_065 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VEC _menhir_cell0_LCURLY -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__4_, vs) = (_endpos, _v) in
+      let _v = _menhir_action_101 _endpos__4_ _startpos__1_ vs in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_039_spec_063 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v MenhirState063 _tok
+  
+  and _menhir_run_039_spec_058 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_ID -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_059 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_059 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_ID -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_ID (_menhir_stack, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_121 _endpos_id_ _endpos_v_ _startpos_id_ id v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_039_spec_055 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_NAT -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_056 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_056 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_NAT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_NAT (_menhir_stack, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_120 _endpos_n_ _endpos_v_ _startpos_n_ n v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_039_spec_007 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_TEXT -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_053 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_039_spec_051 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_047_spec_051 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _tok
+  
+  and _menhir_run_047_spec_051 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let (_endpos_v_, _startpos_v_, v) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_033 _endpos_v_ _startpos_v_ v in
+      _menhir_run_050 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState051 _tok
+  
+  and _menhir_run_039_spec_013 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_047_spec_013 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _tok
+  
+  and _menhir_run_047_spec_013 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let (_endpos_v_, _startpos_v_, v) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_033 _endpos_v_ _startpos_v_ v in
+      _menhir_run_050 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013 _tok
+  
+  and _menhir_run_039_spec_045 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_046 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_046 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_031 _endpos_id_ _endpos_v_ _startpos_id_ id v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_039_spec_042 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_043 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_043 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_030 _endpos_n_ _endpos_v_ _startpos_n_ n v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_039_spec_015 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_040 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_039_spec_019 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_OPT -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let _v =
+        let n = _v in
+        _menhir_action_097 n
+      in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_run_037 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _v _tok
+  
+  and _menhir_run_024 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_MINUS -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_MINUS (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_n_, n) = (_endpos, _v) in
+      let _v = _menhir_action_096 n in
+      let (_endpos, _startpos) = (_endpos_n_, _startpos__1_) in
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+  
+  and _menhir_run_022 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT _menhir_cell0_PERIOD -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_PERIOD (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _) = _menhir_stack in
+      let (_endpos_n2_, n2) = (_endpos, _v) in
+      let _v = _menhir_action_048 n n2 in
+      _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n2_ _startpos_n_ _v _menhir_s _tok
+  
+  and _menhir_run_041 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | PERIOD ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_021 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | EQ ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | TEXT _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos_2, _startpos_1, _v_0) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_043 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | NAT _v_4 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_4 MenhirState042
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | ID _v_5 ->
+              let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_7, _startpos_6, _v_5) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_043 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState042
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_050 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_044 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EQ ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | TEXT _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos_2, _startpos_1, _v_0) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_046 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _v _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | NAT _v_4 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_4 MenhirState045
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | ID _v_5 ->
+              let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_7, _startpos_6, _v_5) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_046 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _v _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState045
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_052 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_field_value (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_077 x xs in
+      _menhir_goto_seplist_field_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_field_value_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState051 ->
+          _menhir_run_052 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState013 ->
+          _menhir_run_048 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_048 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__4_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_104 _endpos__4_ _startpos__1_ fs in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+  
+  let rec _menhir_run_000 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LPAR (_menhir_stack, _startpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | TEXT _v ->
+              let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos_0, _v) in
+              let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+              _menhir_run_067_spec_001 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState001
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | ID _v ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_1, _v) in
+              let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+              _menhir_run_067_spec_001 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | RPAR ->
+              let _v = _menhir_action_069 () in
+              _menhir_run_068 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_208 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_endlist_def_SEMICOLON_ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v ->
+      let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+      let MenhirCell1_endlist_def_SEMICOLON_ (_menhir_stack, _, tdecs, _startpos_tdecs_, _endpos_tdecs_) = _menhir_stack in
+      let (_endpos__3_, _startpos__3_, _endpos_tests_, _startpos_tests_, tests) = (_endpos_1, _startpos_0, _endpos, _startpos, _v) in
+      let _v = _menhir_action_061 _endpos__3_ _endpos_tdecs_ _endpos_tests_ _startpos__3_ _startpos_tdecs_ _startpos_tests_ tdecs tests in
+      MenhirBox_parse_tests _v
+  
+  let rec _menhir_goto_actor : type  ttv_stack. (ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | EOF ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let MenhirCell1_seplist_def_SEMICOLON_ (_menhir_stack, _, ds, _startpos_ds_, _endpos_ds_) = _menhir_stack in
+          let (_endpos__3_, _startpos__3_, _endpos_actor_, _startpos_actor_, actor) = (_endpos_1, _startpos_0, _endpos, _startpos, _v) in
+          let _v = _menhir_action_060 _endpos__3_ _endpos_actor_ _endpos_ds_ _startpos__3_ _startpos_actor_ _startpos_ds_ actor ds in
+          MenhirBox_parse_prog _v
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_170 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_ID -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_ID (_menhir_stack, _, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_005 _endpos_id_ _startpos_id_ id in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let rec _menhir_run_207 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_test _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_test (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_089 x xs in
+      _menhir_goto_seplist_test_SEMICOLON_ _menhir_stack _menhir_lexbuf _endpos_xs_ _startpos_x_ _v _menhir_s
+  
+  and _menhir_goto_seplist_test_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState187 ->
+          _menhir_run_208 _menhir_stack _menhir_lexbuf _endpos _startpos _v
+      | MenhirState206 ->
+          _menhir_run_207 _menhir_stack _menhir_lexbuf _endpos _v
+      | _ ->
+          _menhir_fail ()
+  
+  let rec _menhir_run_178 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_class_typ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_actor_class_typ (_menhir_stack, _, t) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_006 t in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let rec _menhir_goto_actor_class_typ : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_actor_class_typ (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_x_, x) = (_endpos, ()) in
+          let _ = _menhir_action_052 x in
+          _menhir_run_178 _menhir_stack _menhir_lexbuf _endpos_x_ _tok
+      | EOF ->
+          let _ = _menhir_action_051 () in
+          _menhir_run_178 _menhir_stack _menhir_lexbuf _endpos _tok
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_176 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_typ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_actor_typ (_menhir_stack, _, tys, _startpos_tys_, _endpos_tys_) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_004 _endpos_tys_ _startpos_tys_ tys in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let rec _menhir_run_175 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_actor_typ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_x_, x) = (_endpos_0, ()) in
+          let _ = _menhir_action_052 x in
+          _menhir_run_176 _menhir_stack _menhir_lexbuf _endpos_x_ _tok
+      | EOF ->
+          let _ = _menhir_action_051 () in
+          _menhir_run_176 _menhir_stack _menhir_lexbuf _endpos _tok
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_174 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _menhir_s, args, _startpos_args_) = _menhir_stack in
+      let (_endpos_tys_, _startpos_tys_, tys) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_007 _endpos_tys_ _startpos_args_ _startpos_tys_ args tys in
+      _menhir_goto_actor_class_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+  
+  let rec _menhir_run_076 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_TYPE (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | ID _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_ID (_menhir_stack, _v, _startpos_0, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | EQ ->
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | VEC ->
+                  _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | VARIANT ->
+                  _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | SERVICE ->
+                  _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | RECORD ->
+                  _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | PRINCIPAL ->
+                  let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let _v_3 =
+                    let (_endpos__1_, _startpos__1_) = (_endpos_2, _startpos_1) in
+                    _menhir_action_068 _endpos__1_ _startpos__1_
+                  in
+                  let (_endpos_t_, t) = (_endpos_2, _v_3) in
+                  let _v = _menhir_action_021 t in
+                  _menhir_run_160 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+              | OPT ->
+                  _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | ID _v_5 ->
+                  let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let _v_8 =
+                    let (_endpos_id_, _startpos_id_, id) = (_endpos_7, _startpos_6, _v_5) in
+                    _menhir_action_062 _endpos_id_ _startpos_id_ id
+                  in
+                  let (_endpos_t_, t) = (_endpos_7, _v_8) in
+                  let _v = _menhir_action_022 t in
+                  _menhir_run_160 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+              | FUNC ->
+                  _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState078
+              | BLOB ->
+                  let _startpos_10 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_11 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let _v_12 =
+                    let (_endpos__1_, _startpos__1_) = (_endpos_11, _startpos_10) in
+                    _menhir_action_019 _endpos__1_ _startpos__1_
+                  in
+                  let (_endpos_t_, t) = (_endpos_11, _v_12) in
+                  let _v = _menhir_action_020 t in
+                  _menhir_run_160 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_079 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | PRINCIPAL ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_0) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_021 t in
+          _menhir_run_159 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | ID _v ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_1, _v) in
+            _menhir_action_062 _endpos_id_ _startpos_id_ id
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_022 t in
+          _menhir_run_159 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState079
+      | BLOB ->
+          let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_2) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_020 t in
+          _menhir_run_159 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_080 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_082 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | NAT _v ->
+              _menhir_run_150 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | ID _v ->
+              _menhir_run_151 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | RCURLY ->
+              let _v = _menhir_action_093 () in
+              _menhir_run_156 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_082 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_083 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_117 _endpos_s_ _startpos_s_ s in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_083 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | PRINCIPAL ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_021 t in
+          _menhir_run_149 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | ID _v ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+            _menhir_action_062 _endpos_id_ _startpos_id_ id
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_022 t in
+          _menhir_run_149 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState083
+      | BLOB ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_020 t in
+          _menhir_run_149 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_084 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_SERVICE (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState084
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_085 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_LCURLY (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          _menhir_run_086 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState085
+      | ID _v ->
+          _menhir_run_139 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState085
+      | RCURLY ->
+          let _v = _menhir_action_078 () in
+          _menhir_run_143 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_086 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState087
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s) = (_endpos_2, _startpos_1, _v_0, _endpos, _startpos, _v) in
+              let _v = _menhir_action_047 _endpos_id_ _endpos_s_ _startpos_id_ _startpos_s_ id s in
+              _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_088 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_LPAR (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | TEXT _v ->
+          _menhir_run_089 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState088
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | PRINCIPAL ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_0) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let t = _v in
+          let _v = _menhir_action_021 t in
+          _menhir_run_136_spec_088 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | ID _v ->
+          _menhir_run_128 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState088
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | BLOB ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_1) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let t = _v in
+          let _v = _menhir_action_020 t in
+          _menhir_run_136_spec_088 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | RPAR ->
+          let _v = _menhir_action_081 () in
+          _menhir_run_131 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_089 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | PRINCIPAL ->
+              let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_2 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_1, _startpos_0) in
+                _menhir_action_068 _endpos__1_ _startpos__1_
+              in
+              let t = _v_2 in
+              let _v = _menhir_action_021 t in
+              _menhir_run_127 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | ID _v_4 ->
+              let _startpos_5 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_6 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_7 =
+                let (_endpos_id_, _startpos_id_, id) = (_endpos_6, _startpos_5, _v_4) in
+                _menhir_action_062 _endpos_id_ _startpos_id_ id
+              in
+              let t = _v_7 in
+              let _v = _menhir_action_022 t in
+              _menhir_run_127 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState090
+          | BLOB ->
+              let _startpos_9 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_10 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_11 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_10, _startpos_9) in
+                _menhir_action_019 _endpos__1_ _startpos__1_
+              in
+              let t = _v_11 in
+              let _v = _menhir_action_020 t in
+              _menhir_run_127 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_091 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | TEXT _v ->
+              _menhir_run_093 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | PRINCIPAL ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v =
+                let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_1) in
+                _menhir_action_068 _endpos__1_ _startpos__1_
+              in
+              let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos_1, _v) in
+              let _v = _menhir_action_021 t in
+              _menhir_run_125_spec_092 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _tok
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | NAT _v ->
+              _menhir_run_113 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | ID _v ->
+              _menhir_run_116 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | BLOB ->
+              let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v =
+                let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_2) in
+                _menhir_action_019 _endpos__1_ _startpos__1_
+              in
+              let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos_2, _v) in
+              let _v = _menhir_action_020 t in
+              _menhir_run_125_spec_092 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _tok
+          | RCURLY ->
+              let _v = _menhir_action_084 () in
+              _menhir_run_119 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_093 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          _menhir_run_083 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_125_spec_092 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_064 _endpos_t_ _startpos_t_ t in
+      _menhir_run_121 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092 _tok
+  
+  and _menhir_run_121 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_record_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | TEXT _v_0 ->
+              _menhir_run_093 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState122
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | PRINCIPAL ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_2 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_1, _startpos) in
+                _menhir_action_068 _endpos__1_ _startpos__1_
+              in
+              let (_endpos_t_, _startpos_t_, t) = (_endpos_1, _startpos, _v_2) in
+              let _v = _menhir_action_021 t in
+              _menhir_run_125_spec_122 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _tok
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | NAT _v_4 ->
+              _menhir_run_113 _menhir_stack _menhir_lexbuf _menhir_lexer _v_4 MenhirState122
+          | ID _v_5 ->
+              _menhir_run_116 _menhir_stack _menhir_lexbuf _menhir_lexer _v_5 MenhirState122
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | BLOB ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_6 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_7 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_6, _startpos) in
+                _menhir_action_019 _endpos__1_ _startpos__1_
+              in
+              let (_endpos_t_, _startpos_t_, t) = (_endpos_6, _startpos, _v_7) in
+              let _v = _menhir_action_020 t in
+              _menhir_run_125_spec_122 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _tok
+          | RCURLY ->
+              let _v = _menhir_action_084 () in
+              _menhir_run_123 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_085 x in
+          _menhir_goto_seplist_record_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_125_spec_122 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_064 _endpos_t_ _startpos_t_ t in
+      _menhir_run_121 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState122 _tok
+  
+  and _menhir_run_095 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | PRINCIPAL ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_0) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_021 t in
+          _menhir_run_111 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | ID _v ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_1, _v) in
+            _menhir_action_062 _endpos_id_ _startpos_id_ id
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_022 t in
+          _menhir_run_111 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState095
+      | BLOB ->
+          let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_2) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_020 t in
+          _menhir_run_111 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_111 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_OPT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_015 _endpos_t_ _startpos__1_ t in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_cons_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_020 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_goto_data_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState078 ->
+          _menhir_run_160 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState079 ->
+          _menhir_run_159 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState083 ->
+          _menhir_run_149 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState088 ->
+          _menhir_run_136_spec_088 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState134 ->
+          _menhir_run_136_spec_134 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState129 ->
+          _menhir_run_130 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState090 ->
+          _menhir_run_127 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState092 ->
+          _menhir_run_125_spec_092 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState122 ->
+          _menhir_run_125_spec_122 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState117 ->
+          _menhir_run_118 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState114 ->
+          _menhir_run_115 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState095 ->
+          _menhir_run_111 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_160 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TYPE _menhir_cell0_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_ID (_menhir_stack, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let MenhirCell1_TYPE (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_023 _endpos_id_ _endpos_t_ _startpos__1_ _startpos_id_ id t in
+      _menhir_goto_def _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_def : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState185 ->
+          _menhir_run_210 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState211 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState183 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState075 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_210 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_def (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TYPE ->
+              _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState211
+          | IMPORT ->
+              _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState211
+          | EOF | ID _ ->
+              let _v = _menhir_action_072 () in
+              _menhir_run_212 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_161 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_024 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_def _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_212 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_def _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_def (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_026 x xs in
+      _menhir_run_187 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_xs_ _startpos_x_ _v _menhir_s _tok
+  
+  and _menhir_run_187 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_endlist_def_SEMICOLON_ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | ID _v_0 ->
+          _menhir_run_188 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState187
+      | EOF ->
+          let _v = _menhir_action_087 () in
+          _menhir_run_208 _menhir_stack _menhir_lexbuf _endpos _endpos _v
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_188 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v_0 ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s) = (_endpos_2, _startpos_1, _v_0) in
+          let _v = _menhir_action_042 _endpos_s_ _startpos_s_ s in
+          _menhir_run_192 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState188 _tok
+      | BLOB ->
+          _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState188
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_192 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID as 'stack) -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | NOTEQ ->
+          let _menhir_stack = MenhirCell1_input (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v_0 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos, _v_0) in
+              let _v = _menhir_action_042 _endpos_s_ _startpos_s_ s in
+              _menhir_run_194 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | BLOB ->
+              _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState193
+          | _ ->
+              _eRR ())
+      | NOTCOLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let input = _v in
+          let _v = _menhir_action_012 input in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | EQQ ->
+          let _menhir_stack = MenhirCell1_input (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v_2 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos, _v_2) in
+              let _v = _menhir_action_042 _endpos_s_ _startpos_s_ s in
+              _menhir_run_198 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | BLOB ->
+              _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState197
+          | _ ->
+              _eRR ())
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let input = _v in
+          let _v = _menhir_action_011 input in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_194 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell1_input (_menhir_stack, _menhir_s, i1) = _menhir_stack in
+          let i2 = _v in
+          let _v = _menhir_action_014 i1 i2 in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_assertion : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID as 'stack) -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_assertion (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState201
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_190 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let text = _v in
+          let _v = _menhir_action_043 text in
+          _menhir_goto_input _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_input : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState197 ->
+          _menhir_run_198 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState193 ->
+          _menhir_run_194 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState188 ->
+          _menhir_run_192 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_198 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell1_input (_menhir_stack, _menhir_s, i1) = _menhir_stack in
+          let i2 = _v in
+          let _v = _menhir_action_013 i1 i2 in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_182 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_def (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TYPE ->
+              _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState183
+          | IMPORT ->
+              _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState183
+          | EOF | ID _ | SERVICE ->
+              let _v = _menhir_action_072 () in
+              _menhir_run_184 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+          | _ ->
+              _eRR ())
+      | EOF | ID _ | SERVICE ->
+          let (_endpos_x_, _startpos_x_, x) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_073 x in
+          _menhir_goto_seplist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_x_ _startpos_x_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_184 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_def _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_def (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_074 x xs in
+      _menhir_goto_seplist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_xs_ _startpos_x_ _v _menhir_s _tok
+  
+  and _menhir_goto_seplist_def_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState211 ->
+          _menhir_run_212 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState183 ->
+          _menhir_run_184 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState075 ->
+          _menhir_run_163 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_163 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_seplist_def_SEMICOLON_ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SERVICE ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_SERVICE (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | ID _v_1 ->
+              let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_3 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_3, _startpos_2, _v_1) in
+              let _v = _menhir_action_041 _endpos_id_ _startpos_id_ id in
+              _menhir_goto_id_opt _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | COLON ->
+              let _v = _menhir_action_040 () in
+              _menhir_goto_id_opt _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | _ ->
+              _eRR ())
+      | EOF ->
+          let _v = _menhir_action_003 () in
+          _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_id_opt : type  ttv_stack. (ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let _menhir_stack = MenhirCell0_id_opt (_menhir_stack, _v) in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState167
+          | LCURLY ->
+              _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState167
+          | ID _v_0 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _menhir_stack = MenhirCell1_ID (_menhir_stack, MenhirState167, _v_0, _startpos, _endpos) in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | SEMICOLON ->
+                  let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_x_, x) = (_endpos_1, ()) in
+                  let _ = _menhir_action_052 x in
+                  _menhir_run_170 _menhir_stack _menhir_lexbuf _endpos_x_ _tok
+              | EOF ->
+                  let _ = _menhir_action_051 () in
+                  _menhir_run_170 _menhir_stack _menhir_lexbuf _endpos _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_159 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_VEC -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_016 _endpos_t_ _startpos__1_ t in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_149 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_029 _endpos_s_ _endpos_t_ _startpos_s_ s t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_field_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState081 ->
+          _menhir_run_155_spec_081 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState153 ->
+          _menhir_run_155_spec_153 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState092 ->
+          _menhir_run_124_spec_092 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState122 ->
+          _menhir_run_124_spec_122 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_155_spec_081 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_VARIANT _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let f = _v in
+      let _v = _menhir_action_115 f in
+      _menhir_run_152 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081 _tok
+  
+  and _menhir_run_152 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_variant_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_082 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState153
+          | NAT _v ->
+              _menhir_run_150 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState153
+          | ID _v ->
+              _menhir_run_151 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState153
+          | RCURLY ->
+              let _v = _menhir_action_093 () in
+              _menhir_run_154 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_094 x in
+          _menhir_goto_seplist_variant_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_150 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_114 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_118 _endpos_n_ _startpos_n_ n in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_114 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_NAT -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | PRINCIPAL ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_021 t in
+          _menhir_run_115 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | ID _v ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+            _menhir_action_062 _endpos_id_ _startpos_id_ id
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_022 t in
+          _menhir_run_115 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState114
+      | BLOB ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_020 t in
+          _menhir_run_115 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_115 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_NAT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_027 _endpos_n_ _endpos_t_ _startpos_n_ n t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_097 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_FUNC (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState097
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_variant_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      _menhir_run_152 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_151 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_117 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_116 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_117 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | PRINCIPAL ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_068 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_021 t in
+          _menhir_run_118 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | ID _v ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+            _menhir_action_062 _endpos_id_ _startpos_id_ id
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_022 t in
+          _menhir_run_118 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState117
+      | BLOB ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let _v =
+            let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+            _menhir_action_019 _endpos__1_ _startpos__1_
+          in
+          let (_endpos_t_, t) = (_endpos, _v) in
+          let _v = _menhir_action_020 t in
+          _menhir_run_118 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_118 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_028 _endpos_id_ _endpos_t_ _startpos_id_ id t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_154 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_variant_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_variant_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_095 x xs in
+      _menhir_goto_seplist_variant_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_variant_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState081 ->
+          _menhir_run_156 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState153 ->
+          _menhir_run_154 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_156 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_VARIANT _menhir_cell0_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let (_endpos__3_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_119 fs in
+      let _endpos = _endpos__3_ in
+      let MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_fs_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_018 _endpos_fs_ _startpos__1_ fs in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_fs_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_155_spec_153 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_variant_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let f = _v in
+      let _v = _menhir_action_115 f in
+      _menhir_run_152 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState153 _tok
+  
+  and _menhir_run_124_spec_092 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let f = _v in
+      let _v = _menhir_action_063 f in
+      _menhir_run_121 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092 _tok
+  
+  and _menhir_run_124_spec_122 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let f = _v in
+      let _v = _menhir_action_063 f in
+      _menhir_run_121 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState122 _tok
+  
+  and _menhir_run_136_spec_088 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_LPAR -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let t = _v in
+      let _v = _menhir_action_055 t in
+      _menhir_run_133 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState088 _tok
+  
+  and _menhir_run_133 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COMMA ->
+          let _menhir_stack = MenhirCell1_param_typ (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | TEXT _v_0 ->
+              _menhir_run_089 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState134
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | PRINCIPAL ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_1 =
+                let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+                _menhir_action_068 _endpos__1_ _startpos__1_
+              in
+              let t = _v_1 in
+              let _v = _menhir_action_021 t in
+              _menhir_run_136_spec_134 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | ID _v_3 ->
+              _menhir_run_128 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3 MenhirState134
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | BLOB ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_4 =
+                let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+                _menhir_action_019 _endpos__1_ _startpos__1_
+              in
+              let t = _v_4 in
+              let _v = _menhir_action_020 t in
+              _menhir_run_136_spec_134 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | RPAR ->
+              let _v = _menhir_action_081 () in
+              _menhir_run_135 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RPAR ->
+          let x = _v in
+          let _v = _menhir_action_082 x in
+          _menhir_goto_seplist_param_typ_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_136_spec_134 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_param_typ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let t = _v in
+      let _v = _menhir_action_055 t in
+      _menhir_run_133 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState134 _tok
+  
+  and _menhir_run_128 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | PRINCIPAL ->
+              let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_2 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_1, _startpos_0) in
+                _menhir_action_068 _endpos__1_ _startpos__1_
+              in
+              let t = _v_2 in
+              let _v = _menhir_action_021 t in
+              _menhir_run_130 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | ID _v_4 ->
+              let _startpos_5 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_6 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_7 =
+                let (_endpos_id_, _startpos_id_, id) = (_endpos_6, _startpos_5, _v_4) in
+                _menhir_action_062 _endpos_id_ _startpos_id_ id
+              in
+              let t = _v_7 in
+              let _v = _menhir_action_022 t in
+              _menhir_run_130 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState129
+          | BLOB ->
+              let _startpos_9 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_10 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let _v_11 =
+                let (_endpos__1_, _startpos__1_) = (_endpos_10, _startpos_9) in
+                _menhir_action_019 _endpos__1_ _startpos__1_
+              in
+              let t = _v_11 in
+              let _v = _menhir_action_020 t in
+              _menhir_run_130 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | _ ->
+              _eRR ())
+      | COMMA | RPAR ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_062 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_prim_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_130 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let t = _v in
+      let _v = _menhir_action_056 _endpos_id_ _startpos_id_ id t in
+      _menhir_goto_param_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_param_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      _menhir_run_133 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_prim_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_022 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_run_135 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_param_typ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell1_param_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_083 x xs in
+      _menhir_goto_seplist_param_typ_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_param_typ_COMMA_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState134 ->
+          _menhir_run_135 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState088 ->
+          _menhir_run_131 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_131 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_LPAR -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell1_LPAR (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let fs = _v in
+      let _v = _menhir_action_058 fs in
+      _menhir_goto_param_typs _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_param_typs : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState201 ->
+          _menhir_run_202 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState167 ->
+          _menhir_run_171 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState099 ->
+          _menhir_run_100 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState140 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState087 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState097 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_202 : type  ttv_stack. (((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v_0 ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos_1, _v_0) in
+          let _v = _menhir_action_054 _endpos_s_ _startpos_s_ s in
+          _menhir_goto_option_text_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _v _tok
+      | EOF | SEMICOLON ->
+          let _v = _menhir_action_053 () in
+          _menhir_goto_option_text_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_option_text_ : type  ttv_stack. (((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion, _menhir_box_parse_tests) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _, tys, _) = _menhir_stack in
+      let MenhirCell1_assertion (_menhir_stack, _, assertion) = _menhir_stack in
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_desc_, desc) = (_endpos, _v) in
+      let _v = _menhir_action_098 _endpos_desc_ _endpos_id_ _startpos_id_ assertion desc id tys in
+      let (_endpos, _startpos) = (_endpos_desc_, _startpos_id_) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_test (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | ID _v ->
+              _menhir_run_188 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState206
+          | EOF ->
+              let _v = _menhir_action_087 () in
+              _menhir_run_207 _menhir_stack _menhir_lexbuf _endpos _v
+          | _ ->
+              _eRR ())
+      | EOF ->
+          let (_endpos_x_, _startpos_x_, x) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_088 x in
+          _menhir_goto_seplist_test_SEMICOLON_ _menhir_stack _menhir_lexbuf _endpos_x_ _startpos_x_ _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_171 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | ARROW ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LCURLY ->
+              let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+              _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState172
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _startpos_args_, args) = (_endpos, _startpos_1, _v_0, _startpos, _v) in
+              let _v = _menhir_action_008 _endpos_id_ _startpos_args_ _startpos_id_ args id in
+              _menhir_goto_actor_class_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_100 : type  ttv_stack ttv_result. ((ttv_stack, ttv_result) _menhir_cell1_param_typs as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | QUERY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_0) in
+          let _v = _menhir_action_035 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState100 _tok
+      | ONEWAY ->
+          let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_2) in
+          let _v = _menhir_action_034 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState100 _tok
+      | COMPOSITE_QUERY ->
+          let _startpos_4 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos_4) in
+          let _v = _menhir_action_036 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState100 _tok
+      | COMMA | EOF | ID _ | RCURLY | RPAR | SEMICOLON | SERVICE ->
+          let _v = _menhir_action_037 () in
+          _menhir_run_104 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_105 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_func_mode (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | QUERY ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+          let _v = _menhir_action_035 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState105 _tok
+      | ONEWAY ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+          let _v = _menhir_action_034 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState105 _tok
+      | COMPOSITE_QUERY ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+          let _v = _menhir_action_036 _endpos__1_ _startpos__1_ in
+          _menhir_run_105 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v MenhirState105 _tok
+      | COMMA | EOF | ID _ | RCURLY | RPAR | SEMICOLON | SERVICE ->
+          let _v = _menhir_action_037 () in
+          _menhir_run_106 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_106 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_func_mode -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_func_mode (_menhir_stack, _menhir_s, m) = _menhir_stack in
+      let (_endpos_ms_, ms) = (_endpos, _v) in
+      let _v = _menhir_action_038 m ms in
+      _menhir_goto_func_modes_opt _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ms_ _v _menhir_s _tok
+  
+  and _menhir_goto_func_modes_opt : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState105 ->
+          _menhir_run_106 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState100 ->
+          _menhir_run_104 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_104 : type  ttv_stack ttv_result. ((ttv_stack, ttv_result) _menhir_cell1_param_typs, ttv_result) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _, t2, _) = _menhir_stack in
+      let MenhirCell1_param_typs (_menhir_stack, _menhir_s, t1, _startpos_t1_) = _menhir_stack in
+      let (_endpos_ms_, ms) = (_endpos, _v) in
+      let _v = _menhir_action_039 _endpos_ms_ _startpos_t1_ ms t1 t2 in
+      _menhir_goto_func_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ms_ _v _menhir_s _tok
+  
+  and _menhir_goto_func_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState140 ->
+          _menhir_run_142 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState087 ->
+          _menhir_run_138 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState097 ->
+          _menhir_run_107 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_142 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_044 _endpos_id_ _endpos_t_ _startpos_id_ id t in
+      _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_meth_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_meth_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_086 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState146
+          | ID _v ->
+              _menhir_run_139 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState146
+          | RCURLY ->
+              let _v = _menhir_action_078 () in
+              _menhir_run_147 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_079 x in
+          _menhir_goto_seplist_meth_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_139 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState140
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) = (_endpos_2, _startpos_1, _v_0, _endpos, _startpos, _v) in
+              let _v = _menhir_action_046 _endpos_id_ _endpos_id_inlined1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 in
+              _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_147 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_meth_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_meth_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_080 x xs in
+      _menhir_goto_seplist_meth_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_meth_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState146 ->
+          _menhir_run_147 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState085 ->
+          _menhir_run_143 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_143 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell1_LCURLY (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__3_, ds) = (_endpos, _v) in
+      let _v = _menhir_action_009 ds in
+      _menhir_goto_actor_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__3_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_actor_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState167 ->
+          _menhir_run_175 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState172 ->
+          _menhir_run_174 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState084 ->
+          _menhir_run_148 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_148 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_SERVICE -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_SERVICE (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_ts_, ts) = (_endpos, _v) in
+      let _v = _menhir_action_067 _endpos_ts_ _startpos__1_ ts in
+      _menhir_goto_ref_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ts_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_ref_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_021 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_run_138 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_045 _endpos_s_ _endpos_t_ _startpos_s_ s t in
+      _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_107 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_FUNC -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_FUNC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_066 t in
+      _menhir_goto_ref_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_098 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | ARROW ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState099
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_127 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let t = _v in
+      let _v = _menhir_action_057 _endpos_s_ _startpos_s_ s t in
+      _menhir_goto_param_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_113 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          _menhir_run_114 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_116 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_117 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_062 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_prim_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_123 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_record_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_086 x xs in
+      _menhir_goto_seplist_record_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_record_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState122 ->
+          _menhir_run_123 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState092 ->
+          _menhir_run_119 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_119 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let (_endpos__3_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_065 fs in
+      let _endpos = _endpos__3_ in
+      let MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_fs_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_017 _endpos_fs_ _startpos__1_ fs in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_fs_ _startpos__1_ _v _menhir_s _tok
+  
+  let rec _menhir_run_075 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TYPE ->
+          _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState075
+      | IMPORT ->
+          _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState075
+      | EOF | SERVICE ->
+          let _v = _menhir_action_072 () in
+          _menhir_run_163 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _endpos _v MenhirState075 _tok
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_185 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TYPE ->
+          _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState185
+      | IMPORT ->
+          _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState185
+      | EOF | ID _ ->
+          let _v = _menhir_action_025 () in
+          _menhir_run_187 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _endpos _v MenhirState185 _tok
+      | _ ->
+          _eRR ()
+  
+end
+
+let parse_tests =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_tests v = _menhir_run_185 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+let parse_prog =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_prog v = _menhir_run_075 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+let parse_args =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_args v = _menhir_run_000 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+# 290 "idllib/parser.mly"
+  
+
+# 5557 "idllib/parser.ml"
+
+
+
+ + + diff --git a/coverage/idllib/pipeline.ml.html b/coverage/idllib/pipeline.ml.html new file mode 100644 index 00000000000..04121c6c93d --- /dev/null +++ b/coverage/idllib/pipeline.ml.html @@ -0,0 +1,613 @@ + + + + + pipeline.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+
+
open Printf
+
+(* Diagnostics *)
+
+let phase heading name =
+  if !Flags.verbose then printf "-- %s %s:\n%!" heading name
+
+let error at cat text =
+  Error [Diag.error_message at "" cat text]
+
+let print_stat_te =
+  Typing.Env.iter (fun x t ->
+    printf "%s %s = %s\n"
+      "type" x (Arrange_idl.string_of_typ t)
+  )
+
+let dump_prog flag prog =
+    if flag then
+      Wasm.Sexpr.print 80 (Arrange_idl.prog prog)
+
+(* Parsing *)
+
+type rel_path = string
+
+type parse_result = (Syntax.prog * rel_path) Diag.result
+
+let parse_with lexer parser name =
+  try
+    phase "Parsing" name;
+    lexer.Lexing.lex_curr_p <-
+      {lexer.Lexing.lex_curr_p with Lexing.pos_fname = name};
+    let prog = parser Lexer.token lexer name in
+    Ok prog
+  with
+    | Source.ParseError (at, msg) ->
+      error at "syntax" msg
+    | Parser.Error ->
+      error (Lexer.region lexer) "syntax" "unexpected token"
+
+let parse_file filename : parse_result =
+  let ic = open_in filename in
+  let lexer = Lexing.from_channel ic in
+  let parser = Parser.parse_prog in
+  let name = Filename.basename filename in
+  let result = parse_with lexer parser name in
+  close_in ic;
+  match result with
+  | Ok prog ->
+     dump_prog !Flags.dump_parse prog;
+     Diag.return (prog, filename)
+  | Error e -> Error e
+
+let parse_string s : parse_result =
+  let lexer = Lexing.from_string s in
+  let parser = Parser.parse_prog in
+  let result = parse_with lexer parser "source1" in
+  match result with
+  | Ok prog -> Diag.return (prog, "source2")
+  | Error e -> Error e
+
+let parse_file filename : parse_result =
+  try parse_file filename
+  with Sys_error s ->
+    error Source.no_region "file" (sprintf "cannot open \"%s\"" filename)
+
+(* Type checking *)
+
+let check_prog senv prog
+  : (Typing.scope * Syntax.typ option) Diag.result =
+  phase "Checking" prog.Source.note;
+  let r = Typing.check_prog senv prog in
+  (match r with
+   | Ok ((scope, _), _) ->
+      if !Flags.verbose then print_stat_te scope;
+   | Error _ -> ());
+  r
+
+(* Imported file loading *)
+
+type load_result = (Syntax.prog * Typing.scope * Syntax.typ option) Diag.result
+
+module LibEnv = Env.Make(String)
+
+let merge_env imports init_env lib_env =
+  let disjoint_union env1 env2 : Typing.typ_env Diag.result =
+    try Diag.return (Typing.Env.union (fun k v1 v2 ->
+        (* TODO Add proper type equivalence check for env *)
+        if v1 = v2 then Some v1 else raise (Typing.Env.Clash k)
+      ) env1 env2)
+    with Typing.Env.Clash k ->
+      error Source.no_region "import" (sprintf "conflict type definition for %s" k) in
+  let env_list = List.map (fun import -> LibEnv.find import lib_env) imports in
+  Diag.fold disjoint_union init_env env_list
+
+let chase_imports senv imports =
+  let module S = Resolve_import.Set in
+  let pending = ref S.empty in
+  let lib_env = ref LibEnv.empty in
+  let rec go file =
+    if S.mem file !pending then
+      error Source.no_region "import" (sprintf "file %s must not depend on itself" file)
+    else if LibEnv.mem file !lib_env then
+      Diag.return ()
+    else begin
+        pending := S.add file !pending;
+        let open Diag.Syntax in
+        let* prog, base = parse_file file in
+        let* imports = Resolve_import.resolve prog base in
+        let* () = go_set imports in
+        let* base_env = merge_env imports senv !lib_env in
+        let* scope, _ = check_prog base_env prog in
+        lib_env := LibEnv.add file scope !lib_env;
+        pending := S.remove file !pending;
+        Diag.return ()
+      end
+  and go_set todo = Diag.traverse_ go todo
+  in Diag.map (fun () -> !lib_env) (go_set imports)
+
+let load_prog parse senv =
+  let open Diag.Syntax in
+  let* prog, base = parse in
+  let* imports = Resolve_import.resolve prog base in
+  let* lib_env = chase_imports senv imports in
+  let* base_env = merge_env imports senv lib_env in
+  let* scope, actor = check_prog base_env prog in
+  Diag.return (prog, scope, actor)
+
+(* Only type checking *)
+
+let initial_stat_env = Typing.empty_scope
+
+let check_string source : load_result = load_prog (parse_string source) initial_stat_env
+let check_file file : load_result = load_prog (parse_file file) initial_stat_env
+let check_prog prog : Typing.scope Diag.result =
+  let open Diag.Syntax in
+  let* scope, _ = check_prog initial_stat_env prog in
+  Diag.return scope
+
+(* JS Compilation *)
+
+type compile_result = Buffer.t Diag.result
+
+let compile_js_file file : compile_result =
+  let open Diag.Syntax in
+  let* prog, senv, _ = check_file file in
+  phase "JS Compiling" file;
+  Diag.return (Compile_js.compile senv prog)
+
+let compile_js_string source : compile_result =
+  let open Diag.Syntax in
+  let* prog, senv, _ = check_string source in
+  phase "JS Compiling" "source3";
+  Diag.return (Compile_js.compile senv prog)
+
+(* Test file *)
+
+type parse_test_file_result = Syntax.tests Diag.result
+
+let parse_test_file filename : parse_test_file_result =
+  let ic = open_in filename in
+  let lexer = Lexing.from_channel ic in
+  let parser = Parser.parse_tests in
+  let name = Filename.basename filename in
+  let result = parse_with lexer parser name in
+  close_in ic;
+  match result with
+  | Ok prog -> Diag.return prog
+  | Error e -> Error e
+
+(* Values *)
+
+let parse_values s =
+  let lexer = Lexing.from_string s in
+  lexer.Lexing.lex_curr_p <-
+      {lexer.Lexing.lex_curr_p with Lexing.pos_fname = "(string)"};
+  try
+    Diag.return (Parser.parse_args Lexer.token lexer)
+  with
+    | Source.ParseError (at, msg) ->
+      error at "syntax" msg
+    | Parser.Error ->
+      error (Lexer.region lexer) "syntax" "unexpected token"
+
+
+
+ + + diff --git a/coverage/idllib/resolve_import.ml.html b/coverage/idllib/resolve_import.ml.html new file mode 100644 index 00000000000..5a5584d51f3 --- /dev/null +++ b/coverage/idllib/resolve_import.ml.html @@ -0,0 +1,139 @@ + + + + + resolve_import.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
+
type filepath = string
+
+module Set = Set.Make(String)
+
+type env = {
+  msgs : Diag.msg_store;
+  base : filepath Lazy.t;
+  imported : Set.t ref;
+}
+
+open Syntax
+open Source
+
+let rec decs env = List.iter (dec env)
+and dec env d = match d.it with
+  | TypD _ -> ()
+  | ImportD (f, fp) ->
+     let f = if Filename.is_relative f
+             then Filename.concat (Lazy.force env.base) f
+             else f in
+     fp := f;
+     env.imported := Set.add f !(env.imported)
+         
+let prog env p = decs env p.it.decs
+   
+let resolve : Syntax.prog -> filepath -> filepath list Diag.result = fun p base ->
+  Diag.with_message_store (fun msgs ->
+      let base = lazy (if Sys.is_directory base then base else Filename.dirname base) in
+      let env = { msgs; base; imported = ref Set.empty } in
+      prog env p;
+      Some (Set.elements !(env.imported))
+    )
+    
+       
+
+
+
+ + + diff --git a/coverage/idllib/typing.ml.html b/coverage/idllib/typing.ml.html new file mode 100644 index 00000000000..b7c85af9b92 --- /dev/null +++ b/coverage/idllib/typing.ml.html @@ -0,0 +1,802 @@ + + + + + typing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+
+
open Syntax
+open Source
+open Arrange_idl
+
+(* Environments *)
+module FieldEnv = Env.Make(Lib.Uint32)
+module Env = Env.Make(String)
+module TS = Set.Make(String)           
+           
+(* Error recovery *)
+
+exception Recover
+
+let recover_with (x : 'a) (f : 'b -> 'a) (y : 'b) = try f y with Recover -> x
+let recover_opt f y = recover_with None (fun y -> Some (f y)) y
+let _recover f y = recover_with () f y
+
+(* Scopes *)
+
+type typ_env = typ Env.t
+
+type scope = typ_env
+
+let empty_scope : scope = Env.empty;
+
+(* Contexts (internal) *)
+
+type env =
+  { typs : typ_env;
+    msgs : Diag.msg_store;
+    pre: bool;
+  }
+
+let env_of_scope msgs scope =
+  { typs = scope;
+    msgs;
+    pre = false;
+  }
+
+(* Error bookkeeping *)
+
+let type_error at : string -> Diag.message = Diag.error_message at "" "type"
+let type_warning at : string -> Diag.message = Diag.warning_message at "" "type"
+
+let _local_error env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_error at s)) fmt
+let error env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_error at s); raise Recover) fmt
+let _warn env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_warning at s)) fmt
+
+(* Context extension *)
+
+let adjoin env scope =
+  { env with
+    typs = Env.adjoin env.typs scope;
+  }
+
+let disjoint_union env at fmt env1 env2 =
+  try Env.disjoint_union env1 env2
+  with Env.Clash k -> error env at fmt k
+
+(* Types *)
+let hash = IdlHash.idl_hash
+
+let field_id (f: typ_field) =
+  match f.it.label.it with
+  | Id n -> n
+  | Named name -> hash name
+  | Unnamed n -> n
+let field_name (f: typ_field) =
+  match f.it.label.it with
+  | Id n -> Lib.Uint32.to_string n
+  | Named name -> name
+  | Unnamed n -> "Unnamed " ^ (Lib.Uint32.to_string n)
+
+let compare_field (f1: typ_field) (f2: typ_field) = Lib.Uint32.compare (field_id f1) (field_id f2)
+let compare_meth (m1: typ_meth) (m2: typ_meth) = compare m1.it.var m2.it.var
+let find_type env id =
+  match Env.find_opt id.it env.typs with
+  | None -> error env id.at "unbound type identifier %s" id.it
+  | Some t -> t
+let rec as_func env t =
+  match t.it with
+  | FuncT _ -> Some t
+  | VarT id -> as_func env (find_type env id)
+  | _ -> None
+
+let rec as_serv env t =
+  match t.it with
+  | ServT _ -> Some t
+  | VarT id -> as_serv env (find_type env id)
+  | _ -> None
+
+let check_cycle env =
+  Env.iter (fun x t ->
+      let rec has_cycle seen t =
+        match t.it with
+        | VarT id ->
+           TS.mem id.it seen ||
+             begin
+               let seen = TS.add id.it seen in
+               let t' = find_type env id in
+               has_cycle seen t'
+             end
+        | _ -> false
+      in
+      if has_cycle TS.empty t then error env t.at "%s has a cyclic type definition" x
+    ) env.typs
+
+let rec check_typ env t =
+  match t.it with
+  | PrimT prim -> t
+  | PrincipalT -> t
+  | VarT id -> ignore (find_type env id); t
+  | FuncT (ms, t1, t2) ->
+     let t1' = List.map (fun t -> check_typ env t) t1 in
+     let t2' = List.map (fun t -> check_typ env t) t2 in
+     if List.length ms > 1 then
+       error env t.at "cannot have more than one mode"
+     else if List.length ms = 1 && (List.hd ms).it = Oneway && List.length t2 > 0 then
+       error env t.at "oneway function has non-unit return type";
+     FuncT (ms, t1', t2') @@ t.at
+  | OptT t -> OptT (check_typ env t) @@ t.at
+  | VecT t -> VecT (check_typ env t) @@ t.at
+  | BlobT -> BlobT @@ t.at
+  | RecordT fs ->
+     let fs' = check_fields env fs in
+     RecordT (List.sort compare_field fs') @@ t.at
+  | VariantT fs ->
+     let fs' = check_fields env fs in
+     VariantT (List.sort compare_field fs') @@ t.at
+  | ServT meths ->
+     let ms' = check_meths env meths in
+     ServT (List.sort compare_meth ms') @@ t.at
+  | ClassT _ ->
+     error env t.at "service constructor not supported"
+  | PreT -> assert false
+
+and check_fields env fs =
+  let _, fields =
+    List.fold_left (fun (fenv, fields) f ->
+        let f_id = field_id f in
+        let f_name = field_name f in
+        match FieldEnv.find_opt f_id fenv with
+        | Some name' ->
+           error env f.it.label.at "field name %s hash collision with field %s" f_name name'
+        | None ->
+           let t' = check_typ env f.it.typ in
+           let f' = {label=f.it.label; typ=t'} @@ f.at in
+           FieldEnv.disjoint_add f_id f_name fenv, f'::fields
+      ) (FieldEnv.empty, []) fs
+  in fields
+
+and check_meth env meth =
+  let t' = check_typ env meth.it.meth in
+  if env.pre then {var=meth.it.var; meth=t'} @@ meth.at
+  else
+    match as_func env t' with
+    | None ->
+       error env meth.it.meth.at "%s is a non-function type\n %s" meth.it.var.it (string_of_typ t');
+    | Some _ -> {var=meth.it.var; meth=t'} @@ meth.at
+
+and check_meths env meths =
+  let _, meths =
+    List.fold_left (fun (name_env, meths) meth ->
+        if TS.mem meth.it.var.it name_env then
+          error env meth.it.var.at "duplicate binding for %s in service" meth.it.var.it
+        else
+          let meth' = check_meth env meth in
+          (TS.add meth.it.var.it name_env, meth'::meths)
+      ) (TS.empty, []) meths
+  in meths
+  
+(* Declarations *)
+                    
+and check_def env dec =
+  match dec.it with
+  | TypD (id, t) ->
+     let t' = check_typ env t in
+     Env.singleton id.it t'
+  | ImportD _ -> Env.empty
+
+and check_defs env decs =
+  let env' =
+    List.fold_left (fun env dec ->
+        let te' = check_def env dec in
+        adjoin env te'
+      ) env decs
+  in env'.typs
+
+and check_decs env decs =
+  let pre_env = adjoin env (gather_decs env decs) in
+  let te = check_defs {pre_env with pre = true} decs in
+  let env = env_of_scope env.msgs te in
+  check_cycle env;
+  check_defs {env with pre = false} decs
+    
+and gather_decs env decs =
+  List.fold_left (fun te dec ->
+      match dec.it with
+      | TypD (id, _) ->
+         let te' = Env.singleton id.it (PreT @@ id.at) in
+         disjoint_union env id.at "duplicate binding for %s in type definitions" te te'
+      | ImportD _ -> te
+    ) env.typs decs
+
+(* Actor *)
+
+let check_service env t =
+  match as_serv env t with
+  | None ->
+     error env t.at "%s is a non-service type\n %s" (string_of_typ t) (string_of_typ t)
+  | Some {it=ServT meths; _} ->
+     let meths' = check_meths env meths in
+     ServT (List.sort compare_meth meths') @@ t.at
+  | Some _ -> assert false
+
+let check_main_service env actor_opt =
+  match actor_opt with
+  | None -> None
+  | Some {it=ClassT (args, t); at; _} ->
+     let args = List.map (check_typ env) args in
+     let t = check_service env t in
+     Some (ClassT (args, t) @@ at)
+  | Some t -> Some (check_service env t)
+
+(* Programs *)
+
+let check_prog scope prog : (scope * typ option) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog ->
+          let env = env_of_scope msgs scope in
+          let te = check_decs env prog.it.decs in
+          let actor = check_main_service (env_of_scope msgs te) prog.it.actor in
+          (te, actor)
+        )
+        prog
+    )
+
+(* Test declarations *)
+
+let check_tdecs scope decs : scope Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog -> check_decs (env_of_scope msgs scope) decs)
+        prog
+    )
+
+
+
+ + + diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 00000000000..4f782885f2a --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,1016 @@ + + + + + Coverage report + + + + + +
+
+ + + + 93% (9464 / 10106) + + codegen/compile.ml + +
+
+ + + + 0% (3 / 311) + + codegen/die.ml + +
+
+ + + + 77% (124 / 161) + + codegen/instrList.ml + +
+
+ + + + 31% (166 / 528) + + exes/deser.ml + +
+
+ + + + 60% (30 / 50) + + exes/didc.ml + +
+
+ + + + 61% (24 / 39) + + exes/mo_ld.ml + +
+
+ + + + 57% (75 / 131) + + exes/moc.ml + +
+
+ + + + 81% (62 / 76) + + ic/url.ml + +
+
+ + + + 78% (191 / 244) + + idllib/arrange_idl.ml + +
+
+ + + + 95% (223 / 233) + + idllib/compile_js.ml + +
+
+ + + + 49% (73 / 147) + + idllib/escape.ml + +
+
+ + + + 100% (0 / 0) + + idllib/exception.ml + +
+
+ + + + 100% (0 / 0) + + idllib/flags.ml + +
+
+ + + + 100% (7 / 7) + + idllib/idlHash.ml + +
+
+ + + + 83% (118 / 142) + + idllib/lexer.ml + +
+
+ + + + 35% (621 / 1743) + + idllib/parser.ml + +
+
+ + + + 68% (80 / 117) + + idllib/pipeline.ml + +
+
+ + + + 88% (16 / 18) + + idllib/resolve_import.ml + +
+
+ + + + 87% (149 / 170) + + idllib/typing.ml + +
+
+ + + + 1% (3 / 286) + + ir_def/arrange_ir.ml + +
+
+ + + + 81% (896 / 1098) + + ir_def/check_ir.ml + +
+
+ + + + 92% (364 / 395) + + ir_def/construct.ml + +
+
+ + + + 96% (141 / 146) + + ir_def/freevars.ml + +
+
+ + + + 74% (76 / 102) + + ir_def/ir.ml + +
+
+ + + + 98% (63 / 64) + + ir_def/ir_effect.ml + +
+
+ + + + 100% (14 / 14) + + ir_def/ir_utils.ml + +
+
+ + + + 100% (0 / 0) + + ir_def/note.ml + +
+
+ + + + 86% (143 / 165) + + ir_def/rename.ml + +
+
+ + + + 0% (6 / 654) + + ir_interpreter/interpret_ir.ml + +
+
+ + + + 96% (447 / 463) + + ir_passes/async.ml + +
+
+ + + + 87% (444 / 510) + + ir_passes/await.ml + +
+
+ + + + 92% (142 / 154) + + ir_passes/const.ml + +
+
+ + + + 89% (228 / 255) + + ir_passes/eq.ml + +
+
+ + + + 91% (170 / 186) + + ir_passes/erase_typ_field.ml + +
+
+ + + + 92% (289 / 314) + + ir_passes/show.ml + +
+
+ + + + 91% (180 / 197) + + ir_passes/tailcall.ml + +
+
+ + + + 91% (68 / 74) + + lang_utils/diag.ml + +
+
+ + + + 80% (4 / 5) + + lang_utils/dom.ml + +
+
+ + + + 68% (11 / 16) + + lang_utils/env.ml + +
+
+ + + + 100% (0 / 0) + + lang_utils/error_codes.ml + +
+
+ + + + 100% (85 / 85) + + lang_utils/expGraph.ml + +
+
+ + + + 95% (20 / 21) + + lang_utils/lbool.ml + +
+
+ + + + 69% (36 / 52) + + lang_utils/nameRel.ml + +
+
+ + + + 100% (37 / 37) + + lang_utils/scc.ml + +
+
+ + + + 93% (14 / 15) + + lang_utils/source.ml + +
+
+ + + + 47% (328 / 696) + + lib/lib.ml + +
+
+ + + + 93% (536 / 571) + + linking/linkModule.ml + +
+
+ + + + 90% (973 / 1077) + + lowering/desugar.ml + +
+
+ + + + 77% (7 / 9) + + mo_config/args.ml + +
+
+ + + + 100% (0 / 0) + + mo_config/flags.ml + +
+
+ + + + 40% (2 / 5) + + mo_config/internal_error.ml + +
+
+ + + + 0% (0 / 497) + + mo_def/arrange.ml + +
+
+ + + + 97% (46 / 47) + + mo_def/compUnit.ml + +
+
+ + + + 52% (25 / 48) + + mo_def/syntax.ml + +
+
+ + + + 42% (18 / 42) + + mo_def/trivia.ml + +
+
+ + + + 82% (219 / 266) + + mo_frontend/bi_match.ml + +
+
+ + + + 90% (290 / 320) + + mo_frontend/coverage.ml + +
+
+ + + + 99% (210 / 212) + + mo_frontend/definedness.ml + +
+
+ + + + 97% (98 / 101) + + mo_frontend/effect.ml + +
+
+ + + + 100% (125 / 125) + + mo_frontend/error_reporting.ml + +
+
+ + + + 100% (69 / 69) + + mo_frontend/lexer.ml + +
+
+ + + + 100% (5 / 5) + + mo_frontend/lexer_lib.ml + +
+ +
+ + + + 54% (2481 / 4527) + + mo_frontend/parser.ml + +
+
+ + + + 100% (0 / 0) + + mo_frontend/parser_lib.ml + +
+
+ + + + 57% (36 / 63) + + mo_frontend/parsing.ml + +
+
+ + + + 37% (85 / 226) + + mo_frontend/printers.ml + +
+
+ + + + 90% (254 / 281) + + mo_frontend/source_lexer.ml + +
+
+ + + + 46% (122 / 264) + + mo_frontend/source_token.ml + +
+
+ + + + 100% (40 / 40) + + mo_frontend/stability.ml + +
+
+ + + + 65% (57 / 87) + + mo_frontend/static.ml + +
+
+ + + + 98% (136 / 138) + + mo_frontend/traversals.ml + +
+
+ + + + 90% (2025 / 2235) + + mo_frontend/typing.ml + +
+
+ + + + 80% (50 / 62) + + mo_frontend/variance.ml + +
+
+ + + + 84% (86 / 102) + + mo_idl/idl_to_mo.ml + +
+
+ + + + 94% (162 / 171) + + mo_idl/mo_to_idl.ml + +
+
+ + + + 42% (328 / 773) + + mo_interpreter/interpret.ml + +
+
+ + + + 0% (0 / 75) + + mo_types/arrange_type.ml + +
+
+ + + + 100% (2 / 2) + + mo_types/async_cap.ml + +
+
+ + + + 87% (21 / 24) + + mo_types/cons.ml + +
+
+ + + + 80% (99 / 123) + + mo_types/expansive.ml + +
+
+ + + + 100% (9 / 9) + + mo_types/hash.ml + +
+
+ + + + 96% (24 / 25) + + mo_types/productive.ml + +
+
+ + + + 100% (10 / 10) + + mo_types/scope.ml + +
+
+ + + + 84% (79 / 94) + + mo_types/typ_hash.ml + +
+
+ + + + 83% (1265 / 1508) + + mo_types/type.ml + +
+
+ + + + 0% (0 / 30) + + mo_values/arrange_ops.ml + +
+
+ + + + 37% (6 / 16) + + mo_values/call_conv.ml + +
+
+ + + + 56% (146 / 258) + + mo_values/numerics.ml + +
+
+ + + + 37% (124 / 333) + + mo_values/operator.ml + +
+
+ + + + 11% (76 / 641) + + mo_values/prim.ml + +
+
+ + + + 30% (40 / 130) + + mo_values/show.ml + +
+
+ + + + 52% (118 / 224) + + mo_values/value.ml + +
+
+ + + + 82% (359 / 436) + + pipeline/pipeline.ml + +
+
+ + + + 94% (118 / 125) + + pipeline/resolve_import.ml + +
+
+ + + + 100% (3 / 3) + + prelude/prelude.ml + +
+
+ + + + 5% (4 / 69) + + profiler/counters.ml + +
+
+ + + + 23% (3 / 13) + + profiler/profiler.ml + +
+
+ + + + 100% (0 / 0) + + profiler/profilerFlags.ml + +
+
+ + + + 100% (0 / 0) + + rts/rts.ml + +
+
+ + + + 100% (0 / 0) + + source_id/generated.ml + +
+
+ + + + 50% (1 / 2) + + source_id/source_id.ml + +
+
+ + + + 59% (94 / 159) + + viper/pretty.ml + +
+
+ + + + 71% (325 / 456) + + viper/trans.ml + +
+
+ + + + 100% (13 / 13) + + wasm-exts/abbreviation.ml + +
+
+ + + + 14% (8 / 56) + + wasm-exts/ast.ml + +
+
+ + + + 100% (0 / 0) + + wasm-exts/customModule.ml + +
+
+ + + + 74% (591 / 798) + + wasm-exts/customModuleDecode.ml + +
+
+ + + + 66% (672 / 1005) + + wasm-exts/customModuleEncode.ml + +
+
+ + + + 86% (76 / 88) + + wasm-exts/dwarf5.ml + +
+
+ + + + 84% (37 / 44) + + wasm-exts/operators.ml + +
+
+ + diff --git a/coverage/ir_def/arrange_ir.ml.html b/coverage/ir_def/arrange_ir.ml.html new file mode 100644 index 00000000000..24e1b8031c2 --- /dev/null +++ b/coverage/ir_def/arrange_ir.ml.html @@ -0,0 +1,695 @@ + + + + + arrange_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+
+
open Mo_types
+open Mo_values
+open Source
+open Ir
+open Wasm.Sexpr
+
+let ($$) head inner = Node (head, inner)
+
+let id i = Atom i
+
+let typ t = Atom (Type.string_of_typ t)
+let prim_ty p = typ (Type.Prim p)
+let kind k = Atom (Type.string_of_kind k)
+
+let rec exp e = match e.it with
+  | VarE i              -> "VarE"    $$ [id i]
+  | LitE l              -> "LitE"    $$ [lit l]
+  | PrimE (p, es)       -> "PrimE"   $$ [prim p] @ List.map exp es
+  | AssignE (le1, e2)   -> "AssignE" $$ [lexp le1; exp e2]
+  | BlockE (ds, e1)     -> "BlockE"  $$ List.map dec ds @ [exp e1]
+  | IfE (e1, e2, e3)    -> "IfE"     $$ [exp e1; exp e2; exp e3]
+  | SwitchE (e, cs)     -> "SwitchE" $$ [exp e] @ List.map case cs
+  | LoopE e1            -> "LoopE"   $$ [exp e1]
+  | LabelE (i, t, e)    -> "LabelE"  $$ [id i; typ t; exp e]
+  | AsyncE (Type.Fut, tb, e, t) -> "AsyncE"  $$ [typ_bind tb; exp e; typ t]
+  | AsyncE (Type.Cmp, tb, e, t) -> "AsyncE*"  $$ [typ_bind tb; exp e; typ t]
+  | DeclareE (i, t, e1) -> "DeclareE" $$ [id i; exp e1]
+  | DefineE (i, m, e1)  -> "DefineE" $$ [id i; mut m; exp e1]
+  | FuncE (x, s, c, tp, as_, ts, e) ->
+    "FuncE" $$ [Atom x; func_sort s; control c] @ List.map typ_bind tp @ args as_ @ [ typ (Type.seq ts); exp e]
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    "SelfCallE" $$ [typ (Type.seq ts); exp exp_f; exp exp_k; exp exp_r]
+  | ActorE (ds, fs, u, t) -> "ActorE"  $$ List.map dec ds @ fields fs @ [system u; typ t]
+  | NewObjE (s, fs, t)  -> "NewObjE" $$ (Arrange_type.obj_sort s :: fields fs @ [typ t])
+  | TryE (e, cs)        -> "TryE" $$ [exp e] @ List.map case cs
+
+and system { meta; preupgrade; postupgrade; heartbeat; timer; inspect} = (* TODO: show meta? *)
+  "System" $$ [
+      "Pre" $$ [exp preupgrade];
+      "Post" $$ [exp postupgrade];
+      "Heartbeat" $$ [exp heartbeat];
+      "Timer" $$ [exp timer];
+      "Inspect" $$ [exp inspect];
+    ]
+
+and lexp le = match le.it with
+  | VarLE i             -> "VarLE" $$ [id i]
+  | IdxLE (e1, e2)      -> "IdxLE" $$ [exp e1; exp e2]
+  | DotLE (e1, n)       -> "DotLE" $$ [exp e1; Atom n]
+
+and fields fs = List.fold_left (fun flds (f : field) -> (f.it.name $$ [ id f.it.var ]):: flds) [] fs
+
+and args = function
+ | [] -> []
+ | as_ -> ["params" $$ List.map arg as_]
+
+and arg a = Atom a.it
+
+and prim = function
+  | CallPrim ts       -> "CallPrim" $$ List.map typ ts
+  | UnPrim (t, uo)    -> "UnPrim"     $$ [typ t; Arrange_ops.unop uo]
+  | BinPrim (t, bo)   -> "BinPrim"    $$ [typ t; Arrange_ops.binop bo]
+  | RelPrim (t, ro)   -> "RelPrim"    $$ [typ t; Arrange_ops.relop ro]
+  | TupPrim           -> Atom "TupPrim"
+  | ProjPrim i        -> "ProjPrim"   $$ [Atom (string_of_int i)]
+  | OptPrim           -> Atom "OptPrim"
+  | TagPrim i         -> "TagE" $$ [id i]
+  | DotPrim n         -> "DotPrim" $$ [Atom n]
+  | ActorDotPrim n    -> "ActorDotPrim" $$ [Atom n]
+  | ArrayPrim (m, t)  -> "ArrayPrim"  $$ [mut m; typ t]
+  | IdxPrim           -> Atom "IdxPrim"
+  | NextArrayOffset _ -> Atom "NextArrayOffset"
+  | ValidArrayOffset  -> Atom "ValidArrayOffset"
+  | DerefArrayOffset  -> Atom "DerefArrayOffset"
+  | GetPastArrayOffset _ -> Atom "GetPastArrayOffset"
+  | BreakPrim i       -> "BreakPrim"  $$ [id i]
+  | RetPrim           -> Atom "RetPrim"
+  | AwaitPrim Type.Fut -> Atom "AwaitPrim"
+  | AwaitPrim Type.Cmp -> Atom "AwaitPrim*"
+  | AssertPrim        -> Atom "AssertPrim"
+  | ThrowPrim         -> Atom "ThrowPrim"
+  | ShowPrim t        -> "ShowPrim" $$ [typ t]
+  | SerializePrim t   -> "SerializePrim" $$ List.map typ t
+  | DeserializePrim t -> "DeserializePrim" $$ List.map typ t
+  | DeserializeOptPrim t -> "DeserializeOptPrim" $$ List.map typ t
+  | NumConvWrapPrim (t1, t2) -> "NumConvWrapPrim" $$ [prim_ty t1; prim_ty t2]
+  | NumConvTrapPrim (t1, t2) -> "NumConvTrapPrim" $$ [prim_ty t1; prim_ty t2]
+  | CastPrim (t1, t2) -> "CastPrim" $$ [typ t1; typ t2]
+  | DecodeUtf8        -> Atom "DecodeUtf8"
+  | EncodeUtf8        -> Atom "EncodeUtf8"
+  | ActorOfIdBlob t   -> "ActorOfIdBlob" $$ [typ t]
+  | BlobOfIcUrl       -> Atom "BlobOfIcUrl"
+  | IcUrlOfBlob       -> Atom "IcUrlOfBlob"
+  | SelfRef t         -> "SelfRef"    $$ [typ t]
+  | SystemTimePrim    -> Atom "SystemTimePrim"
+  | SystemCyclesAddPrim -> Atom "SystemCyclesAcceptPrim"
+  | SystemCyclesAcceptPrim -> Atom "SystemCyclesAcceptPrim"
+  | SystemCyclesAvailablePrim -> Atom "SystemCyclesAvailablePrim"
+  | SystemCyclesBalancePrim -> Atom "SystemCyclesBalancePrim"
+  | SystemCyclesRefundedPrim -> Atom "SystemCyclesRefundedPrim"
+  | SetCertifiedData  -> Atom "SetCertifiedData"
+  | GetCertificate    -> Atom "GetCertificate"
+  | OtherPrim s       -> Atom s
+  | CPSAwait (Type.Fut, t) -> "CPSAwait" $$ [typ t]
+  | CPSAwait (Type.Cmp, t) -> "CPSAwait*" $$ [typ t]
+  | CPSAsync (Type.Fut, t) -> "CPSAsync" $$ [typ t]
+  | CPSAsync (Type.Cmp, t) -> "CPSAsync*" $$ [typ t]
+  | ICArgDataPrim     -> Atom "ICArgDataPrim"
+  | ICStableSize t    -> "ICStableSize" $$ [typ t]
+  | ICPerformGC       -> Atom "ICPerformGC"
+  | ICReplyPrim ts    -> "ICReplyPrim" $$ List.map typ ts
+  | ICRejectPrim      -> Atom "ICRejectPrim"
+  | ICCallerPrim      -> Atom "ICCallerPrim"
+  | ICCallPrim        -> Atom "ICCallPrim"
+  | ICCallRawPrim     -> Atom "ICCallRawPrim"
+  | ICMethodNamePrim  -> Atom "ICMethodNamePrim"
+  | ICStableWrite t   -> "ICStableWrite" $$ [typ t]
+  | ICStableRead t    -> "ICStableRead" $$ [typ t]
+
+and mut = function
+  | Const -> Atom "Const"
+  | Var   -> Atom "Var"
+
+and pat p = match p.it with
+  | WildP           -> Atom "WildP"
+  | VarP i          -> "VarP"       $$ [ id i ]
+  | TupP ps         -> "TupP"       $$ List.map pat ps
+  | ObjP pfs        -> "ObjP"       $$ List.map pat_field pfs
+  | LitP l          -> "LitP"       $$ [ lit l ]
+  | OptP p          -> "OptP"       $$ [ pat p ]
+  | TagP (i, p)     -> "TagP"       $$ [ id i; pat p ]
+  | AltP (p1,p2)    -> "AltP"       $$ [ pat p1; pat p2 ]
+
+and lit = function
+  | NullLit       -> Atom "NullLit"
+  | BoolLit b     -> "BoolLit"   $$ [ Atom (if b then "true" else "false") ]
+  | NatLit n      -> "NatLit"    $$ [ Atom (Numerics.Nat.to_pretty_string n) ]
+  | Nat8Lit w     -> "Nat8Lit"   $$ [ Atom (Numerics.Nat8.to_pretty_string w) ]
+  | Nat16Lit w    -> "Nat16Lit"  $$ [ Atom (Numerics.Nat16.to_pretty_string w) ]
+  | Nat32Lit w    -> "Nat32Lit"  $$ [ Atom (Numerics.Nat32.to_pretty_string w) ]
+  | Nat64Lit w    -> "Nat64Lit"  $$ [ Atom (Numerics.Nat64.to_pretty_string w) ]
+  | IntLit i      -> "IntLit"    $$ [ Atom (Numerics.Int.to_pretty_string i) ]
+  | Int8Lit w     -> "Int8Lit"   $$ [ Atom (Numerics.Int_8.to_pretty_string w) ]
+  | Int16Lit w    -> "Int16Lit"  $$ [ Atom (Numerics.Int_16.to_pretty_string w) ]
+  | Int32Lit w    -> "Int32Lit"  $$ [ Atom (Numerics.Int_32.to_pretty_string w) ]
+  | Int64Lit w    -> "Int64Lit"  $$ [ Atom (Numerics.Int_64.to_pretty_string w) ]
+  | FloatLit f    -> "FloatLit"  $$ [ Atom (Numerics.Float.to_pretty_string f) ]
+  | CharLit c     -> "CharLit"   $$ [ Atom (string_of_int c) ]
+  | TextLit t     -> "TextLit"   $$ [ Atom t ]
+  | BlobLit b     -> "BlobLit"   $$ [ Atom (Printf.sprintf "%S" b) ] (* hex might be nicer *)
+
+and pat_field pf = pf.it.name $$ [pat pf.it.pat]
+
+and case c = "case" $$ [pat c.it.pat; exp c.it.exp]
+
+and func_sort s = Atom (Arrange_type.func_sort s)
+
+and control s = Atom (Arrange_type.control s)
+
+and dec d = match d.it with
+  | LetD (p, e) -> "LetD" $$ [pat p; exp e]
+  | VarD (i, t, e) -> "VarD" $$ [id i; typ t; exp e]
+  | RefD (i, t, e) -> "RefD" $$ [id i; typ t; lexp e]
+
+and typ_bind (tb : typ_bind) =
+  Type.string_of_con tb.it.con $$ [typ tb.it.bound]
+
+and comp_unit = function
+  | LibU (ds, e) -> "LibU" $$ List.map dec ds @ [ exp e ]
+  | ProgU ds -> "ProgU" $$ List.map dec ds
+  | ActorU (None, ds, fs, u, t) -> "ActorU"  $$ List.map dec ds @ fields fs @ [system u; typ t]
+  | ActorU (Some as_, ds, fs, u, t) -> "ActorU"  $$ List.map arg as_ @ List.map dec ds @ fields fs @ [system u; typ t]
+
+and prog (cu, _flavor) = comp_unit cu
+
+
+
+ + + diff --git a/coverage/ir_def/check_ir.ml.html b/coverage/ir_def/check_ir.ml.html new file mode 100644 index 00000000000..89bafc8a942 --- /dev/null +++ b/coverage/ir_def/check_ir.ml.html @@ -0,0 +1,3746 @@ + + + + + check_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+
+
open Mo_types
+open Mo_values
+
+open Source
+module T = Type
+module E = Ir_effect
+
+(* TODO: make note immutable, perhaps just using type abstraction *)
+
+(* TODO:
+   dereferencing is still implicit in the IR (see immut_typ below);
+   consider making it explicit as part of desugaring.
+*)
+
+(* TODO: check escape of free mutables via actors *)
+
+(* Helpers *)
+
+let (==>) p q = not p || q
+
+let typ = E.typ
+
+let immute_typ p =
+  assert (not (T.is_mut (typ p)));
+  (typ p)
+
+(* Scope *)
+
+type val_info = {
+  typ : T.typ;
+  (* see ir_passes/const.ml for the next two *)
+  loc_known : bool;
+  const : bool;
+}
+type val_env = val_info T.Env.t
+
+type scope =
+  { val_env : val_env;
+  }
+
+let empty_scope : scope =
+  { val_env = T.Env.empty;
+  }
+
+(* Contexts (internal) *)
+
+type lab_env = T.typ T.Env.t
+type ret_env = T.typ option
+(* the con_env tracks
+   - which abstract types (type parameters) are in scope
+   - which type aliases we are currently unfolding (to break recursion)
+*)
+type con_env = T.ConSet.t
+
+type lvl = TopLvl | NotTopLvl
+
+type env =
+  { flavor : Ir.flavor;
+    lvl  : lvl;
+    vals : val_env;
+    cons : con_env;
+    labs : lab_env;
+    rets : ret_env;
+    async : T.con option;
+    seen : con_env ref;
+    check_run : int;
+  }
+
+let last_run : int ref = ref 0
+
+let initial_env flavor : env =
+  let check_run = !last_run + 1 in
+  last_run := check_run;
+  { flavor;
+    lvl = TopLvl;
+    vals = T.Env.empty;
+    cons = T.ConSet.empty;
+    labs = T.Env.empty;
+    rets = None;
+    async = Async_cap.(match initial_cap() with
+                       | (NullCap | ErrorCap) -> None
+                       | (QueryCap c | AwaitCap c | AsyncCap c | CompositeCap c | CompositeAwaitCap c) -> Some c);
+    seen = ref T.ConSet.empty;
+    check_run;
+  }
+
+
+(* More error bookkeeping *)
+
+exception CheckFailed of string
+
+let type_error at : string -> Diag.message = Diag.error_message at "M0000" "IR type"
+
+let error env at fmt =
+    Printf.ksprintf (fun s -> raise (CheckFailed (Diag.string_of_message (type_error at s)))) fmt
+
+let check env at p s =
+  if not p then
+    error env at "%s" s
+
+let add_lab c x t = {c with labs = T.Env.add x t c.labs}
+
+let add_typs c cs =
+  { c with
+    cons = List.fold_right (fun c -> T.ConSet.disjoint_add c) cs c.cons;
+  }
+
+let adjoin c scope =
+  { c with
+    vals = T.Env.adjoin c.vals scope.val_env;
+  }
+
+let adjoin_vals c ve = {c with vals = T.Env.adjoin c.vals ve}
+
+let adjoin_cons c ce =
+  { c with
+    cons = T.ConSet.disjoint_union c.cons ce;
+  }
+
+let disjoint_union env at fmt env1 env2 =
+  try T.Env.disjoint_union env1 env2
+  with T.Env.Clash k -> error env at fmt k
+
+(* Types *)
+
+(* FIX ME: these error reporting functions are eager and will construct unnecessary type strings !*)
+let check_sub env at t1 t2 =
+  if not (T.sub t1 t2) then
+    error env at "subtype violation:\n  %s\n  %s\n"
+      (T.string_of_typ_expand t1) (T.string_of_typ_expand t2)
+
+let check_shared env at t =
+  if not (T.shared t) then
+    error env at "message argument is not sharable:\n  %s" (T.string_of_typ_expand t)
+
+let check_concrete env at t =
+  if not (T.concrete t) then
+    error env at "message argument is not concrete:\n  %s" (T.string_of_typ_expand t)
+
+let has_prim_eq t =
+  (* Which types have primitive equality implemented in the backend? *)
+  (* Keep in sync with Compile.compileq_eq *)
+  let open T in
+  match normalize t with
+  | Prim Null -> false (* Ir_passes.Eq handles singleton types *)
+  | Prim Error -> false (* should be desugared away *)
+  | Prim _ -> true (* all other prims are fine *)
+  | Non -> true
+  (* references are handled in the back-end: *)
+  | Obj (Actor, _) | Func (Shared _, _, _, _, _) -> true
+  | _ -> false
+
+let check_field_hashes env what at =
+  Lib.List.iter_pairs
+    (fun x y ->
+      if not (T.is_typ x.T.typ) && not (T.is_typ y.T.typ) &&
+         Hash.hash x.T.lab = Hash.hash y.T.lab
+      then error env at "field names %s and %s in %s type have colliding hashes"
+        x.T.lab y.T.lab what;
+    )
+
+
+let rec check_typ env typ : unit =
+  match typ with
+  | T.Pre ->
+    error env no_region "illegal T.Pre type"
+  | T.Var (s, i) ->
+    error env no_region "free type variable %s, index %i" s  i
+  | T.Con (c, typs) ->
+    List.iter (check_typ env) typs;
+    begin
+      match Cons.kind c with
+      | T.Def (tbs,_) ->
+        check_con env c;
+        check_typ_bounds env tbs typs no_region
+      | T.Abs (tbs, _) ->
+        if not (T.ConSet.mem c env.cons) then
+          error env no_region "free type constructor %s " (T.string_of_typ typ);
+        check_typ_bounds env tbs typs no_region
+    end
+  | T.Any -> ()
+  | T.Non -> ()
+  | T.Prim _ -> ()
+  | T.Array typ ->
+    check_mut_typ env typ
+  | T.Tup typs ->
+    List.iter (check_typ env) typs
+  | T.Func (sort, control, binds, ts1, ts2) ->
+    let cs, ce = check_typ_binds env binds in
+    let env = adjoin_cons env ce in
+    let ts = List.map (fun c -> T.Con (c, [])) cs in
+    let ts1 = List.map (T.open_ ts) ts1 in
+    let ts2 = List.map (T.open_ ts) ts2 in
+    List.iter (check_typ env) ts1;
+    List.iter (check_typ env) ts2;
+    if T.is_shared_sort sort then begin
+      List.iter (fun t -> check_shared env no_region t) ts1;
+      match control with
+      | T.Returns ->
+        check env no_region (sort = T.Shared T.Write)
+          "one-shot query function pointless";
+        if not (ts2 = []) then
+          error env no_region "one-shot function cannot have non-unit return types:\n  %s"
+            (T.string_of_typ_expand (T.seq ts2));
+      | T.Promises ->
+        check env no_region (binds <> [])
+          "promising function has no scope type argument";
+        check env no_region env.flavor.Ir.has_async_typ
+          "promising function in post-async flavor";
+        if not (sort <> T.Local) then
+          error env no_region "promising function cannot be local:\n  %s" (T.string_of_typ typ);
+        if not (List.for_all T.shared ts2) then
+          error env no_region "message result is not sharable:\n  %s" (T.string_of_typ typ)
+      | T.Replies ->
+        check env no_region (not env.flavor.Ir.has_async_typ)
+          "replying function in pre-async flavor";
+        if not (sort <> T.Local) then
+          error env no_region"replying function cannot be local:\n  %s" (T.string_of_typ typ);
+        if not (List.for_all T.shared ts2) then
+          error env no_region "message result is not sharable:\n  %s" (T.string_of_typ typ)
+      end else
+     if not (control = T.Returns) then
+       error env no_region "promising function cannot be local:\n  %s" (T.string_of_typ_expand typ);
+  | T.Opt typ ->
+    check_typ env typ
+  | T.Async (s, typ1, typ2) ->
+    check_typ env typ1;
+    check_typ env typ2;
+    check env no_region env.flavor.Ir.has_async_typ "async in non-async flavor";
+    let t' = T.promote typ2 in
+    check_shared env no_region t'
+  | T.Obj (sort, fields) ->
+    List.iter (check_typ_field env (Some sort)) fields;
+    check_field_hashes env "object" no_region fields;
+    (* fields strictly sorted (and) distinct *)
+    if not (Lib.List.is_strictly_ordered T.compare_field fields) then
+      error env no_region "object type's fields are not distinct and sorted %s" (T.string_of_typ typ)
+  | T.Variant fields ->
+    List.iter (check_typ_field env None) fields;
+    check_field_hashes env "variant" no_region fields;
+    if not (Lib.List.is_strictly_ordered T.compare_field fields) then
+      error env no_region "variant type's fields are not distinct and sorted %s" (T.string_of_typ typ)
+  | T.Mut typ ->
+    error env no_region "unexpected T.Mut"
+  | T.Typ c ->
+    error env no_region "unexpected T.Typ"
+
+and check_mut_typ env = function
+  | T.Mut t -> check_typ env t
+  | t -> check_typ env t
+
+and check_con env c =
+  if T.ConSet.mem c !(env.seen) then ()
+  else
+  begin
+    env.seen := T.ConSet.add c !(env.seen);
+    let T.Abs (binds,typ) | T.Def (binds, typ) = Cons.kind c in
+    check env no_region (not (T.is_mut typ)) "type constructor RHS is_mut";
+    check env no_region (not (T.is_typ typ)) "type constructor RHS is_typ";
+    let cs, ce = check_typ_binds env binds in
+    let ts = List.map (fun c -> T.Con (c, [])) cs in
+    let env' = adjoin_cons env ce in
+    check_typ env' (T.open_ ts typ)
+  end
+
+and check_typ_field env s tf : unit =
+  match tf.T.typ, s with
+  | T.Mut t, Some (T.Object | T.Memory) -> check_typ env t
+  | T.Typ c, Some _ ->
+    check env no_region env.flavor.Ir.has_typ_field
+     "typ field in non-typ_field flavor";
+    check_con env c
+  | t, Some T.Actor when not (T.is_shared_func t) ->
+    error env no_region "actor field %s must have shared function type, found %s" tf.T.lab (T.string_of_typ t)
+  | t, _ -> check_typ env t
+
+and check_typ_binds_acyclic env cs ts  =
+  let n = List.length cs in
+  let ce = List.fold_right2 T.ConEnv.add cs ts T.ConEnv.empty in
+  let chase c =
+    let rec chase i ts c' =
+      if i > n then
+        error env no_region "type parameter %s has cyclic bounds %s"
+          (T.string_of_con c)
+          (String.concat " <: " (List.map T.string_of_typ ts)) (List.rev ts)
+      else
+        match T.ConEnv.find_opt c' ce with
+        | None -> ()
+        | Some t ->
+          (match T.normalize t with
+           | T.Con (c'', []) as t' ->
+             chase (i+1) (t'::ts) c''
+           | _ -> ())
+    in chase 0 [] c
+  in List.iter chase cs
+
+and check_typ_binds env typ_binds : T.con list * con_env =
+  let ts = Type.open_binds typ_binds in
+  let cs = List.map (function T.Con (c, []) -> c | _ -> assert false) ts in
+  let env' = add_typs env cs in
+  let bds = List.map (fun typ_bind -> T.open_ ts typ_bind.T.bound) typ_binds in
+  check_typ_binds_acyclic env' cs bds;
+  List.iter (check_typ env') bds;
+  cs, T.ConSet.of_list cs
+
+and check_typ_bounds env (tbs : T.bind list) typs at : unit =
+  let pars = List.length tbs in
+  let args = List.length typs in
+  if pars < args then
+    error env at "too many type arguments";
+  if pars > args then
+    error env at "too few type arguments";
+  List.iter2
+    (fun tb typ ->
+      check env at (T.sub typ (T.open_ typs tb.T.bound))
+        "type argument does not match parameter bound")
+    tbs typs
+
+
+and check_inst_bounds env tbs typs at =
+  List.iter (check_typ env) typs;
+  check_typ_bounds env tbs typs at
+
+(* Literals *)
+
+open Ir
+
+let type_lit env lit at : T.prim =
+  match lit with
+  | NullLit -> T.Null
+  | BoolLit _ -> T.Bool
+  | NatLit _ -> T.Nat
+  | Nat8Lit _ -> T.Nat8
+  | Nat16Lit _ -> T.Nat16
+  | Nat32Lit _ -> T.Nat32
+  | Nat64Lit _ -> T.Nat64
+  | IntLit _ -> T.Int
+  | Int8Lit _ -> T.Int8
+  | Int16Lit _ -> T.Int16
+  | Int32Lit _ -> T.Int32
+  | Int64Lit _ -> T.Int64
+  | FloatLit _ -> T.Float
+  | CharLit _ -> T.Char
+  | TextLit _ -> T.Text
+  | BlobLit _ -> T.Blob
+
+
+(* Expressions *)
+
+let isAsyncE exp =
+  match exp.it with
+  | AsyncE _ (* pre await transformation *)
+  | PrimE (CPSAsync _, [_]) (* post await transformation *)
+    -> true
+  | _ -> false
+
+let store_typ t  =
+  T.stable t &&
+  match t with
+  | T.Obj(T.Memory, fts) ->
+    List.for_all (fun f -> T.is_opt f.T.typ) fts
+  | _ -> false
+
+let rec check_exp env (exp:Ir.exp) : unit =
+  (* helpers *)
+  let check p = check env exp.at p in
+  let (<:) t1 t2 =
+(*  try *)
+      check_sub env exp.at t1 t2
+(*  with e ->
+     (Printf.eprintf "(in here):\n%s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp));
+      raise e)
+*)
+  in
+  (* check for aliasing *)
+  if exp.note.Note.check_run = env.check_run
+  then
+    Printf.eprintf "IR has aliasing (or Check_ir visits nodes twice):\n%s"
+      (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp));
+  exp.note <- { exp.note with Note.check_run = env.check_run };
+  (* check type annotation *)
+  let t = E.typ exp in
+  check_typ env t;
+  (* check effect annotation *)
+  check (E.infer_effect_exp exp <= E.eff exp)
+    "inferred effect not a subtype of expected effect";
+  (* check typing *)
+  begin match exp.it with
+  | VarE id ->
+    let { typ; loc_known; const } =
+      try T.Env.find id env.vals
+      with Not_found -> error env exp.at "unbound variable %s" id
+    in
+    T.as_immut typ <: t
+  | LitE lit ->
+    T.Prim (type_lit env lit exp.at) <: t
+  | PrimE (p, es) ->
+    List.iter (check_exp env) es;
+    begin match p, es with
+    | CallPrim insts, [exp1; exp2] ->
+      begin match T.promote (typ exp1) with
+        | T.Func (sort, control, tbs, arg_tys, ret_tys) ->
+          check_inst_bounds env tbs insts exp.at;
+          let t_arg = T.open_ insts (T.seq arg_tys) in
+          let t_ret = T.codom control (fun () -> List.hd insts) (List.map (T.open_ insts) ret_tys) in
+          if T.is_shared_sort sort then begin
+            check_concrete env exp.at t_arg;
+            check_concrete env exp.at t_ret;
+          end;
+          typ exp2 <: t_arg;
+          t_ret <: t
+        | T.Non -> () (* dead code, not much to check here *)
+        | t1 -> error env exp1.at "expected function type, but expression produces type\n  %s"
+             (T.string_of_typ_expand t1)
+      end
+    | UnPrim (ot, op), [exp1] ->
+      check (Operator.has_unop op ot) "unary operator is not defined for operand type";
+      typ exp1 <: ot;
+      ot <: t
+    | BinPrim (ot, op), [exp1; exp2] ->
+      check (Operator.has_binop op ot) "binary operator is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      ot <: t
+    | RelPrim (ot,  Operator.NeqOp), _ ->
+      check false "negation operator should be desugared away in IR"
+    | RelPrim (ot,  Operator.EqOp), [exp1; exp2] when (not env.flavor.has_poly_eq) ->
+      check (has_prim_eq ot) "primitive equality is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      T.bool <: t
+    | RelPrim (ot, op), [exp1; exp2] ->
+      check (Operator.has_relop op ot) "relational operator is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      T.bool <: t
+    | TupPrim, exps ->
+      T.Tup (List.map typ exps) <: t
+    | ProjPrim n, [exp1] ->
+      let t1 = T.promote (immute_typ exp1) in
+      let ts = try T.as_tup_sub n t1
+               with Invalid_argument _ ->
+                 error env exp1.at "expected tuple type, but expression produces type\n  %s"
+                   (T.string_of_typ_expand t1) in
+      let tn = try List.nth ts n with
+               | Invalid_argument _ ->
+                 error env exp.at "tuple projection %n is out of bounds for type\n  %s"
+                   n (T.string_of_typ_expand t1) in
+      tn <: t
+    | OptPrim, [exp1] ->
+      T.Opt (typ exp1) <: t
+    | TagPrim i, [exp1] ->
+      T.Variant [{T.lab = i; typ = typ exp1; depr = None}] <: t
+    | ActorDotPrim n, [exp1]
+    | DotPrim n, [exp1] ->
+      begin
+        let t1 = typ exp1 in
+        let sort, tfs =
+          try T.as_obj_sub [n] t1 with Invalid_argument _ ->
+            error env exp1.at "expected object type, but expression produces type\n  %s"
+              (T.string_of_typ_expand t1)
+        in
+        check (match p with
+               | ActorDotPrim _ -> sort = T.Actor
+               | DotPrim _ -> sort <> T.Actor
+               | _ -> false) "sort mismatch";
+        try T.as_immut (T.lookup_val_field n tfs) <: t with Invalid_argument _ ->
+          error env exp1.at "field name %s does not exist in type\n  %s"
+            n (T.string_of_typ_expand t1)
+      end
+    | ArrayPrim (mut, t0), exps ->
+      List.iter (fun e -> typ e <: t0) exps;
+      let t1 = T.Array (match mut with Const -> t0 | Var -> T.Mut t0) in
+      t1 <: t
+    | (IdxPrim | DerefArrayOffset), [exp1; exp2] ->
+      let t1 = T.promote (typ exp1) in
+      let t2 = try T.as_array_sub t1 with
+               | Invalid_argument _ ->
+                 error env exp1.at "expected array type, but expression produces type\n  %s"
+                                         (T.string_of_typ_expand t1)
+      in
+      typ exp2 <: T.nat;
+      T.as_immut t2 <: t
+    | GetPastArrayOffset _, [exp1] ->
+      let t1 = T.promote (typ exp1) in
+      ignore
+        (try T.as_array_sub t1 with
+         | Invalid_argument _ ->
+           error env exp1.at "expected array type, but expression produces type\n  %s"
+             (T.string_of_typ_expand t1));
+      T.nat <: t
+    | NextArrayOffset _, [exp1] ->
+      typ exp1 <: T.nat;
+      T.nat <: t
+    | ValidArrayOffset, [exp1; exp2] ->
+      typ exp1 <: T.nat;
+      typ exp2 <: T.nat;
+      T.bool <: t
+    | BreakPrim id, [exp1] ->
+      begin
+        match T.Env.find_opt id env.labs with
+        | None -> error env exp.at "unbound label %s" id
+        | Some t1 -> typ exp1 <: t1;
+      end;
+      T.Non <: t (* vacuously true *)
+    | RetPrim, [exp1] ->
+      begin
+        match env.rets with
+        | None -> error env exp.at "misplaced return"
+        | Some t0 -> assert (t0 <> T.Pre); typ exp1 <: t0;
+      end;
+      T.Non <: t (* vacuously true *)
+    | ThrowPrim, [exp1] ->
+      check env.flavor.has_await "throw in non-await flavor";
+      check (env.async <> None) "misplaced throw";
+      typ exp1 <: T.throw;
+      T.Non <: t (* vacuously true *)
+    | AwaitPrim s, [exp1] ->
+      check env.flavor.has_await "await in non-await flavor";
+      let t0 = match env.async with
+      | Some c -> T.Con(c, [])
+      | None -> error env exp.at "misplaced await" in
+      let t1 = T.promote (typ exp1) in
+      let (t2, t3) = try T.as_async_sub s t0 t1
+             with Invalid_argument _ ->
+               error env exp1.at "expected async type, but expression has type\n  %s"
+                 (T.string_of_typ_expand t1)
+      in
+      check (T.eq t0 t2) "ill-scoped async";
+      t3 <: t
+    | AssertPrim, [exp1] ->
+      typ exp1 <: T.bool;
+      T.unit <: t
+    | ShowPrim ot, [exp1] ->
+      check env.flavor.has_show "show expression in non-show flavor";
+      check (Show.can_show ot) "show is not defined for operand type";
+      typ exp1 <: ot;
+      T.text <: t
+    | SerializePrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "Serialize is not defined for operand type";
+      typ exp1 <: T.seq ots;
+      T.blob <: t
+    | DeserializePrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "Deserialize is not defined for operand type";
+      typ exp1 <: T.blob;
+      T.seq ots <: t
+    | DeserializeOptPrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "DeserializeOpt is not defined for operand type";
+      typ exp1 <: T.blob;
+      T.Opt (T.seq ots) <: t
+    | CPSAwait (s, cont_typ), [a; kr] ->
+      let (_, t1) =
+        try T.as_async_sub s T.Non (T.normalize (typ a))
+        with _ -> error env exp.at "CPSAwait expect async arg, found %s" (T.string_of_typ (typ a))
+      in
+      (match cont_typ with
+       | T.Func(T.Local, T.Returns, [], ts1, ts2) ->
+         begin
+           (match ts2 with
+            | [] -> ()
+            | _ -> error env exp.at "CPSAwait answer type error");
+           typ kr <: T.Tup [cont_typ; T.Func(T.Local, T.Returns, [], [T.catch], ts2)];
+           t1 <: T.seq ts1;
+           T.seq ts2 <: t;
+         end;
+       | _ -> error env exp.at "CPSAwait bad cont");
+      check (not (env.flavor.has_await)) "CPSAwait await flavor";
+      check (env.flavor.has_async_typ) "CPSAwait in post-async flavor";
+    | CPSAsync (s, t0), [exp] ->
+      (match typ exp with
+        T.Func(T.Local,T.Returns, [tb],
+          [T.Func(T.Local, T.Returns, [], ts1, []);
+           T.Func(T.Local, T.Returns, [], [t_error], [])],
+          []) ->
+         T.catch <: t_error;
+         T.Async(s, t0, Type.open_ [t0] (T.seq ts1)) <: t
+       | _ -> error env exp.at "CPSAsync unexpected typ");
+      check (not (env.flavor.has_await)) "CPSAsync await flavor";
+      check (env.flavor.has_async_typ) "CPSAsync in post-async flavor";
+      check_typ env t;
+    | ICArgDataPrim, [] ->
+      T.blob <: t
+    | ICReplyPrim ts, [exp1] ->
+      check (not (env.flavor.has_async_typ)) "ICReplyPrim in async flavor";
+      check (T.shared t) "ICReplyPrim is not defined for non-shared operand type";
+      (* TODO: check against expected reply typ; note this may not be env.ret_tys. *)
+      typ exp1 <: (T.seq ts);
+      T.Non <: t
+    | ICRejectPrim, [exp1] ->
+      check (not (env.flavor.has_async_typ)) "ICRejectPrim in async flavor";
+      typ exp1 <: T.text;
+      T.Non <: t
+    | ICCallerPrim, [] ->
+      T.caller <: t
+    | ICCallPrim, [exp1; exp2; k; r] ->
+      let t1 = T.promote (typ exp1) in
+      begin match t1 with
+      | T.Func (sort, T.Replies, _ (*TBR*), arg_tys, ret_tys) ->
+        let t_arg = T.seq arg_tys in
+        typ exp2 <: t_arg;
+        check_concrete env exp.at t_arg;
+        typ k <: T.Func (T.Local, T.Returns, [], ret_tys, []);
+        typ r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+      | T.Non -> () (* dead code, not much to check here *)
+      | _ ->
+         error env exp1.at "expected function type, but expression produces type\n  %s"
+           (T.string_of_typ_expand t1)
+      end
+      (* TODO: T.unit <: t ? *)
+    | ICCallRawPrim, [exp1; exp2; exp3; k; r] ->
+      typ exp1 <: T.principal;
+      typ exp2 <: T.text;
+      typ exp3 <: T.blob;
+      typ k <: T.Func (T.Local, T.Returns, [], [T.blob], []);
+      typ r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+      T.unit <: t
+    | ICMethodNamePrim, [] ->
+      T.text <: t
+    | ICStableRead t1, [] ->
+      check_typ env t1;
+      check (store_typ t1) "Invalid type argument to ICStableRead";
+      t1 <: t
+    | ICStableWrite t1, [exp1] ->
+      check_typ env t1;
+      check (store_typ t1) "Invalid type argument to ICStableWrite";
+      typ exp1 <: t1;
+      T.unit <: t
+    | NumConvWrapPrim (p1, p2), [e] ->
+      (* we should check if this conversion is supported *)
+      typ e <: T.Prim p1;
+      T.Prim p2 <: t
+    | NumConvTrapPrim (p1, p2), [e] ->
+      (* we should check if this conversion is supported *)
+      typ e <: T.Prim p1;
+      T.Prim p2 <: t
+    | CastPrim (t1, t2), [e] ->
+      typ e <: t1;
+      t2 <: t
+    | EncodeUtf8, [e] ->
+      typ e <: T.text;
+      T.blob <: t
+    | DecodeUtf8, [e] ->
+      typ e <: T.blob;
+      T.(Opt text) <: t
+    | BlobOfIcUrl, [e] ->
+      typ e <: T.text;
+      T.blob <: t
+    | IcUrlOfBlob, [e] ->
+      typ e <: T.blob;
+      T.text <: t
+    | ActorOfIdBlob actor_typ, [e] ->
+      typ e <: T.blob;
+      check_typ env actor_typ;
+      begin match T.normalize actor_typ with
+      | T.Obj (T.Actor, _) -> ()
+      | _ -> error env exp.at "ActorOfIdBlob cast to actor object type, not\n   %s"
+           (T.string_of_typ_expand actor_typ)
+      end;
+      actor_typ <: t;
+    | SelfRef t1, [] ->
+      (* We could additionally keep track of the type of the current actor in
+         the environment and see if this lines up. *)
+      t1 <: t;
+    | SystemTimePrim, [] ->
+      T.nat64 <: t;
+    (* Cycles *)
+    | (SystemCyclesBalancePrim | SystemCyclesAvailablePrim | SystemCyclesRefundedPrim), [] ->
+      T.nat <: t
+    | SystemCyclesAcceptPrim, [e1] ->
+      typ e1 <: T.nat;
+      T.nat <: t
+    | SystemCyclesAddPrim, [e1] ->
+      typ e1 <: T.nat;
+      T.unit <: t
+    (* Certified Data *)
+    | SetCertifiedData, [e1] ->
+      typ e1 <: T.blob;
+      T.unit <: t
+    | GetCertificate, [] ->
+      T.Opt T.blob <: t
+    | ICPerformGC, [] ->
+      T.unit <: t
+    | ICStableSize t1, [e1] ->
+      typ e1 <: t1;
+      T.nat64 <: t
+    | OtherPrim _, _ -> ()
+    | p, args ->
+      error env exp.at "PrimE %s does not work with %d arguments"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.prim p)) (List.length args);
+    end
+  | AssignE (lexp1, exp2) ->
+    check_lexp env lexp1;
+    check_exp env exp2;
+    let t2 = try T.as_mut lexp1.note with
+       Invalid_argument _ -> error env exp.at "expected mutable assignment target"
+    in
+    typ exp2 <: t2;
+    T.unit <: t
+  | BlockE (ds, exp1) ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds;
+    check_exp env' exp1;
+    typ exp1 <: t
+  | IfE (exp1, exp2, exp3) ->
+    check_exp env exp1;
+    typ exp1 <: T.bool;
+    check_exp env exp2;
+    typ exp2 <: t;
+    check_exp env exp3;
+    typ exp3 <: t
+  | SwitchE (exp1, cases) ->
+    check_exp env exp1;
+    let t1 = T.promote (typ exp1) in
+(*    if not env.pre then
+      if not (Coverage.check_cases env.cons cases t1) then
+        warn env exp.at "the cases in this switch do not cover all possible values";
+ *)
+    check_cases env t1 t cases
+  | TryE (exp1, cases) ->
+    check env.flavor.has_await "try in non-await flavor";
+    check (env.async <> None) "misplaced try";
+    check_exp env exp1;
+    typ exp1 <: t;
+    check_cases env T.catch t cases;
+  | LoopE exp1 ->
+    check_exp { env with lvl = NotTopLvl } exp1;
+    typ exp1 <: T.unit;
+    T.Non <: t (* vacuously true *)
+  | LabelE (id, t0, exp1) ->
+    assert (t0 <> T.Pre);
+    check_typ env t0;
+    check_exp (add_lab env id t0) exp1;
+    typ exp1 <: t0;
+    t0 <: t
+  | AsyncE (s, tb, exp1, t0) ->
+    check env.flavor.has_await "async expression in non-await flavor";
+    check_typ env t0;
+    let c, tb, ce = check_open_typ_bind env tb in
+    let t1 = typ exp1 in
+    let env' =
+      {(adjoin_cons env ce)
+       with labs = T.Env.empty; rets = Some t1; async = Some c; lvl = NotTopLvl} in
+    check_exp env' exp1;
+    let t1' = T.open_ [t0] (T.close [c] t1)  in
+    t1' <: T.Any; (* vacuous *)
+    (* check t1' shared when Fut? *)
+    T.Async (s, t0, t1') <: t
+  | DeclareE (id, t0, exp1) ->
+    check_mut_typ env t0;
+    let val_info = { typ = t0; loc_known = false; const = false } in
+    let env' = adjoin_vals env (T.Env.singleton id val_info) in
+    check_exp env' exp1;
+    typ exp1 <: t
+  | DefineE (id, mut, exp1) ->
+    check_exp env exp1;
+    begin
+      match T.Env.find_opt id env.vals with
+      | None -> error env exp.at "unbound variable %s" id
+      | Some { typ = t0; const; loc_known } ->
+        check (not const) "cannot use DefineE on const variable";
+        match mut with
+        | Const ->
+          typ exp1 <: t0
+        | Var ->
+          let t0 = try T.as_mut t0 with
+                   | Invalid_argument _ ->
+                     error env exp.at "expected mutable %s" (T.string_of_typ t0)
+          in
+          typ exp1 <: t0
+    end;
+    T.unit <: t
+  | FuncE (x, sort, control, typ_binds, args, ret_tys, exp) ->
+    let cs, tbs, ce = check_open_typ_binds env typ_binds in
+    let ts = List.map (fun c -> T.Con(c, [])) cs in
+    let env' = adjoin_cons env ce in
+    let ve = check_args env' args in
+    List.iter (check_typ env') ret_tys;
+    check ((T.is_shared_sort sort && control = T.Promises) ==> isAsyncE exp)
+      "shared function with async type has non-async body";
+    if T.is_shared_sort sort then List.iter (check_concrete env exp.at) ret_tys;
+    let codom = T.codom control (fun () -> List.hd ts) ret_tys in
+    let env'' =
+      {env' with labs = T.Env.empty; rets = Some codom; async = None; lvl = NotTopLvl} in
+    check_exp (adjoin_vals env'' ve) exp;
+    check_sub env' exp.at (typ exp) codom;
+    (* Now construct the function type and compare with the annotation *)
+    let ts1 = List.map (fun a -> a.note) args in
+    if T.is_shared_sort sort then List.iter (check_concrete env exp.at) ts1;
+    let fun_ty = T.Func
+      ( sort, control
+      , tbs, List.map (T.close cs) ts1, List.map (T.close cs) ret_tys
+      ) in
+    fun_ty <: t
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    check (not env.flavor.Ir.has_async_typ) "SelfCallE in async flavor";
+    List.iter (check_typ env) ts;
+    check_exp { env with lvl = NotTopLvl } exp_f;
+    check_exp env exp_k;
+    check_exp env exp_r;
+    typ exp_f <: T.unit;
+    typ exp_k <: T.Func (T.Local, T.Returns, [], ts, []);
+    typ exp_r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+  | ActorE (ds, fs,
+      { preupgrade; postupgrade; meta; heartbeat; timer; inspect }, t0) ->
+    (* TODO: check meta *)
+    let env' = { env with async = None } in
+    let scope1 = gather_block_decs env' ds in
+    let env'' = adjoin env' scope1 in
+    check_decs env'' ds;
+    check_exp env'' preupgrade;
+    check_exp env'' postupgrade;
+    check_exp env'' heartbeat;
+    check_exp env'' timer;
+    check_exp env'' inspect;
+    typ preupgrade <: T.unit;
+    typ postupgrade <: T.unit;
+    typ heartbeat <: T.unit;
+    typ timer <: T.unit;
+    typ inspect <: T.unit;
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    (type_obj env'' T.Actor fs) <: (T.Obj (s0, val_tfs0));
+    t0 <: t;
+  | NewObjE (s, fs, t0) ->
+    (* check object *)
+    let t1 = type_obj env s fs in
+    check_typ env t1;
+
+    (* check annotation *)
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    t1 <: T.Obj (s0, val_tfs0);
+
+    t0 <: t
+  end;
+  (* check const annotation *)
+  (* see ir_passes/const.ml for an explanation *)
+  let check_var ctxt v =
+    if not (T.Env.find v env.vals).const then
+      error env exp.at "const %s with non-const variable %s" ctxt v in
+  if exp.note.Note.const
+  then begin
+    match exp.it with
+    | VarE id -> check_var "VarE" id
+    | FuncE (x, s, c, tp, as_ , ts, body) ->
+      check (s = T.Local) "constant FuncE cannot be of shared sort";
+      if env.lvl = NotTopLvl then
+      Freevars.M.iter (fun v _ ->
+        if (T.Env.find v env.vals).loc_known then () else
+        check_var "FuncE" v
+      ) (Freevars.exp exp)
+    | NewObjE (Type.(Object | Module), fs, t) when T.is_immutable_obj t ->
+      List.iter (fun f -> check_var "NewObjE" f.it.var) fs
+    | PrimE (ArrayPrim (Const, _), es) ->
+      List.iter (fun e1 ->
+        check e1.note.Note.const "constant array with non-constant subexpression"
+      ) es
+    | PrimE (TupPrim, es) ->
+      List.iter (fun e1 ->
+        check e1.note.Note.const "constant tuple with non-constant subexpression"
+      ) es
+    | PrimE (DotPrim _, [e1]) ->
+      check e1.note.Note.const "constant DotPrim on non-constant subexpression"
+    | PrimE (ProjPrim _, [e1]) ->
+      check e1.note.Note.const "constant ProjPrim on non-constant subexpression"
+    | PrimE (OptPrim, [e1]) ->
+      check e1.note.Note.const "constant OptPrim with non-constant subexpression"
+    | PrimE (TagPrim _, [e1]) ->
+      check e1.note.Note.const "constant TagPrim with non-constant subexpression"
+    | BlockE (ds, e) ->
+      List.iter (fun d -> match d.it with
+        | VarD _ | RefD _ -> check false "VarD/RefD in constant BlockE"
+        | LetD (p, e1) ->
+          check (Ir_utils.is_irrefutable p) "refutable pattern in constant BlockE";
+          check e1.note.Note.const "non-constant RHS in constant BlockE"
+      ) ds;
+      check e.note.Note.const "non-constant body in constant BlockE"
+    | LitE _ -> ()
+    | _ -> check false "unexpected constant expression"
+  end;
+
+
+and check_lexp env (lexp:Ir.lexp) : unit =
+  (* helpers *)
+  let check p = check env lexp.at p in
+  let (<:) t1 t2 = check_sub env lexp.at t1 t2 in
+  (* check type annotation *)
+  let t = lexp.note in
+  (match t with
+  | T.Mut t -> check_typ env t
+  | t -> error env lexp.at "lexp with non-mutable type");
+  (* check typing *)
+  match lexp.it with
+  | VarLE id ->
+    let { typ = t0; const; loc_known } =
+      try T.Env.find id env.vals
+      with Not_found -> error env lexp.at "unbound variable %s" id
+    in
+    check (not const) "cannot assign to constant variable";
+    t0 <: t
+  | DotLE (exp1, n) ->
+    begin
+      check_exp env exp1;
+      let t1 = typ exp1 in
+      let sort, tfs =
+        try T.as_obj_sub [n] t1 with Invalid_argument _ ->
+          error env exp1.at "expected object type, but expression produces type\n  %s"
+            (T.string_of_typ_expand t1)
+      in
+      check (sort <> T.Actor) "sort mismatch";
+      try T.lookup_val_field n tfs <: t with Invalid_argument _ ->
+        error env exp1.at "field name %s does not exist in type\n  %s"
+          n (T.string_of_typ_expand t1)
+    end
+  | IdxLE (exp1, exp2) ->
+    check_exp env exp1;
+    check_exp env exp2;
+    let t1 = T.promote (typ exp1) in
+    let t2 = try T.as_array_sub t1 with
+             | Invalid_argument _ ->
+               error env exp1.at "expected array type, but expression produces type\n  %s"
+                                       (T.string_of_typ_expand t1)
+    in
+    typ exp2 <: T.nat;
+    t2 <: t
+
+(* Cases *)
+
+and check_cases env t_pat t cases =
+  List.iter (check_case env t_pat t) cases
+
+and check_case env t_pat t {it = {pat; exp}; _} =
+  let ve = check_pat env pat in
+  check_sub env pat.at t_pat pat.note;
+  check_exp (adjoin_vals env ve) exp;
+  check env pat.at (T.sub (typ exp) t) "bad case"
+
+(* Arguments *)
+
+and check_args env args =
+  let rec go ve = function
+    | [] -> ve
+    | a::as_ ->
+      if (T.Env.mem a.it ve) then
+        error env a.at "duplicate binding for %s in argument list" a.it;
+      check_typ env a.note;
+      let val_info = {typ = a.note; const = false; loc_known = env.lvl = TopLvl } in
+      let env' = T.Env.add a.it val_info ve in
+      go env' as_
+  in go T.Env.empty args
+
+(* Patterns *)
+
+and gather_pat env const ve0 pat : val_env =
+  let rec go ve pat =
+    match pat.it with
+    | WildP
+    | LitP _ ->
+      ve
+    | VarP id ->
+      if T.Env.mem id ve0 then
+        error env pat.at "duplicate binding for %s in block" id;
+      let val_info = {typ = pat.note; const; loc_known = env.lvl = TopLvl} in
+      T.Env.add id val_info ve (*TBR*)
+    | TupP pats ->
+      List.fold_left go ve pats
+    | ObjP pfs ->
+      List.fold_left go ve (pats_of_obj_pat pfs)
+    | AltP (pat1, pat2) ->
+      let ve1, ve2 = go ve pat1, go ve pat2 in
+      let common i1 i2 = { typ = T.lub i1.typ i2.typ; loc_known = i1.loc_known && i2.loc_known; const = i1.const && i2.const } in
+      T.Env.merge (fun _ -> Lib.Option.map2 common) ve1 ve2
+    | OptP pat1
+    | TagP (_, pat1) ->
+      go ve pat1
+  in T.Env.adjoin ve0 (go T.Env.empty pat)
+
+and check_pat_exhaustive env pat : val_env =
+  let  ve = check_pat env pat in
+  (* TODO: actually check exhaustiveness *)
+  ve
+
+and check_pat env pat : val_env =
+  assert (pat.note <> T.Pre);
+  let (<:) = check_sub env pat.at in
+  let t = pat.note in
+  match pat.it with
+  | WildP -> T.Env.empty
+  | VarP id -> T.Env.singleton id { typ = pat.note; const = false; loc_known = env.lvl = TopLvl }
+  | LitP NullLit ->
+    t <: T.Opt T.Any;
+    T.Env.empty
+  | LitP lit ->
+    let t1 = T.Prim (type_lit env lit pat.at) in
+    let t1' = if T.eq t1 T.nat then T.int else t1 in  (* account for subtyping *)
+    t <: t1';
+    T.Env.empty
+  | TupP pats ->
+    let ve = check_pats pat.at env pats T.Env.empty in
+    let ts = List.map (fun pat -> pat.note) pats in
+    t <: T.Tup ts;
+    ve
+  | ObjP pfs ->
+    let ve = check_pats pat.at env (pats_of_obj_pat pfs) T.Env.empty in
+    check_pat_fields env t pfs;
+    ve
+  | OptP pat1 ->
+    let ve = check_pat env pat1 in
+    t <: T.Opt pat1.note;
+    ve
+  | TagP (l, pat1) ->
+    let ve = check_pat env pat1 in
+    check_pat_tag env t l pat1;
+    ve
+  | AltP (pat1, pat2) ->
+    let ve1, ve2 = check_pat env pat1, check_pat env pat2 in
+    t <: pat1.note;
+    t <: pat2.note;
+    if T.Env.(keys ve1 <> keys ve2) then
+        error env pat.at "set of bindings differ for alternative pattern";
+    let common i1 i2 = { typ = T.lub i1.typ i2.typ; loc_known = i1.loc_known && i2.loc_known; const = i1.const && i2.const } in
+    T.Env.merge (fun _ -> Lib.Option.map2 common) ve1 ve2
+
+and check_pats at env pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve1 = check_pat env pat in
+    let ve' = disjoint_union env at "duplicate binding for %s in pattern" ve ve1 in
+    check_pats at env pats' ve'
+
+and check_pat_fields env t = List.iter (check_pat_field env t)
+
+and check_pat_field env t (pf : pat_field) =
+  let lab = pf.it.name in
+  let tf = T.{lab; typ = pf.it.pat.note; depr = None} in
+  let s, tfs = T.as_obj_sub [lab] t in
+  let (<:) = check_sub env pf.it.pat.at in
+  t <: T.Obj (s, [tf]);
+  if T.is_mut (T.lookup_val_field lab tfs) then
+    error env pf.it.pat.at "cannot match mutable field %s" lab
+
+and check_pat_tag env t l pat =
+  let (<:) = check_sub env pat.at in
+  match T.lookup_val_field_opt l (T.as_variant_sub l t) with
+  | Some t -> t <: pat.note
+  | None -> ()
+
+(* Objects *)
+
+and type_obj env s fs : T.typ =
+  let tfs = type_exp_fields env s fs in
+  T.Obj (s, tfs)
+
+and type_exp_fields env s fs : T.field list =
+  let tfs = List.map (type_exp_field env s) fs in
+  List.sort T.compare_field tfs
+
+and type_exp_field env s f : T.field =
+  let {name; var} = f.it in
+  let { typ = t; const; loc_known } =
+    try T.Env.find var env.vals
+    with Not_found -> error env f.at "field typing for %s not found" name
+  in
+  assert (t <> T.Pre);
+  check_sub env f.at t f.note;
+  if not (T.is_typ t) then begin
+    check env f.at ((s = T.Actor) ==> T.is_shared_func t)
+      "public actor field must have shared function type";
+  end;
+  T.{lab = name; typ = t; depr = None}
+
+(* Declarations *)
+
+and check_open_typ_binds env typ_binds =
+  let cs = List.map (fun tp -> tp.it.con) typ_binds in
+  let ce = List.fold_right (fun c ce -> T.ConSet.disjoint_add c ce) cs T.ConSet.empty in
+  let tbs = close_typ_binds cs (List.map (fun tb -> tb.it) typ_binds) in
+  let _ = check_typ_binds env tbs in
+  cs, tbs, ce
+
+and check_open_typ_bind env typ_bind =
+  match check_open_typ_binds env [typ_bind] with
+  | [c], [tb], ce -> c, tb, ce
+  | _ -> assert false
+
+and close_typ_binds cs tbs =
+  List.map (fun {con; sort; bound} -> {Type.var = Cons.name con; sort = sort; bound = Type.close cs bound}) tbs
+
+and check_dec env dec  =
+  (* helpers *)
+  let (<:) t1 t2 = check_sub env dec.at t1 t2 in
+  match dec.it with
+  | LetD (pat, exp) ->
+    ignore (check_pat_exhaustive env pat);
+    check_exp env exp;
+    typ exp <: pat.note
+  | VarD (id, t, exp) ->
+    check_exp env exp;
+    typ exp <: t
+  | RefD (id, t, lexp) ->
+    check_lexp env lexp;
+    lexp.note <: t
+
+and check_decs env decs  =
+  List.iter (check_dec env) decs;
+
+and gather_block_decs env decs =
+  List.fold_left (gather_dec env) empty_scope decs
+
+and gather_dec env scope dec : scope =
+  match dec.it with
+  | LetD (pat, exp) ->
+    { val_env = gather_pat env exp.note.Note.const scope.val_env pat }
+  | VarD (id, t, exp) ->
+    check_typ env t;
+    check env dec.at
+      (not (T.Env.mem id scope.val_env))
+      "duplicate variable definition in block";
+    let val_info = {typ = T.Mut t; const = false; loc_known = env.lvl = TopLvl} in
+    { val_env = T.Env.add id val_info scope.val_env }
+  | RefD (id, t, lexp) ->
+    check_mut_typ env t;
+    check env dec.at
+      (not (T.Env.mem id scope.val_env))
+      "duplicate variable definition in block";
+    let val_info = {typ = t; const = false; loc_known = false} in
+    { val_env = T.Env.add id val_info scope.val_env }
+
+(* Programs *)
+
+let check_comp_unit env = function
+  | LibU (ds, e) ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds;
+    check_exp env' e;
+  | ProgU ds ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds
+  | ActorU (as_opt, ds, fs,
+      { preupgrade; postupgrade; meta; heartbeat; timer; inspect }, t0) ->
+    let check p = check env no_region p in
+    let (<:) t1 t2 = check_sub env no_region t1 t2 in
+    let env' = match as_opt with
+      | None -> { env with async = None }
+      | Some as_ ->
+        let ve = check_args env as_ in
+        List.iter (fun a -> check_shared env no_region a.note) as_;
+        adjoin_vals { env with async = None } ve
+    in
+    let scope1 = gather_block_decs env' ds in
+    let env'' = adjoin env' scope1 in
+    check_decs env'' ds;
+    check_exp env'' preupgrade;
+    check_exp env'' postupgrade;
+    check_exp env'' heartbeat;
+    check_exp env'' timer;
+    check_exp env'' inspect;
+    typ preupgrade <: T.unit;
+    typ postupgrade <: T.unit;
+    typ heartbeat <: T.unit;
+    typ timer <: T.unit;
+    typ inspect <: T.unit;
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    type_obj env'' T.Actor fs <: T.Obj (s0, val_tfs0);
+    () (* t0 <: t *)
+
+let check_prog verbose phase ((cu, flavor) as prog) : unit =
+  let env = initial_env flavor in
+  try check_comp_unit env cu
+  with CheckFailed s ->
+    let bt = Printexc.get_backtrace () in
+    if verbose
+    then begin
+      Printf.eprintf "Ill-typed intermediate code after %s:\n" phase;
+      Printf.eprintf "%s" (Wasm.Sexpr.to_string 80 (Arrange_ir.prog prog));
+      Printf.eprintf "%s" s;
+      Printf.eprintf "%s" bt;
+    end else begin
+      Printf.eprintf "Ill-typed intermediate code after %s (use -v to see dumped IR):\n" phase;
+      Printf.eprintf "%s" s;
+      Printf.eprintf "%s" bt;
+    end;
+    exit 1
+
+
+
+ + + diff --git a/coverage/ir_def/construct.ml.html b/coverage/ir_def/construct.ml.html new file mode 100644 index 00000000000..e495d6b5a27 --- /dev/null +++ b/coverage/ir_def/construct.ml.html @@ -0,0 +1,2397 @@ + + + + + construct.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+
+

+(* WIP translation of syntaxops to use IR in place of Source *)
+open Source
+open Ir
+open Ir_effect
+open Mo_values
+module Cons = Mo_types.Cons
+module T = Mo_types.Type
+
+(* Field names *)
+
+let nameN s = s
+
+let nextN = "next"
+
+(* Identifiers *)
+
+type var = (string * T.typ)
+
+let var id typ = (id, typ)
+
+let id_of_var (id, _) = id
+let typ_of_var (_, typ) = typ
+
+(* Fresh id generation *)
+
+module Stamps = Map.Make(String)
+let id_stamps = ref Stamps.empty
+
+let fresh name_base () : string =
+  let n = Lib.Option.get (Stamps.find_opt name_base !id_stamps) 0 in
+  id_stamps := Stamps.add name_base (n + 1) !id_stamps;
+  Printf.sprintf "$%s/%i" name_base n
+
+let fresh_id name_base () : id =
+  fresh name_base ()
+
+let fresh_var name_base typ : var =
+  let name = fresh name_base () in
+  var name typ
+
+let fresh_vars name_base ts =
+  List.mapi (fun i t -> fresh_var (Printf.sprintf "%s%i" name_base i) t) ts
+
+(* type arguments *)
+
+let typ_arg c sort typ =
+  { it = { Ir.con = c; Ir.sort = sort; Ir.bound = typ };
+    at = no_region;
+    note = () }
+
+(* Patterns *)
+
+let varP (n, typ) =
+  { it = VarP n;
+    at = no_region;
+    note = typ
+  }
+
+let tupP pats =
+  { it = TupP pats;
+    note = T.Tup (List.map (fun p -> p.note) pats);
+    at = no_region }
+
+let seqP ps =
+  match ps with
+  | [p] -> p
+  | ps -> tupP ps
+
+let wildP =
+  { it = WildP;
+    at = no_region;
+    note = T.Any
+  }
+
+(* Primitives *)
+
+let varE (id, typ) =
+  { it = VarE id; at = no_region; note = Note.{ def with typ = T.as_immut typ } }
+
+let varLE (id, typ) =
+  { it = VarLE id; at = no_region; note = typ }
+
+let primE prim es =
+  let typ = match prim with
+    | ShowPrim _ -> T.text
+    | ICArgDataPrim -> T.blob
+    | ICReplyPrim _
+    | ICRejectPrim -> T.Non
+    | ICCallerPrim -> T.caller
+    | ICStableRead t -> t
+    | ICMethodNamePrim -> T.text
+    | ICPerformGC
+    | ICStableWrite _ -> T.unit
+    | ICStableSize _ -> T.nat64
+    | IdxPrim
+    | DerefArrayOffset -> T.(as_immut (as_array_sub (List.hd es).note.Note.typ))
+    | ValidArrayOffset -> T.bool
+    | NextArrayOffset _
+    | GetPastArrayOffset _ -> T.nat
+    | IcUrlOfBlob -> T.text
+    | ActorOfIdBlob t -> t
+    | BinPrim (t, _) -> t
+    | CastPrim (t1, t2) -> t2
+    | RelPrim _ -> T.bool
+    | SerializePrim _ -> T.blob
+    | SystemCyclesAvailablePrim
+    | SystemCyclesAcceptPrim -> T.nat
+    | DeserializePrim ts -> T.seq ts
+    | DeserializeOptPrim ts -> T.Opt (T.seq ts)
+    | OtherPrim "trap" -> T.Non
+    | OtherPrim "call_perform_status" -> T.(Prim Nat32)
+    | OtherPrim "call_perform_message" -> T.text
+    | OtherPrim "array_len"
+    | OtherPrim "blob_size"
+    | OtherPrim "text_len" -> T.nat
+    | OtherPrim "is_controller" -> T.bool
+    | _ -> assert false (* implement more as needed *)
+  in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (prim, es);
+    at = no_region;
+    note = Note.{ def with typ; eff }
+  }
+
+let selfRefE typ =
+  { it = PrimE (SelfRef typ, []);
+    at = no_region;
+    note = Note.{ def with typ }
+  }
+
+
+let assertE e =
+  { it = PrimE (AssertPrim, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+
+let asyncE s typ_bind e typ1 =
+  { it = AsyncE (s, typ_bind, e, typ1);
+    at = no_region;
+    note =
+      Note.{ def with typ = T.Async (s, typ1, typ e);
+                      eff = T.(if s = Fut then Await else Triv) }
+  }
+
+let awaitE s e =
+  let (s, _ , typ) = T.as_async (T.normalize (typ e)) in
+  { it = PrimE (AwaitPrim s, [e]);
+    at = no_region;
+    note = Note.{ def with typ; eff = T.Await }
+  }
+
+let cps_asyncE s typ1 typ2 e =
+  { it = PrimE (CPSAsync (s, typ1), [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.Async (s, typ1, typ2); eff = eff e }
+  }
+
+let cps_awaitE s cont_typ e1 e2 =
+  match cont_typ with
+  | T.Func(T.Local, T.Returns, [], _, ts2) ->
+    { it = PrimE (CPSAwait (s, cont_typ), [e1; e2]);
+      at = no_region;
+      note = Note.{ def with typ = T.seq ts2; eff = max_eff (eff e1) (eff e2) }
+    }
+  | _ -> assert false
+
+let ic_replyE ts e =
+  (match ts with
+  | [t] -> assert (T.sub (e.note.Note.typ) t)
+  | _ -> assert (T.sub (T.Tup ts) (e.note.Note.typ)));
+  { it = PrimE (ICReplyPrim ts, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+let ic_rejectE e =
+  { it = PrimE (ICRejectPrim, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+let ic_callE f e k r =
+  let es = [f; e; k; r] in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (ICCallPrim, es);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff }
+  }
+
+let ic_call_rawE p m a k r =
+  let es = [p; m; a; k; r] in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (ICCallRawPrim, es);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff }
+  }
+
+(* tuples *)
+
+let projE e n =
+  match T.promote (typ e) with
+  | T.Tup ts ->
+     { it = PrimE (ProjPrim n, [e]);
+       note = Note.{ def with typ = List.nth ts n; eff = eff e };
+       at = no_region;
+     }
+  | _ -> failwith "projE"
+
+let optE e =
+ { it = PrimE (OptPrim, [e]);
+   note = Note.{ def with typ = T.Opt (typ e); eff = eff e };
+   at = no_region;
+ }
+
+let tagE i e =
+ { it = PrimE (TagPrim i, [e]);
+   note = Note.{ def with typ = T.Variant [{T.lab = i; typ = typ e; depr = None}]; eff = eff e };
+   at = no_region;
+ }
+
+let dec_eff dec = match dec.it with
+  | LetD (_, e) | VarD (_, _, e) -> eff e
+  | RefD (_, _, le) ->
+    match le.it with
+    | DotLE (e, _) -> eff e
+    | _ -> assert false (*FIXME*)
+
+let rec simpl_decs decs = List.concat_map simpl_dec decs
+and simpl_dec dec = match dec.it with
+  | LetD ({it = WildP;_}, {it = PrimE (TupPrim, []);_}) ->
+    []
+  | LetD ({it = TupP ps;_}, {it = PrimE (TupPrim, es);_}) when List.length ps = List.length es ->
+    simpl_decs (List.map2 (fun p e -> LetD (p, e) @@ p.at) ps es)
+  | _ ->
+    [ dec ]
+
+let blockE decs exp =
+  let decs' = simpl_decs decs in
+  match decs' with
+  | [] -> exp
+  | _ ->
+    let es = List.map dec_eff decs' in
+    let typ = typ exp in
+    let eff =  List.fold_left max_eff (eff exp) es in
+    { it = BlockE (decs', exp);
+      at = no_region;
+      note = Note.{ def with typ; eff }
+    }
+
+let nat32E n =
+  { it = LitE (Nat32Lit n);
+    at = no_region;
+    note = Note.{ def with typ = T.(Prim Nat32) }
+  }
+
+let natE n =
+  { it = LitE (NatLit n);
+    at = no_region;
+    note = Note.{ def with typ = T.nat }
+  }
+
+let textE s =
+  { it = LitE (TextLit s);
+    at = no_region;
+    note = Note.{ def with typ = T.text }
+  }
+
+let blobE s =
+  { it = LitE (BlobLit s);
+    at = no_region;
+    note = Note.{ def with typ = T.blob }
+  }
+
+let boolE b =
+  { it = LitE (BoolLit b);
+    at = no_region;
+    note = Note.{ def with typ = T.bool }
+  }
+
+let nullE () =
+  { it = LitE NullLit;
+    at = no_region;
+    note = Note.{ def with typ = T.Prim T.Null }
+  }
+
+
+(* Functions *)
+
+let funcE name sort ctrl typ_binds args typs exp =
+  let cs = List.map (function { it = {con;_ }; _ } -> con) typ_binds in
+  let tbs = List.map (function { it = { sort; bound; con}; _ } ->
+    {T.var = Cons.name con; T.sort; T.bound = T.close cs bound})
+    typ_binds
+  in
+  let ts1 = List.map (function arg -> T.close cs arg.note) args in
+  let ts2 = List.map (T.close cs) typs in
+  let typ = T.Func(sort, ctrl, tbs, ts1, ts2) in
+  { it = FuncE(name, sort, ctrl, typ_binds, args, typs, exp);
+    at = no_region;
+    note = Note.{ def with typ; eff = T.Triv };
+  }
+
+let callE exp1 typs exp2 =
+  let typ =  match T.promote (typ exp1) with
+    | T.Func (_sort, control, _, _, ret_tys) ->
+      T.codom control (fun () -> List.hd typs) (List.map (T.open_ typs) ret_tys)
+    | T.Non -> T.Non
+    | _ -> raise (Invalid_argument "callE expect a function")
+  in
+  let p = CallPrim typs in
+  let es = [exp1; exp2] in
+  { it = PrimE (p, es);
+    at = no_region;
+    note = Note.{ def with
+     typ;
+     eff = Ir_effect.infer_effect_prim p es
+    }
+  }
+
+
+let ifE exp1 exp2 exp3 =
+  { it = IfE (exp1, exp2, exp3);
+    at = no_region;
+    note = Note.{ def with
+      typ = T.lub (typ exp2) (typ exp3);
+      eff = max_eff (eff exp1) (max_eff (eff exp2) (eff exp3))
+    }
+  }
+
+let falseE () = boolE false
+let trueE () = boolE true
+let notE : Ir.exp -> Ir.exp = fun e ->
+  primE (RelPrim (T.bool, Operator.EqOp)) [e; falseE ()]
+
+let andE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  ifE e1 e2 (falseE ())
+let orE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  ifE e1 (trueE ()) e2
+let impliesE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  orE (notE e1) e2
+let oldE : Ir.exp -> Ir.exp = fun e ->
+  { it = (primE (CallPrim [typ e]) [e]).it;
+    at = no_region;
+    note = Note.{ def with
+      typ = typ e;
+    }
+  }
+
+let rec conjE : Ir.exp list -> Ir.exp = function
+  | [] -> trueE ()
+  | [x] -> x
+  | (x::xs) -> andE x (conjE xs)
+
+let dotE exp name typ =
+  { it = PrimE (DotPrim name, [exp]);
+    at = no_region;
+    note = Note.{ def with
+      typ = typ;
+      eff = eff exp
+    }
+  }
+
+let switch_optE exp1 exp2 pat exp3 typ1  =
+  { it =
+      SwitchE
+        (exp1,
+         [{ it = {pat = {it = LitP NullLit;
+                         at = no_region;
+                         note = typ exp1};
+                  exp = exp2};
+            at = no_region;
+           note = () };
+          { it = {pat = {it = OptP pat;
+                        at = no_region;
+                        note = typ exp1};
+                  exp = exp3};
+            at = no_region;
+            note = () }]
+        );
+    at = no_region;
+    note = Note.{ def with
+      typ = typ1;
+      eff = max_eff (eff exp1) (max_eff (eff exp2) (eff exp3))
+    }
+  }
+
+let switch_variantE exp1 cases typ1 =
+  { it =
+      SwitchE (exp1,
+        List.map (fun (l,p,e) ->
+          { it = {pat = {it = TagP (l, p);
+                         at = no_region;
+                         note = typ exp1};
+                  exp = e};
+            at = no_region;
+            note = ()
+          })
+          cases
+      );
+    at = no_region;
+    note = Note.{ def with
+      typ = typ1;
+      eff = List.fold_left max_eff (eff exp1) (List.map (fun (l,p,e) -> eff e) cases)
+    }
+  }
+
+let switch_textE exp1 cases (pat, exp2) typ1 =
+  let cs =
+    (List.map (fun (t, e) ->
+      {it = {pat =
+        {it = LitP (TextLit t);
+         at = no_region;
+         note = typ exp1};
+         exp = e};
+         at = no_region;
+         note = ()})
+      cases) @
+    [{it = {pat = pat; exp = exp2};
+      at = no_region;
+      note = ()}]
+  in
+  { it = SwitchE (exp1, cs);
+    at = no_region;
+    note = Note.{
+      def with
+      typ = typ1;
+      eff = List.fold_left max_eff (eff exp1) (List.map (fun c -> eff c.it.exp) cs)
+    }
+  }
+
+
+let tupE exps =
+  let effs = List.map eff exps in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (TupPrim, exps);
+    at = no_region;
+    note = Note.{ def with typ = T.Tup (List.map typ exps); eff };
+  }
+
+let unitE () = tupE []
+
+let breakE l exp =
+  { it = PrimE (BreakPrim l, [exp]);
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp };
+  }
+
+let retE exp =
+  { it = PrimE (RetPrim, [exp]);
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp };
+  }
+
+let immuteE e =
+  { e with
+    note = Note.{ def with typ = T.as_immut (typ e); eff = eff e };
+  }
+
+let assignE v exp2 =
+  assert (T.is_mut (typ_of_var v));
+  { it = AssignE (varLE v, exp2);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff exp2 };
+  }
+
+let labelE l typ exp =
+  { it = LabelE (l, typ, exp);
+    at = no_region;
+    note = Note.{ def with typ; eff = eff exp }
+  }
+
+(* Used to desugar for loops, while loops and loop-while loops. *)
+let loopE exp =
+  { it = LoopE exp;
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp }
+  }
+
+let declare_idE x typ exp1 =
+  { it = DeclareE (x, typ, exp1);
+    at = no_region;
+    note = exp1.note;
+  }
+
+let define_idE x mut exp1 =
+  { it = DefineE (x, mut, exp1);
+    at = no_region;
+    note = Note.{ def with typ = T.unit }
+  }
+
+let newObjE sort ids typ =
+  { it = NewObjE (sort, ids, typ);
+    at = no_region;
+    note = Note.{ def with typ }
+  }
+
+
+(* Declarations *)
+
+let letP pat exp = LetD (pat, exp) @@ no_region
+
+let letD x exp = letP (varP x) exp
+
+let varD x exp =
+  let t = typ_of_var x in
+  assert (T.is_mut t);
+  VarD (id_of_var x, T.as_immut t, exp) @@ no_region
+
+let refD x lexp =
+  let t = typ_of_var x in
+  assert (T.is_mut t);
+  RefD (id_of_var x, t, lexp) @@ no_region
+
+let expD exp =
+  let pat = { it = WildP; at = exp.at; note = exp.note.Note.typ } in
+  LetD (pat, exp) @@ exp.at
+
+let let_no_shadow (id, typ) exp decs =
+  (* could be replaced by a more simple “defined by this decs” function *)
+  let (_,f) = Freevars.decs decs in
+  if Freevars.M.mem id f
+  then decs
+  else [ letD (id, typ) exp ] @ decs
+
+(* Derived expressions *)
+
+let letE x exp1 exp2 = blockE [letD x exp1] exp2
+
+let thenE exp1 exp2 = blockE [expD exp1] exp2
+
+let ignoreE exp =
+  if typ exp = T.unit
+  then exp
+  else thenE exp (unitE ())
+
+and let_else_switch p e f =
+  let v = fresh_var "v" (e.note.Note.typ) in
+  (* Evaluate e once, assign it to variable v, and pattern match on v. If v
+     matches p, expression evaluates to v. Otherwise evaluate f. *)
+  blockE
+    [letD v e]
+    {
+      e with
+      it = SwitchE(
+        varE v,
+        [
+          { it = { pat = p; exp = varE v }; at = e.at; note = () };
+          { it = { pat = wildP; exp = f }; at = f.at ; note = () }
+        ]
+      );
+      note = Note.{ def with
+        typ = e.note.Note.typ;
+        eff = max_eff (eff e) (eff f)
+      }
+    }
+
+(* Mono-morphic function expression *)
+
+let arg_of_var (id, typ) =
+  { it = id; at = no_region; note = typ }
+
+let var_of_arg { it = id; note = typ; _} = (id, typ)
+
+let unary_funcE name typ x exp =
+  let sort, control, arg_tys, ret_tys = match typ with
+    | T.Func(s, c, _, ts1, ts2) -> s, c, ts1, ts2
+    | _ -> assert false in
+  let args, exp' =
+    if List.length arg_tys = 1;
+    then
+      [ arg_of_var x ], exp
+    else
+      let vs = fresh_vars "param" arg_tys in
+      List.map arg_of_var vs,
+      blockE [letD x (tupE (List.map varE vs))] exp
+  in
+  ({it = FuncE
+     ( name,
+       sort,
+       control,
+       [],
+       args,
+       (* TODO: Assert invariant: retty has no free (unbound) DeBruijn indices -- Claudio *)
+       ret_tys,
+       exp'
+     );
+    at = no_region;
+    note = Note.{ def with typ }
+   })
+
+let nary_funcE name typ xs exp =
+  let sort, control, arg_tys, ret_tys = match typ with
+    | T.Func(s, c, _, ts1, ts2) -> s, c, ts1, ts2
+    | _ -> assert false in
+  assert (List.length arg_tys = List.length xs);
+  ({it = FuncE
+      ( name,
+        sort,
+        control,
+        [],
+        List.map arg_of_var xs,
+        ret_tys,
+        exp
+      );
+    at = no_region;
+    note = Note.{ def with typ }
+  })
+
+(* Mono-morphic function declaration, sharing inferred from f's type *)
+let funcD ((id, typ) as f) x exp =
+  letD f (unary_funcE id typ x exp)
+
+(* Mono-morphic, n-ary function declaration *)
+let nary_funcD ((id, typ) as f) xs exp =
+  letD f (nary_funcE id typ xs exp)
+
+(* Continuation types with explicit answer typ *)
+
+let contT typ ans_typ = T.(Func (Local, Returns, [], as_seq typ, as_seq ans_typ))
+
+let err_contT ans_typ =  T.(Func (Local, Returns, [], [catch], as_seq ans_typ))
+
+let answerT typ : T.typ =
+  match typ with
+  | T.Func (T.Local, T.Returns, [], ts1, ts2) -> T.seq ts2
+  | _ -> assert false
+
+let cpsT typ ans_typ = T.(Func (Local, Returns, [], [contT typ ans_typ; err_contT ans_typ], as_seq ans_typ))
+
+(* Sequence expressions *)
+
+let seqE es =
+  match es with
+  | [e] -> e
+  | es -> tupE es
+
+(* Lambdas & continuations *)
+
+(* Lambda abstraction *)
+
+(* local lambda *)
+let (-->) x exp =
+  let fun_ty = T.Func (T.Local, T.Returns, [], T.as_seq (typ_of_var x), T.as_seq (typ exp)) in
+  unary_funcE "$lambda" fun_ty x exp
+
+(* n-ary local lambda *)
+let (-->*) xs exp =
+  let fun_ty = T.Func (T.Local, T.Returns, [], List.map typ_of_var xs, T.as_seq (typ exp)) in
+  nary_funcE "$lambda" fun_ty xs exp
+
+let close_typ_binds cs tbs =
+  List.map (fun {it = {con; sort; bound}; _} -> {T.var = Cons.name con; sort=sort; bound = T.close cs bound}) tbs
+
+(* polymorphic, n-ary local lambda *)
+let forall tbs e =
+ let cs = List.map (fun tb -> tb.it.con) tbs in
+ match e.it, e.note.Note.typ with
+ | FuncE (n, s, c1, [], xs, ts, exp),
+   T.Func ( _, c2, [], ts1, ts2) ->
+   { e with
+     it = FuncE(n, s, c1, tbs, xs, ts, exp);
+     note = Note.{ e.note with
+       typ = T.Func(s, c2, close_typ_binds cs tbs,
+         List.map (T.close cs) ts1,
+         List.map (T.close cs) ts2)
+     }
+   }
+ | _ -> assert false
+
+(* Lambda application (monomorphic) *)
+
+let ( -*- ) exp1 exp2 = callE exp1 [] exp2
+
+
+(* derived loop forms; each can be expressed as an unconditional loop *)
+
+let whileE exp1 exp2 =
+  (* while e1 e2
+     ~~> label l loop {
+           if e1 then { e2 } else { break l }
+         }
+  *)
+  let lab = fresh_id "done" () in
+  labelE lab T.unit (
+    loopE (
+      ifE exp1
+        exp2
+        (breakE lab (tupE []))
+    )
+  )
+
+let loopWhileE exp1 exp2 =
+  (* loop e1 while e2
+    ~~> label l loop {
+          let () = e1 ;
+          if e2 { } else { break l }
+        }
+   *)
+  let lab = fresh_id "done" () in
+  labelE lab T.unit (
+    loopE (
+      thenE exp1 (
+        ifE exp2
+          (tupE [])
+          (breakE lab (tupE []))
+      )
+    )
+  )
+
+let forE pat exp1 exp2 =
+  (* for (p in e1) e2
+     ~~>
+     let nxt = e1.next ;
+     label l loop {
+       switch nxt () {
+         case null { break l };
+         case ?p    { e2 };
+       }
+     } *)
+  let lab = fresh_id "done" () in
+  let ty1 = exp1.note.Note.typ in
+  let _, tfs = T.as_obj_sub [nextN] ty1 in
+  let tnxt = T.lookup_val_field nextN tfs in
+  let nxt = fresh_var "nxt" tnxt in
+  letE nxt (dotE exp1 nextN tnxt) (
+    labelE lab T.unit (
+      loopE (
+        switch_optE (callE (varE nxt) [] (unitE ()))
+          (breakE lab (unitE ()))
+          pat exp2 T.unit
+      )
+    )
+  )
+
+let unreachableE () =
+  (* Do we want a dedicated UnreachableE in the AST? *)
+  loopE (unitE ())
+
+let objE sort typ_flds flds =
+  let rec go ds fields fld_tys flds =
+    match flds with
+    | [] ->
+      blockE
+        (List.rev ds)
+        (newObjE sort fields
+           (T.obj sort
+              ((List.map (fun (id,c) -> (id, T.Typ c)) typ_flds)
+               @ fld_tys)))
+    | (lab, exp)::flds ->
+      let v = fresh_var lab (typ exp) in
+      let field = {
+        it = {name = lab; var = id_of_var v};
+        at = no_region;
+        note = typ exp
+      } in
+      go ((letD v exp)::ds) (field::fields) ((lab, typ exp)::fld_tys) flds
+  in
+  go [] [] [] flds
+
+let recordE flds = objE T.Object [] flds
+
+let check_call_perform_status success mk_failure =
+  ifE
+    (callE
+      (varE (var "@call_succeeded"
+        T.(Func (Local, Returns, [], [], [bool]))))
+      [] (unitE ()))
+    success
+    (mk_failure
+      (callE
+        (varE (var "@call_error"
+          T.(Func (Local, Returns, [], [], [error]))))
+        [] (unitE ())))
+
+
+
+ + + diff --git a/coverage/ir_def/freevars.ml.html b/coverage/ir_def/freevars.ml.html new file mode 100644 index 00000000000..7fcdeae42ed --- /dev/null +++ b/coverage/ir_def/freevars.ml.html @@ -0,0 +1,497 @@ + + + + + freevars.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+
+
open Source
+open Ir
+open Mo_types
+
+(* We collect a few things along the way *)
+
+(* We want to know:
+   Is this variable used (potentially) captured?
+   Is this variable used eagerly.
+
+   capture = true; eager = false means it is _only_ used under lambdas
+*)
+type usage_info = { captured : bool; eager : bool }
+
+let join u1 u2 = {
+  captured = u1.captured || u2.captured;
+  eager = u1.eager || u2.eager
+}
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+
+(* A set of free variables *)
+type f = usage_info M.t
+
+(* Operations: Union and removal *)
+let (++) : f -> f -> f = M.union (fun _ u1 u2 -> Some (join u1 u2))
+let unions f xs = List.fold_left (++) M.empty (List.map f xs)
+let (//) x y = M.remove y x
+
+(* Operations: left-biased Map union *)
+let (+-) = M.union (fun _ u1 _ -> Some u1)
+
+(* A set of defined variables (with type information) *)
+type td = Mo_types.Type.typ M.t
+
+(* A combined set of free variables and defined variables,
+   (in declarations) *)
+type fd = f * td
+
+let fd_of_defs m = (M.empty, m)
+
+(* Operations: *)
+
+(* This adds a set of free variables to a combined set *)
+let (+++) ((f,d) : fd) x = ((++) f x, d)
+(* This takes the union of two combined sets *)
+let (++++) (f1, d1) (f2,d2) =
+  (++) f1 f2,
+  M.union (fun _ t _ -> Some t) d1 d2 (* any type is fine *)
+let union_binders f xs = List.fold_left (++++) (M.empty, M.empty) (List.map f xs)
+
+let diff (m1 : 'a M.t) (m2 : 'b M.t) : 'a M.t =
+  M.merge (fun k v1 -> function None -> v1 | Some _ -> None) m1 m2
+
+let map_of_set x s = S.fold (fun v m -> M.add v x m) s M.empty
+let set_of_map m = M.fold (fun v _ m -> S.add v m) m S.empty
+
+(* The bound variables from the second argument scope over the first *)
+let (///) (x : f) ((f,d) : fd) = f ++ diff x d
+
+(* Usage tracking:
+
+   We track which variables may be captured.
+   Initially, variables are not captured.
+   All variables under a lambda become captured.
+*)
+let under_lambda : f -> f = M.map (fun _ -> { captured = true; eager = false })
+
+(* Projections *)
+let captured_vars : f -> S.t =
+  fun f -> set_of_map (M.filter (fun _ u -> u.captured) f)
+let eager_vars : f -> S.t =
+  fun f -> set_of_map (M.filter (fun _ u -> u.eager) f)
+
+(* This closes a combined set over itself (recursion or mutual recursion) *)
+let close (f,d) = diff f d
+
+(* One traversal for each syntactic category, named by that category *)
+
+let rec pat p : td = match p.it with
+  | WildP | LitP _  -> M.empty
+  | VarP i          -> M.singleton i p.note
+  | TupP ps         -> pats ps
+  | ObjP pfs        -> pats (pats_of_obj_pat pfs)
+  | OptP p
+  | TagP (_, p)     -> pat p
+  | AltP (p1, p2)   -> pat p1 +- pat p2
+
+and pats ps : td = List.(fold_left (+-) M.empty (map pat ps))
+
+let arg a : fd = (M.empty, M.singleton a.it a.note)
+
+let args as_ : fd = union_binders arg as_
+
+let id i = M.singleton i {captured = false; eager = true}
+
+(* The mutable fields of an IR object behave a bit like a lambda, in that they capture mutable
+boxes by reference. So set captured = true for them. *)
+let fields fs = unions (fun f ->
+  M.singleton f.it.var {captured = Type.is_mut f.note; eager = true}
+) fs
+
+let rec exp e : f = match e.it with
+  | VarE i              -> id i
+  | LitE l              -> M.empty
+  | PrimE (_, es)       -> exps es
+  | AssignE (e1, e2)    -> lexp e1 ++ exp e2
+  | BlockE (ds, e1)     -> close (decs ds +++ exp e1)
+  | IfE (e1, e2, e3)    -> exps [e1; e2; e3]
+  | SwitchE (e, cs)     -> exp e ++ cases cs
+  | LoopE e1            -> exp e1
+  | LabelE (i, t, e)    -> exp e
+  | AsyncE (_, _, e, _) -> exp e
+  | DeclareE (i, t, e)  -> exp e  // i
+  | DefineE (i, m, e)   -> id i ++ exp e
+  | FuncE (x, s, c, tp, as_, t, e) -> under_lambda (exp e /// args as_)
+  | ActorE (ds, fs, u, _)  -> actor ds fs u
+  | NewObjE (_, fs, _)  -> fields fs
+  | TryE (e, cs)        -> exp e ++ cases cs
+  | SelfCallE (_, e1, e2, e3) -> under_lambda (exp e1) ++ exp e2 ++ exp e3
+
+and actor ds fs u = close (decs ds +++ fields fs +++ system u)
+
+and system {meta; preupgrade; postupgrade; heartbeat; timer; inspect} =
+  under_lambda (exp preupgrade) ++
+  under_lambda (exp postupgrade) ++
+  under_lambda (exp heartbeat) ++
+  under_lambda (exp timer) ++
+  under_lambda (exp inspect)
+
+and exps es : f = unions exp es
+
+and lexp le : f = match le.it with
+  | VarLE i              -> id i
+  | DotLE (e1, _)        -> exp e1
+  | IdxLE (e1, e2)       -> exps [e1; e2]
+
+and case (c : case) = exp c.it.exp /// fd_of_defs (pat c.it.pat)
+
+and cases cs : f = unions case cs
+
+and dec d = match d.it with
+  | LetD (p, e) -> fd_of_defs (pat p) +++ exp e
+  | VarD (i, t, e) -> fd_of_defs (M.singleton i t) +++ exp e
+  | RefD (i, t, e) -> fd_of_defs (M.singleton i t) +++ lexp e
+
+(* The variables captured by a function. May include the function itself! *)
+and captured e =
+  List.map fst (M.bindings (exp e))
+
+and decs ps : fd = union_binders dec ps
+
+
+
+ + + diff --git a/coverage/ir_def/ir.ml.html b/coverage/ir_def/ir.ml.html new file mode 100644 index 00000000000..eb4f6b6b57e --- /dev/null +++ b/coverage/ir_def/ir.ml.html @@ -0,0 +1,1012 @@ + + + + + ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+
+
open Mo_types
+open Mo_values
+
+type id = string
+
+(* Literals *)
+
+type lit =
+  | NullLit
+  | BoolLit of bool
+  | NatLit of Numerics.Nat.t
+  | Nat8Lit of Numerics.Nat8.t
+  | Nat16Lit of Numerics.Nat16.t
+  | Nat32Lit of Numerics.Nat32.t
+  | Nat64Lit of Numerics.Nat64.t
+  | IntLit of Numerics.Int.t
+  | Int8Lit of Numerics.Int_8.t
+  | Int16Lit of Numerics.Int_16.t
+  | Int32Lit of Numerics.Int_32.t
+  | Int64Lit of Numerics.Int_64.t
+  | FloatLit of Numerics.Float.t
+  | CharLit of Value.unicode
+  | TextLit of string
+  | BlobLit of string
+
+(* Patterns *)
+
+type 'a phrase = ('a, Note.t) Source.annotated_phrase
+
+type typ_bind' = {con : Type.con; sort : Type.bind_sort; bound : Type.typ}
+type typ_bind = typ_bind' Source.phrase
+
+type unop = Operator.unop
+type binop = Operator.binop
+type relop = Operator.relop
+
+type mut = Const | Var
+
+type pat = (pat', Type.typ) Source.annotated_phrase
+and pat' =
+  | WildP                                      (* wildcard *)
+  | VarP of id                                 (* variable *)
+  | LitP of lit                                (* literal *)
+  | TupP of pat list                           (* tuple *)
+  | ObjP of pat_field list                     (* object *)
+  | OptP of pat                                (* option *)
+  | TagP of Type.lab * pat                     (* variant *)
+  | AltP of pat * pat                          (* disjunctive *)
+
+and pat_field = pat_field' Source.phrase
+and pat_field' = {name : Type.lab; pat : pat}
+
+(* Like id, but with a type attached *)
+type arg = (string, Type.typ) Source.annotated_phrase
+
+(* Expressions *)
+
+type exp = exp' phrase
+and exp' =
+  | PrimE of (prim * exp list)                 (* primitive *)
+  | VarE of id                                 (* variable *)
+  | LitE of lit                                (* literal *)
+  | AssignE of lexp * exp                      (* assignment *)
+  | BlockE of (dec list * exp)                 (* block *)
+  | IfE of exp * exp * exp                     (* conditional *)
+  | SwitchE of exp * case list                 (* switch *)
+  | LoopE of exp                               (* do-while loop *)
+  | LabelE of id * Type.typ * exp              (* label *)
+  | AsyncE of Type.async_sort * typ_bind * exp * Type.typ        (* async/async* *)
+  | DeclareE of id * Type.typ * exp            (* local promise *)
+  | DefineE of id * mut * exp                  (* promise fulfillment *)
+  | FuncE of                                   (* function *)
+      string * Type.func_sort * Type.control * typ_bind list * arg list * Type.typ list * exp
+  | SelfCallE of Type.typ list * exp * exp * exp (* essentially ICCallPrim (FuncE shared…) *)
+  | ActorE of dec list * field list * system * Type.typ (* actor *)
+  | NewObjE of Type.obj_sort * field list * Type.typ  (* make an object *)
+  | TryE of exp * case list                    (* try/catch *)
+
+and system = {
+  meta : meta;
+  (* TODO: use option expressions for (some or all of) these *)
+  preupgrade : exp;
+  postupgrade : exp;
+  heartbeat : exp;
+  timer : exp; (* TODO: use an option type: (Default of exp | UserDefined of exp) option *)
+  inspect : exp
+}
+
+and candid = {
+    args : string;
+    service : string;
+  }
+
+and meta = {
+    candid : candid;  (* Candid (of service, never actor class) *)
+    sig_ : string  (* Motoko stable signature *)
+  }
+
+and field = (field', Type.typ) Source.annotated_phrase
+and field' = {name : Type.lab; var : id} (* the var is by reference, not by value *)
+
+and case = case' Source.phrase
+and case' = {pat : pat; exp : exp}
+
+and lexp = (lexp', Type.typ) Source.annotated_phrase
+and lexp' =
+  | VarLE of id                                (* variable *)
+  | IdxLE of exp * exp                         (* array indexing *)
+  | DotLE of exp * Type.lab                    (* object projection *)
+
+
+(* In the IR, a prim is any AST node that has expr subexpressions, but they are
+all call-by-value. Many passes can treat them uniformly, so they are unified
+using the PrimE node. *)
+and prim =
+  | CallPrim of Type.typ list         (* function call *)
+  | UnPrim of Type.typ * unop         (* unary operator *)
+  | BinPrim of Type.typ * binop       (* binary operator *)
+  | RelPrim of Type.typ * relop       (* relational operator *)
+  | TupPrim                           (* the tuple constructor *)
+  | ProjPrim of int                   (* tuple projection *)
+  | OptPrim                           (* option injection *)
+  | TagPrim of id                     (* variant injection *)
+  | DotPrim of Type.lab               (* object projection *)
+  | ActorDotPrim of Type.lab          (* actor field access *)
+  | ArrayPrim of mut * Type.typ       (* array constructor *)
+  | IdxPrim                           (* array indexing *)
+  | BreakPrim of id                   (* break *)
+  | RetPrim                           (* return *)
+  | AwaitPrim of Type.async_sort       (* await/await* *)
+  | AssertPrim                        (* assertion *)
+  | ThrowPrim                         (* throw *)
+  | ShowPrim of Type.typ              (* debug_show *)
+  | SerializePrim of Type.typ list    (* Candid serialization prim *)
+  | DeserializePrim of Type.typ list  (* Candid deserialization prim *)
+  | DeserializeOptPrim of Type.typ list
+     (* Candid deserialization prim (returning Opt) *)
+  | NumConvTrapPrim of Type.prim * Type.prim
+  | NumConvWrapPrim of Type.prim * Type.prim
+  | DecodeUtf8
+  | EncodeUtf8
+  | CastPrim of Type.typ * Type.typ   (* representationally a noop *)
+  | ActorOfIdBlob of Type.typ
+  | BlobOfIcUrl                       (* traps on syntax or checksum failure *)
+  | IcUrlOfBlob
+  | SelfRef of Type.typ               (* returns the self actor ref *)
+  | SystemTimePrim
+  (* Array field iteration/access *)
+  | NextArrayOffset of spacing        (* advance array offset *)
+  | ValidArrayOffset                  (* verify array offset *)
+  | DerefArrayOffset                  (* array offset indexing *)
+  | GetPastArrayOffset of spacing     (* array offset past the last element *)
+  (* Funds *)
+  | SystemCyclesAddPrim
+  | SystemCyclesAcceptPrim
+  | SystemCyclesAvailablePrim
+  | SystemCyclesBalancePrim
+  | SystemCyclesRefundedPrim
+  | SetCertifiedData
+  | GetCertificate
+
+  | OtherPrim of string               (* Other primitive operation, no custom typing rule *)
+  (* backend stuff *)
+  | CPSAwait of Type.async_sort * Type.typ
+                                      (* typ is the current continuation type of cps translation *)
+  | CPSAsync of Type.async_sort * Type.typ
+  | ICPerformGC
+  | ICReplyPrim of Type.typ list
+  | ICRejectPrim
+  | ICCallerPrim
+  | ICCallPrim
+  | ICCallRawPrim
+  | ICMethodNamePrim
+  | ICArgDataPrim
+  | ICStableWrite of Type.typ          (* serialize value of stable type to stable memory *)
+  | ICStableRead of Type.typ           (* deserialize value of stable type from stable memory *)
+  | ICStableSize of Type.typ
+
+and spacing = One | ElementSize        (* increment units when iterating over arrays *)
+
+(* Declarations *)
+
+and dec = dec' Source.phrase
+and dec' =
+  | LetD of pat * exp                          (* immutable *)
+  | VarD of id * Type.typ * exp                (* mutable *)
+  | RefD of id * Type.typ * lexp               (* reference - only required for flag --experimental_field_aliasing *)
+
+(* Literals *)
+
+(* NB: This function is currently unused *)
+let string_of_lit = function
+  | BoolLit false -> "false"
+  | BoolLit true  ->  "true"
+  | IntLit n
+  | NatLit n      -> Numerics.Int.to_pretty_string n
+  | Int8Lit n     -> Numerics.Int_8.to_pretty_string n
+  | Int16Lit n    -> Numerics.Int_16.to_pretty_string n
+  | Int32Lit n    -> Numerics.Int_32.to_pretty_string n
+  | Int64Lit n    -> Numerics.Int_64.to_pretty_string n
+  | Nat8Lit n     -> Numerics.Nat8.to_pretty_string n
+  | Nat16Lit n    -> Numerics.Nat16.to_pretty_string n
+  | Nat32Lit n    -> Numerics.Nat32.to_pretty_string n
+  | Nat64Lit n    -> Numerics.Nat64.to_pretty_string n
+  | CharLit c     -> string_of_int c
+  | NullLit       -> "null"
+  | TextLit t     -> t
+  | BlobLit b     -> Printf.sprintf "%s" b
+  | FloatLit f    -> Numerics.Float.to_pretty_string f
+
+(* Flavor *)
+
+(*
+We have a bunch of flavors of the IR, where some constructors are not
+allowed in some flavors. In an ideal world, we would have different IRs for
+that (or maybe GADTs). But for now we simply track that on the value level. The
+main purpose of tracking that is to inform `Check_ir` about the invariants that
+should hold.
+*)
+
+type flavor = {
+  has_typ_field : bool; (* Typ(e) fields *)
+  has_async_typ : bool; (* AsyncT *)
+  has_await : bool; (* AwaitE and AsyncE *)
+  has_show : bool; (* ShowE *)
+  has_poly_eq : bool; (* Polymorphic equality *)
+}
+
+let full_flavor () : flavor = {
+  has_typ_field = true;
+  has_await = true;
+  has_async_typ = true;
+  has_show = true;
+  has_poly_eq = true;
+}
+
+
+(* Program *)
+
+type comp_unit =
+  | LibU of dec list * exp
+  | ProgU of dec list
+  | ActorU of arg list option * dec list * field list * system * Type.typ (* actor (class) *)
+
+type prog = comp_unit * flavor
+
+
+(* object pattern helpers *)
+
+let pats_of_obj_pat pfs = List.map (fun {Source.it={name; pat}; _} -> pat) pfs
+
+let map_obj_pat f pfs =
+  List.map (fun ({Source.it={name; pat}; _} as pf) -> {pf with Source.it={name; pat=f pat}}) pfs
+
+let replace_obj_pat pfs pats =
+  List.map2 (fun ({Source.it={name; pat=_}; _} as pf) pat -> {pf with Source.it={name; pat}}) pfs pats
+
+(* Helper for transforming prims, without missing embedded typs and ids *)
+
+let map_prim t_typ t_id p =
+  match p with
+  | CallPrim ts -> CallPrim (List.map t_typ ts)
+  | UnPrim (ot, op) -> UnPrim (t_typ ot, op)
+  | BinPrim (ot, op) -> BinPrim (t_typ ot, op)
+  | RelPrim (ot, op) -> RelPrim (t_typ ot, op)
+  | TupPrim
+  | ProjPrim _
+  | OptPrim
+  | TagPrim _
+  | DotPrim _
+  | ActorDotPrim _ -> p
+  | ArrayPrim (m, t) -> ArrayPrim (m, t_typ t)
+  | IdxPrim
+  | NextArrayOffset _
+  | ValidArrayOffset
+  | DerefArrayOffset
+  | GetPastArrayOffset _ -> p
+  | BreakPrim id -> BreakPrim (t_id id)
+  | RetPrim
+  | AwaitPrim _
+  | AssertPrim
+  | ThrowPrim -> p
+  | ShowPrim t -> ShowPrim (t_typ t)
+  | SerializePrim ts -> SerializePrim (List.map t_typ ts)
+  | DeserializePrim ts -> DeserializePrim (List.map t_typ ts)
+  | DeserializeOptPrim ts -> DeserializeOptPrim (List.map t_typ ts)
+  | NumConvTrapPrim _
+  | NumConvWrapPrim _
+  | DecodeUtf8
+  | EncodeUtf8 -> p
+  | CastPrim (t1, t2) -> CastPrim (t_typ t1, t_typ t2)
+  | ActorOfIdBlob t -> ActorOfIdBlob (t_typ t)
+  | BlobOfIcUrl
+  | IcUrlOfBlob -> p
+  | SelfRef t -> SelfRef (t_typ t)
+  | SystemTimePrim
+  | SystemCyclesAddPrim
+  | SystemCyclesAcceptPrim
+  | SystemCyclesAvailablePrim
+  | SystemCyclesBalancePrim
+  | SystemCyclesRefundedPrim
+  | SetCertifiedData
+  | GetCertificate
+  | OtherPrim _ -> p
+  | CPSAwait (s, t) -> CPSAwait (s, t_typ t)
+  | CPSAsync (s, t) -> CPSAsync (s, t_typ t)
+  | ICReplyPrim ts -> ICReplyPrim (List.map t_typ ts)
+  | ICArgDataPrim
+  | ICPerformGC
+  | ICRejectPrim
+  | ICCallerPrim
+  | ICCallPrim
+  | ICCallRawPrim
+  | ICMethodNamePrim -> p
+  | ICStableWrite t -> ICStableWrite (t_typ t)
+  | ICStableRead t -> ICStableRead (t_typ t)
+  | ICStableSize t -> ICStableSize (t_typ t)
+
+
+
+
+ + + diff --git a/coverage/ir_def/ir_effect.ml.html b/coverage/ir_def/ir_effect.ml.html new file mode 100644 index 00000000000..6e93ad05430 --- /dev/null +++ b/coverage/ir_def/ir_effect.ml.html @@ -0,0 +1,354 @@ + + + + + ir_effect.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+
+
open Ir
+open Source
+module T = Mo_types.Type
+
+(* a simple effect analysis to annote expressions as Triv(ial) (await-free) or Await (containing unprotected awaits) *)
+
+(* in future we could merge this with the type-checker
+   but I prefer to keep it mostly separate for now *)
+
+let max_eff e1 e2 =
+  match e1,e2 with
+  | T.Triv, T.Triv -> T.Triv
+  | _ , T.Await -> T.Await
+  | T.Await, _ -> T.Await
+
+let typ phrase = phrase.note.Note.typ
+let eff phrase = phrase.note.Note.eff
+
+let is_triv phrase = eff phrase = T.Triv
+
+let effect_exp (exp: exp) : T.eff = eff exp
+
+let is_async_call p exps =
+  match (p, exps) with
+  | CallPrim _, [exp1; _] ->
+    T.is_shared_func (typ exp1) ||
+    T.is_local_async_func (typ exp1)
+  | OtherPrim "call_raw", _ ->
+    true
+  | _ -> false
+
+(* infer the effect of an expression, assuming all sub-expressions are correctly effect-annotated es*)
+
+let rec infer_effect_prim p exps =
+  match p, exps with
+  | ThrowPrim, _
+  | AwaitPrim _, _ ->
+    T.Await
+  | _ ->
+    if is_async_call p exps then
+      T.Await
+    else
+      List.fold_left max_eff T.Triv (List.map eff exps)
+
+and infer_effect_exp (exp: exp) : T.eff =
+  match exp.it with
+  | VarE _
+  | LitE _ ->
+    T.Triv
+  | LabelE (_, _, exp1)
+  | LoopE exp1
+  | AssignE (_, exp1) ->
+    effect_exp exp1
+  | PrimE (p, exps) ->
+    infer_effect_prim p exps
+  | BlockE (ds, exp) ->
+    let es = List.map effect_dec ds in
+    List.fold_left max_eff (effect_exp exp) es
+  | IfE (exp1, exp2, exp3) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_exp exp2 in
+    let e3 = effect_exp exp3 in
+    max_eff e1 (max_eff e2 e3)
+  | SwitchE (exp1, cases) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_cases cases in
+    max_eff e1 e2
+  | AsyncE (T.Fut, _, _, _) ->
+    T.Await
+  | AsyncE (T.Cmp, _, _, _) ->
+    T.Triv
+  | TryE _ ->
+    T.Await
+  | DeclareE (_, _, exp1) ->
+    effect_exp exp1
+  | DefineE (_, _, exp1) ->
+    effect_exp exp1
+  | FuncE _ ->
+    T.Triv
+  | SelfCallE (_, _, exp1, exp2) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_exp exp2 in
+    max_eff e1 e2
+  | ActorE _ ->
+    T.Triv
+  | NewObjE _ ->
+    T.Triv
+
+and effect_cases cases =
+  match cases with
+  | [] ->
+    T.Triv
+  | {it = {pat; exp}; _}::cases' ->
+    let e = effect_exp exp in
+    max_eff e (effect_cases cases')
+
+and effect_dec dec = match dec.it with
+  | LetD (_, e) | VarD (_, _, e) -> effect_exp e
+  | RefD (_, _, { it = DotLE (e, _); _ }) -> effect_exp e
+  | RefD (_, _, _) -> assert false
+
+let infer_effect_dec = effect_dec
+
+let infer_effect_decs ds =
+  let es = List.map effect_dec ds in
+  List.fold_left max_eff T.Triv es
+
+
+
+ + + diff --git a/coverage/ir_def/ir_utils.ml.html b/coverage/ir_def/ir_utils.ml.html new file mode 100644 index 00000000000..2f2df2d6328 --- /dev/null +++ b/coverage/ir_def/ir_utils.ml.html @@ -0,0 +1,68 @@ + + + + + ir_utils.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
+
open Ir
+open Source
+let rec is_irrefutable p = match p.it with
+  | TupP pats -> List.for_all is_irrefutable pats
+  | ObjP pfs -> List.for_all (fun (pf : pat_field) -> is_irrefutable pf.it.pat) pfs
+  | AltP (pat1, _) -> is_irrefutable pat1
+  | WildP | VarP _ -> true
+  | TagP _ | LitP _ | OptP _ -> false
+
+let is_irrefutable_nonbinding p =
+  is_irrefutable p && Freevars.(M.is_empty (pat p))
+
+
+
+ + + diff --git a/coverage/ir_def/note.ml.html b/coverage/ir_def/note.ml.html new file mode 100644 index 00000000000..fd0371e44e1 --- /dev/null +++ b/coverage/ir_def/note.ml.html @@ -0,0 +1,83 @@ + + + + + note.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
+
open Mo_types
+
+type t = {
+  typ : Type.typ;
+  eff : Type.eff;
+  const : bool;
+  check_run : int;
+}
+
+let def : t = {
+  typ = Type.Pre;
+  eff = Type.Triv;
+  const = false;
+  check_run = 0;
+}
+
+
+
+
+ + + diff --git a/coverage/ir_def/rename.ml.html b/coverage/ir_def/rename.ml.html new file mode 100644 index 00000000000..9661d9855b3 --- /dev/null +++ b/coverage/ir_def/rename.ml.html @@ -0,0 +1,582 @@ + + + + + rename.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+
+
open Source
+open Ir
+
+module Renaming = Map.Make(String)
+
+(* One traversal for each syntactic category, named by that category *)
+
+let fresh_id id = Construct.fresh_id id ()
+
+let id rho i =
+  try Renaming.find i rho
+  with Not_found -> i
+
+let id_bind rho i =
+  let i' = fresh_id i in
+  (i', Renaming.add i i' rho)
+
+let arg_bind rho a =
+  let i' = fresh_id a.it in
+  ({a with it = i'}, Renaming.add a.it i' rho)
+
+let rec prim rho p =
+  Ir.map_prim (fun t -> t) (id rho) p (* rename BreakPrim id etc *)
+
+and exp rho e  =  {e with it = exp' rho e.it}
+and exp' rho = function
+  | VarE i              -> VarE (id rho i)
+  | LitE _ as e         -> e
+  | PrimE (p, es)       -> PrimE (prim rho p, List.map (exp rho) es)
+  | ActorE (ds, fs, { meta; preupgrade; postupgrade; heartbeat; timer; inspect }, t) ->
+    let ds', rho' = decs rho ds in
+    ActorE
+      (ds',
+       fields rho' fs,
+       {meta;
+        preupgrade = exp rho' preupgrade;
+        postupgrade = exp rho' postupgrade;
+        heartbeat = exp rho' heartbeat;
+        timer = exp rho' timer;
+        inspect = exp rho' inspect;
+       },
+       t)
+  | AssignE (e1, e2)    -> AssignE (lexp rho e1, exp rho e2)
+  | BlockE (ds, e1)     -> let ds', rho' = decs rho ds
+                           in BlockE (ds', exp rho' e1)
+  | IfE (e1, e2, e3)    -> IfE (exp rho e1, exp rho e2, exp rho e3)
+  | SwitchE (e, cs)     -> SwitchE (exp rho e, cases rho cs)
+  | LoopE e1            -> LoopE (exp rho e1)
+  | LabelE (i, t, e)    -> let i',rho' = id_bind rho i in
+                           LabelE(i', t, exp rho' e)
+  | AsyncE (s, tb, e, t) -> AsyncE (s, tb, exp rho e, t)
+  | DeclareE (i, t, e)  -> let i',rho' = id_bind rho i in
+                           DeclareE (i', t, exp rho' e)
+  | DefineE (i, m, e)   -> DefineE (id rho i, m, exp rho e)
+  | FuncE (x, s, c, tp, p, ts, e) ->
+     let p', rho' = args rho p in
+     let e' = exp rho' e in
+     FuncE (x, s, c, tp, p', ts, e')
+  | NewObjE (s, fs, t)  -> NewObjE (s, fields rho fs, t)
+  | TryE (e, cs)        -> TryE (exp rho e, cases rho cs)
+  | SelfCallE (ts, e1, e2, e3) ->
+     SelfCallE (ts, exp rho e1, exp rho e2, exp rho e3)
+
+and lexp rho le = {le with it = lexp' rho le.it}
+and lexp' rho = function
+  | VarLE i  -> VarLE (id rho i)
+  | DotLE (e, i) -> DotLE (exp rho e, i)
+  | IdxLE (e1, e2) -> IdxLE (exp rho e1, exp rho e2)
+
+and exps rho es  = List.map (exp rho) es
+
+and fields rho fs =
+  List.map (fun f -> { f with it = { f.it with var = id rho f.it.var } }) fs
+
+and args rho as_ =
+  match as_ with
+  | [] -> ([],rho)
+  | a::as_ ->
+     let (a', rho') = arg_bind rho a in
+     let (as_', rho'') = args rho' as_ in
+     (a'::as_', rho'')
+
+and pat rho p =
+    let p',rho = pat' rho p.it in
+    {p with it = p'}, rho
+
+and pat' rho = function
+  | WildP as p    -> (p, rho)
+  | VarP i        ->
+    let i, rho' = id_bind rho i in
+     (VarP i, rho')
+  | TupP ps       -> let (ps, rho') = pats rho ps in
+                     (TupP ps, rho')
+  | ObjP pfs      ->
+    let (pats, rho') = pats rho (pats_of_obj_pat pfs) in
+    (ObjP (replace_obj_pat pfs pats), rho')
+  | LitP _ as p   -> (p, rho)
+  | OptP p        -> let (p', rho') = pat rho p in
+                     (OptP p', rho')
+  | TagP (i, p)   -> let (p', rho') = pat rho p in
+                     (TagP (i, p'), rho')
+  | AltP (p1, p2) -> assert(Freevars.(M.is_empty (pat p1)));
+                     assert(Freevars.(M.is_empty (pat p2)));
+                     let (p1', _) = pat rho p1 in
+                     let (p2' ,_) = pat rho p2 in
+                     (AltP (p1', p2'), rho)
+
+and pats rho ps  =
+  match ps with
+  | [] -> ([],rho)
+  | p::ps ->
+     let (p', rho') = pat rho p in
+     let (ps', rho'') = pats rho' ps in
+     (p'::ps', rho'')
+
+and case rho (c : case) =
+  {c with it = case' rho c.it}
+and case' rho { pat = p; exp = e} =
+  let (p', rho') = pat rho p in
+  let e' = exp rho' e in
+  {pat=p'; exp=e'}
+
+and cases rho cs = List.map (case rho) cs
+
+and dec rho d =
+  let (mk_d, rho') = dec' rho d.it in
+  ({d with it = mk_d}, rho')
+
+and dec' rho = function
+  | LetD (p, e) ->
+     let p', rho = pat rho p in
+     (fun rho' -> LetD (p',exp rho' e)),
+     rho
+  | VarD (i, t, e) ->
+     let i', rho = id_bind rho i in
+     (fun rho' -> VarD (i', t, exp rho' e)),
+     rho
+  | RefD (i, t, le) ->
+     let i', rho = id_bind rho i in
+     (fun rho' -> RefD (i', t, lexp rho' le)),
+     rho
+
+and decs rho ds =
+  let rec decs_aux rho ds =
+    match ds with
+    | [] -> ([], rho)
+    | d::ds ->
+       let (mk_d, rho') = dec rho d in
+       let (mk_ds, rho'') = decs_aux rho' ds in
+       (mk_d::mk_ds, rho'')
+  in
+  let mk_ds, rho' = decs_aux rho ds in
+  let ds' = List.map (fun mk_d -> { mk_d with it = mk_d.it rho' } ) mk_ds in
+  (ds', rho')
+
+let comp_unit rho cu = match cu with
+  | ProgU ds ->
+    let ds', _ = decs rho ds in
+    ProgU ds'
+  | LibU (ds, e) ->
+    let ds', rho' = decs rho ds
+    in LibU (ds', exp rho' e)
+  | ActorU (as_opt, ds, fs, { meta; preupgrade; postupgrade; heartbeat; timer; inspect }, t) ->
+    let as_opt', rho' = match as_opt with
+      | None -> None, rho
+      | Some as_ ->
+        let as_', rho' = args rho as_ in
+        Some as_', rho'
+    in
+    let ds', rho'' = decs rho' ds in
+    ActorU (as_opt', ds', fields rho'' fs,
+      { meta;
+        preupgrade = exp rho'' preupgrade;
+        postupgrade = exp rho'' postupgrade;
+        heartbeat = exp rho'' heartbeat;
+        timer = exp rho'' timer;
+        inspect = exp rho'' inspect;
+      }, t)
+
+
+
+ + + diff --git a/coverage/ir_interpreter/interpret_ir.ml.html b/coverage/ir_interpreter/interpret_ir.ml.html new file mode 100644 index 00000000000..61c7fc8eb51 --- /dev/null +++ b/coverage/ir_interpreter/interpret_ir.ml.html @@ -0,0 +1,3236 @@ + + + + + interpret_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+
+
open Mo_types
+open Mo_values
+open Ir_def
+
+open Ir
+open Source
+
+module V = Value
+module T = Type
+module CC = Call_conv
+
+(* Context *)
+
+type val_env = V.def V.Env.t
+type lab_env = V.value V.cont V.Env.t
+type ret_env = V.value V.cont option
+type throw_env = V.value V.cont option
+type reply_env = V.value V.cont option
+type reject_env = V.value V.cont option
+type actor_env = V.value V.Env.t ref (* indexed by actor ids *)
+
+let initial_state () = ref V.Env.empty
+
+type flags = {
+  trace : bool;
+  print_depth : int;
+}
+
+type env =
+  { flags : flags;
+    flavor : Ir.flavor;
+    vals : val_env;
+    labs : lab_env;
+    rets : ret_env;
+    throws : throw_env;
+    replies : reply_env;
+    rejects : reject_env;
+    caller : V.value;
+    self : V.actor_id;
+    actor_env : actor_env;
+  }
+
+let adjoin_vals c ve = {c with vals = V.Env.adjoin c.vals ve}
+
+let empty_scope = V.Env.empty
+
+let env_of_scope flags flavor ae ve =
+  { flags;
+    flavor;
+    vals = ve;
+    labs = V.Env.empty;
+    rets = None;
+    throws = None;
+    replies = None;
+    rejects = None;
+    caller = V.Text V.top_id;
+    self = V.top_id;
+    actor_env = ae;
+  }
+
+let context env = V.Blob env.self
+
+(* Error handling *)
+
+exception Trap of Source.region * string
+
+let trap at fmt = Printf.ksprintf (fun s -> raise (Trap (at, s))) fmt
+
+let find id env =
+  try V.Env.find id env
+  with Not_found ->
+    trap no_region "unbound identifier %s" id
+
+(* Tracing *)
+
+let trace_depth = ref 0
+
+let trace fmt =
+  Printf.ksprintf (fun s ->
+    Printf.printf "%s%s\n%!" (String.make (2 * !trace_depth) ' ') s
+  ) fmt
+
+let string_of_val env = V.string_of_val env.flags.print_depth
+let string_of_def flags = V.string_of_def flags.print_depth
+let string_of_arg env = function
+  | V.Tup _ as v -> string_of_val env v
+  | v -> "(" ^ string_of_val env v ^ ")"
+
+
+(* Debugging aids *)
+
+let last_env = ref (env_of_scope { trace = false; print_depth = 2} (Ir.full_flavor ()) (initial_state ()) empty_scope)
+let last_region = ref Source.no_region
+
+let print_exn flags exn =
+  let trace = Printexc.get_backtrace () in
+  Printf.printf "%!";
+  let at = Source.string_of_region !last_region in
+  Printf.eprintf "%s: internal error, %s\n" at (Printexc.to_string exn);
+  Printf.eprintf "\nLast environment:\n";
+  Value.Env.iter
+    (fun x d -> Printf.eprintf "%s = %s\n" x (string_of_def flags d))
+    !last_env.vals;
+  Printf.eprintf "\n";
+  Printf.eprintf "%s" trace;
+  Printf.eprintf "%!"
+
+(* Scheduling *)
+
+module Scheduler =
+struct
+  let q : (unit -> unit) Queue.t = Queue.create ()
+
+  let queue work = Queue.add work q
+  let yield () =
+    trace_depth := 0;
+    try Queue.take q () with Trap (at, msg) ->
+      Printf.eprintf "%s: execution error, %s\n" (Source.string_of_region at) msg
+
+  let rec run () =
+    if not (Queue.is_empty q) then (yield (); run ())
+end
+
+(* Async auxiliary functions *)
+
+(* Are these just duplicates of the corresponding functions in interpret.ml? If so, refactor *)
+
+let make_async () : V.async =
+  {V.result = Lib.Promise.make (); waiters = []}
+
+let get_async async (k : V.value V.cont) (r : V.value V.cont) =
+  match Lib.Promise.value_opt async.V.result with
+  | Some (V.Ok v) -> k v
+  | Some (V.Error v) -> r v
+  | None -> async.V.waiters <- (k,r)::async.V.waiters
+
+let set_async async v =
+  List.iter (fun (k,_) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Ok v);
+  async.V.waiters <- []
+
+let reject_async async v =
+  List.iter (fun (_,r) -> Scheduler.queue (fun () -> r v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Error v);
+  async.V.waiters <- []
+
+let reply async v =
+  Scheduler.queue (fun () -> set_async async v)
+
+let reject async v =
+  match v with
+  | V.Tup [ _code; message ] ->
+    (* mask the error code before rejecting *)
+    Scheduler.queue
+      (fun () -> reject_async async (V.Tup [V.Variant("canister_reject", V.unit); message]))
+  | _ -> assert false
+
+let async env at (f: (V.value V.cont) -> (V.value V.cont) -> unit) (k : V.value V.cont) =
+  let async = make_async () in
+  let k' = reply async in
+  let r = reject async in
+  if env.flags.trace then trace "-> async %s" (string_of_region at);
+  Scheduler.queue (fun () ->
+    if env.flags.trace then trace "<- async %s" (string_of_region at);
+    incr trace_depth;
+    f (fun v ->
+      if env.flags.trace then trace "<= %s" (string_of_val env v);
+      decr trace_depth;
+      k' v) r
+    );
+  k (V.Async async)
+
+let await env at async k =
+  if env.flags.trace then trace "=> await %s" (string_of_region at);
+  decr trace_depth;
+  get_async async (fun v ->
+    Scheduler.queue (fun () ->
+      if env.flags.trace then
+        trace "<- await %s%s" (string_of_region at) (string_of_arg env v);
+      incr trace_depth;
+      k v)
+    )
+
+
+(* queue a lowered oneway or replying function that no longer does AsyncE on entry *)
+let queue f = fun c v k -> Scheduler.queue (fun () -> f c v k)
+
+let make_unit_message env id call_conv f =
+  assert env.flavor.has_async_typ;
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    (* message scheduled by AsyncE in f *)
+    Value.message_func s call_conv.n_args f
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_async_message env id call_conv f =
+  assert env.flavor.has_async_typ;
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Promises; _} ->
+    (* message scheduled by AsyncE in f *)
+    Value.async_func s call_conv.n_args call_conv.n_res f
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_lowered_unit_message env id call_conv f =
+  assert (not env.flavor.has_async_typ);
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    (* message scheduled here (not by f) *)
+    Value.message_func s call_conv.n_args (fun c v k ->
+      (queue f) c v (fun _ -> ());
+      k (V.unit);
+    );
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_replying_message env id call_conv f =
+  assert (not env.flavor.has_async_typ);
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Replies; _} ->
+    Value.replies_func s call_conv.n_args call_conv.n_res (fun c v k ->
+      (* message scheduled here (not by f) *)
+      (queue f) c v (fun _ -> ());
+      k (V.unit)
+    )
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_message env x cc f : V.value =
+  match cc.CC.control with
+  | T.Returns ->
+    if env.flavor.has_async_typ then
+      make_unit_message env x cc f
+    else
+      make_lowered_unit_message env x cc f
+  | T.Promises -> make_async_message env x cc f
+  | T.Replies -> make_replying_message env x cc f
+
+
+(* Literals *)
+
+let interpret_lit env lit : V.value =
+  match lit with
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit n -> V.Nat8 n
+  | Nat16Lit n -> V.Nat16 n
+  | Nat32Lit n -> V.Nat32 n
+  | Nat64Lit n -> V.Nat64 n
+  | IntLit i -> V.Int i
+  | Int8Lit i -> V.Int8 i
+  | Int16Lit i -> V.Int16 i
+  | Int32Lit i -> V.Int32 i
+  | Int64Lit i -> V.Int64 i
+  | FloatLit f -> V.Float f
+  | CharLit c -> V.Char c
+  | TextLit s -> V.Text s
+  | BlobLit b -> V.Blob b
+
+(* Expressions *)
+
+let check_call_conv exp call_conv =
+  let open Call_conv in
+  let exp_call_conv = call_conv_of_typ exp.note.Note.typ in
+  if not (exp_call_conv = call_conv) then
+    failwith (Printf.sprintf "call_conv mismatch: function %s of type %s expecting %s, found %s"
+      (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+      (T.string_of_typ exp.note.Note.typ)
+      (string_of_call_conv exp_call_conv)
+      (string_of_call_conv call_conv))
+
+let check_call_conv_arg env exp v call_conv =
+  let open CC in
+  if call_conv.n_args <> 1 then
+  let es = try V.as_tup v
+    with Invalid_argument _ ->
+      failwith (Printf.sprintf "call %s: calling convention %s cannot handle non-tuple value %s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+        (string_of_call_conv call_conv)
+        (string_of_val env v)) in
+  if List.length es <> call_conv.n_args then
+    failwith (Printf.sprintf "call %s: calling convention %s got tuple of wrong length %s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+        (string_of_call_conv call_conv)
+        (string_of_val env v))
+
+
+let rec interpret_exp env exp (k : V.value V.cont) =
+  interpret_exp_mut env exp (function V.Mut r -> k !r | v -> k v)
+
+and interpret_exp_mut env exp (k : V.value V.cont) =
+  let open Call_conv in
+  last_region := exp.at;
+  last_env := env;
+  Profiler.bump_region exp.at ;
+  match exp.it with
+  | VarE id ->
+    (match Lib.Promise.value_opt (find id env.vals) with
+    | Some v -> k v
+    | None -> trap exp.at "accessing identifier before its definition"
+    )
+  | LitE lit ->
+    k (interpret_lit env lit)
+  | PrimE (p, es) ->
+    interpret_exps env es [] (fun vs ->
+      match p, vs with
+      | CallPrim typs, [v1; v2] ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv (List.hd es) call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        f (context env) v2 k
+      | UnPrim (ot, op), [v1] ->
+        k (try Operator.unop op ot v1 with Invalid_argument s -> trap exp.at "%s" s)
+      | BinPrim (ot, op), [v1; v2] ->
+        k (try Operator.binop op ot v1 v2 with _ ->
+          trap exp.at "arithmetic overflow")
+      | RelPrim (ot, op), [v1; v2] ->
+        k (Operator.relop op ot v1 v2)
+      | TupPrim, exps ->
+        k (V.Tup vs)
+      | ProjPrim n, [v1] ->
+        k (List.nth (V.as_tup v1) n)
+      | OptPrim, [v1] ->
+        k (V.Opt v1)
+      | TagPrim i, [v1] ->
+        k (V.Variant (i, v1))
+      | DotPrim n, [v1] ->
+        let fs = V.as_obj v1 in
+        k (try find n fs with _ -> assert false)
+      | ActorDotPrim n, [v1] ->
+        let id = V.as_blob v1 in
+        begin match V.Env.find_opt id !(env.actor_env) with
+        (* not quite correct: On the platform, you can invoke and get a reject *)
+        | None -> trap exp.at "Unkown actor \"%s\"" id
+        | Some actor_value ->
+          let fs = V.as_obj actor_value in
+          match V.Env.find_opt n fs with
+          | None -> trap exp.at "Actor \"%s\" has no method \"%s\"" id n
+          | Some field_value -> k field_value
+        end
+      | ArrayPrim (mut, _), vs ->
+        let vs' =
+          match mut with
+          | Var -> List.map (fun v -> V.Mut (ref v)) vs
+          | Const -> vs
+        in k (V.Array (Array.of_list vs'))
+      | (IdxPrim | DerefArrayOffset), [v1; v2] ->
+        k (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap exp.at "%s" s)
+      | NextArrayOffset _, [v1] ->
+        k (V.Int Numerics.Nat.(of_int ((to_int (V.as_int v1)) + 1)))
+      | ValidArrayOffset, [v1; v2] ->
+        k (V.Bool Numerics.Nat.(to_int (V.as_int v1) < to_int (V.as_int v2)))
+      | GetPastArrayOffset _, [v1] ->
+        k (V.Int Numerics.Nat.(of_int (Array.length (V.as_array v1))))
+      | BreakPrim id, [v1] -> find id env.labs v1
+      | RetPrim, [v1] -> Option.get env.rets v1
+      | ThrowPrim, [v1] -> Option.get env.throws v1
+      | AwaitPrim Type.Fut, [v1] ->
+        assert env.flavor.has_await;
+        await env exp.at (V.as_async v1) k (Option.get env.throws)
+      | AwaitPrim Type.Cmp, [v1] ->
+        assert env.flavor.has_await;
+        (V.as_comp v1) k (Option.get env.throws)
+      | AssertPrim, [v1] ->
+        if V.as_bool v1
+        then k V.unit
+        else trap exp.at "assertion failure"
+      | ShowPrim ot, [v1] ->
+        if Show.can_show ot
+        then k (Value.Text (Show.show_val ot v1))
+        else raise (Invalid_argument "debug_show")
+      | CPSAsync _, [v1] ->
+        assert (not env.flavor.has_await && env.flavor.has_async_typ);
+        let (_, f) = V.as_func v1 in
+        let typ = (List.hd es).note.Note.typ in
+        begin match typ with
+        | T.Func(_, _, _, [f_typ; r_typ], _) ->
+          let call_conv_f = CC.call_conv_of_typ f_typ in
+          let call_conv_r = CC.call_conv_of_typ r_typ in
+          async env exp.at
+            (fun k' r ->
+              let vk' = Value.Func (call_conv_f, fun c v _ -> k' v) in
+              let vr = Value.Func (call_conv_r, fun c v _ -> r v) in
+              let vc = context env in
+              f vc (V.Tup [vk'; vr]) V.as_unit
+            )
+            k
+        | _ -> assert false
+        end
+      | CPSAwait _, [v1; v2] ->
+        assert (not env.flavor.has_await && env.flavor.has_async_typ);
+        begin match V.as_tup v2 with
+         | [vf; vr] ->
+           let (_, f) = V.as_func vf in
+           let (_, r) = V.as_func vr in
+           await env exp.at (V.as_async v1)
+             (fun v -> f (context env) v k)
+             (fun e -> r (context env) e k) (* TBR *)
+        | _ -> assert false
+        end
+      | OtherPrim s, vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        Prim.prim { Prim.trap = trap exp.at "%s" } s (context env) arg k
+      | CastPrim _, [v1] ->
+        k v1
+      | ActorOfIdBlob t, [v1] ->
+        k v1
+      | DecodeUtf8, [v1] ->
+        let s = V.as_blob v1 in
+        begin match Lib.Utf8.decode s with
+          | _ -> k (V.Opt (V.Text s))
+          | exception Lib.Utf8.Utf8 -> k V.Null
+        end
+      | EncodeUtf8, [v1] ->
+        k (V.Blob (V.as_text v1))
+      | BlobOfIcUrl, [v1] ->
+        begin match Ic.Url.decode_principal (V.as_text v1) with
+          | Ok bytes -> k (V.Blob bytes)
+          | Error e -> trap exp.at "could not parse %S as an actor reference: %s"  (V.as_text v1) e
+        end
+      | IcUrlOfBlob, [v1] ->
+        k (V.Text (Ic.Url.encode_principal (V.as_blob v1)))
+      | NumConvTrapPrim (t1, t2), vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        k (Prim.num_conv_trap_prim { Prim.trap = trap exp.at "%s" } t1 t2 arg)
+      | NumConvWrapPrim (t1, t2), vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        k (Prim.num_conv_wrap_prim { Prim.trap = trap exp.at "%s" } t1 t2 arg)
+      | ICReplyPrim ts, [v1] ->
+        assert (not env.flavor.has_async_typ);
+        let reply = Option.get env.replies in
+        Scheduler.queue (fun () -> reply v1)
+      | ICRejectPrim, [v1] ->
+        assert (not env.flavor.has_async_typ);
+        let reject = Option.get env.rejects in
+        let e = V.Tup [V.Variant ("canister_reject", V.unit); v1] in
+        Scheduler.queue (fun () -> reject e)
+      | ICCallPrim, [v1; v2; kv; rv] ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv (List.hd es) call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        let vc = context env in
+        f (V.Tup[vc; kv; rv]) v2 k
+      | ICCallerPrim, [] ->
+        k env.caller
+      | ICStableRead t, [] ->
+        let (_, tfs) = T.as_obj t in
+        let ve = List.fold_left
+          (fun ve' tf -> V.Env.add tf.T.lab V.Null ve')
+          V.Env.empty tfs
+        in
+        k (V.Obj ve)
+      | ICStableWrite _, [v1] ->
+        k V.unit (* faking it *)
+      | SelfRef _, [] ->
+        k (V.Blob env.self)
+      | SystemTimePrim, [] ->
+        k (V.Nat64 (Numerics.Nat64.of_int 42))
+      | SystemCyclesRefundedPrim, [] -> (* faking it *)
+        k (V.Nat64 (Numerics.Nat64.of_int 0))
+      | _ ->
+        trap exp.at "Unknown prim or wrong number of arguments (%d given):\n  %s"
+          (List.length es) (Wasm.Sexpr.to_string 80 (Arrange_ir.prim p))
+    )
+  | AssignE (lexp1, exp2) ->
+    interpret_lexp env lexp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        v1 := v2; k V.unit
+      )
+    )
+  | BlockE (decs, exp1) ->
+     interpret_block env None decs exp1 k
+  | IfE (exp1, exp2, exp3) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else interpret_exp env exp3 k
+    )
+  | SwitchE (exp1, cases) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_cases env cases exp.at v1 k
+    )
+  | TryE (exp1, cases) ->
+    let k' = fun v1 -> interpret_catches env cases exp.at v1 k in
+    let env' = { env with throws = Some k' } in
+    interpret_exp env' exp1 k
+  | LoopE exp1 ->
+    interpret_exp env exp1 (fun v -> V.as_unit v; interpret_exp env exp k)
+  | LabelE (id, _typ, exp1) ->
+    let env' = {env with labs = V.Env.add id k env.labs} in
+    interpret_exp env' exp1 k
+  | AsyncE (Type.Fut, _, exp1, _) ->
+    assert env.flavor.has_await;
+    async env
+      exp.at
+      (fun k' r ->
+        let env' = { env with labs = V.Env.empty; rets = Some k'; throws = Some r }
+        in interpret_exp env' exp1 k')
+      k
+  | AsyncE (Type.Cmp, _, exp1, _) ->
+    assert env.flavor.has_await;
+    k (V.Comp (fun k' r ->
+      let env' = { env with labs = V.Env.empty; rets = Some k'; throws = Some r }
+      in interpret_exp env' exp1 k'))
+  | DeclareE (id, typ, exp1) ->
+    let env = adjoin_vals env (declare_id id) in
+    interpret_exp env exp1 k
+  | DefineE (id, mut, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      let v' =
+        match mut with
+        | Const -> v
+        | Var -> V.Mut (ref v)
+      in
+      define_id env id v';
+      k V.unit
+      )
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    assert (not env.flavor.has_async_typ);
+    (* see code for FuncE *)
+    let cc = { sort = T.Shared T.Write; control = T.Replies; n_args = 0; n_res = List.length ts } in
+    let f = interpret_message env exp.at "anon" []
+      (fun env' -> interpret_exp env' exp_f) in
+    let v = make_message env "anon" cc f in
+    (* see code for ICCallPrim *)
+    interpret_exp env exp_k (fun kv ->
+    interpret_exp env exp_r (fun rv ->
+        let _call_conv, f = V.as_func v in
+        last_region := exp.at; (* in case the following throws *)
+        let vc = context env in
+        f (V.Tup[vc; kv; rv]) (V.Tup []) k))
+  | FuncE (x, (T.Shared _ as sort), (T.Replies as control), _typbinds, args, ret_typs, e) ->
+    assert (not env.flavor.has_async_typ);
+    let cc = { sort; control; n_args = List.length args; n_res = List.length ret_typs } in
+    let f = interpret_message env exp.at x args
+      (fun env' -> interpret_exp env' e) in
+    let v = make_message env x cc f in
+    k v
+  | FuncE (x, sort, control, _typbinds, args, ret_typs, e) ->
+    let cc = { sort; control; n_args = List.length args; n_res = List.length ret_typs } in
+    let f = interpret_func env exp.at sort x args
+      (fun env' -> interpret_exp env' e) in
+    let v = match cc.sort with
+      | T.Shared _ -> make_message env x cc f
+      | _ -> V.Func (cc, f)
+    in
+    k v
+  | ActorE (ds, fs, _, _) ->
+    interpret_actor env ds fs k
+  | NewObjE (sort, fs, _) ->
+    k (interpret_fields env fs)
+
+and interpret_actor env ds fs k =
+    let self = V.fresh_id () in
+    let env0 = {env with self = self} in
+    let ve = declare_decs ds V.Env.empty in
+    let env' = adjoin_vals env0 ve in
+    interpret_decs env' ds (fun _ ->
+      let obj = interpret_fields env' fs in
+      env.actor_env := V.Env.add self obj !(env.actor_env);
+      k (V.Blob self)
+    )
+
+and interpret_lexp env lexp (k : (V.value ref) V.cont) =
+  last_region := lexp.at;
+  last_env := env;
+  match lexp.it with
+  | VarLE id ->
+    (match Lib.Promise.value_opt (find id env.vals) with
+    | Some v -> k (V.as_mut v)
+    | None -> trap lexp.at "accessing identifier before its definition"
+    )
+  | DotLE (exp1, n) ->
+    interpret_exp env exp1 (fun v1 ->
+      let fs = V.as_obj v1 in
+      k (V.as_mut (try find n fs with _ -> assert false))
+    )
+  | IdxLE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (V.as_mut
+          (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap lexp.at "%s" s))
+      )
+    )
+
+and interpret_fields env fs =
+    let ve =
+      List.fold_left
+        (fun ve (f : field) ->
+          V.Env.disjoint_add f.it.name (Lib.Promise.value (find f.it.var env.vals)) ve
+        ) V.Env.empty fs in
+    V.Obj ve
+
+and interpret_exps env exps vs (k : V.value list V.cont) =
+  match exps with
+  | [] -> k (List.rev vs)
+  | exp::exps' ->
+    interpret_exp env exp (fun v -> interpret_exps env exps' (v::vs) k)
+
+
+(* Cases *)
+
+and interpret_cases env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    trap at "switch value %s does not match any case" (string_of_val env v)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_cases env cases' at v k
+
+(* Catches *)
+
+and interpret_catches env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    Option.get env.throws v (* re-throw v *)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_catches env cases' at v k
+
+(* Argument lists *)
+
+and match_arg a v : val_env = V.Env.singleton a.it (Lib.Promise.make_fulfilled v)
+
+and match_args at args v : val_env =
+  match args with
+  | [a] -> match_arg a v
+  | _ ->
+    let vs = V.as_tup v in
+    if (List.length vs <> List.length args) then
+      failwith (Printf.sprintf "%s %s" (Source.string_of_region at) (V.string_of_val 0 v));
+    List.fold_left V.Env.adjoin V.Env.empty (List.map2 match_arg args vs)
+
+(* Patterns *)
+
+and declare_id id =
+  V.Env.singleton id (Lib.Promise.make ())
+
+and declare_pat pat : val_env =
+  match pat.it with
+  | WildP | LitP _ ->  V.Env.empty
+  | VarP id -> declare_id id
+  | TupP pats -> declare_pats pats V.Env.empty
+  | ObjP pfs -> declare_pats (pats_of_obj_pat pfs) V.Env.empty
+  | OptP pat1
+  | TagP (_, pat1) -> declare_pat pat1
+  | AltP (pat1, _pat2) -> declare_pat pat1 (* pat2 has the same bindings *)
+
+and declare_pats pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve' = declare_pat pat in
+    declare_pats pats' (V.Env.adjoin ve ve')
+
+
+and define_id env id v =
+  Lib.Promise.fulfill (find id env.vals) v
+
+and define_pat env pat v =
+  match match_pat pat v with
+  | Some ve ->
+     V.Env.iter (fun id d  -> define_id env id (Lib.Promise.value d)) ve;
+     true
+  | None ->
+     false
+
+and match_lit lit v : bool =
+  match lit, v with
+  | NullLit, V.Null -> true
+  | BoolLit b, V.Bool b' -> b = b'
+  | NatLit n, V.Int n' -> Numerics.Int.eq n n'
+  | Nat8Lit n, V.Nat8 n' -> Numerics.Nat8.eq n n'
+  | Nat16Lit n, V.Nat16 n' -> Numerics.Nat16.eq n n'
+  | Nat32Lit n, V.Nat32 n' -> Numerics.Nat32.eq n n'
+  | Nat64Lit n, V.Nat64 n' -> Numerics.Nat64.eq n n'
+  | IntLit i, V.Int i' -> Numerics.Int.eq i i'
+  | Int8Lit i, V.Int8 i' -> Numerics.Int_8.eq i i'
+  | Int16Lit i, V.Int16 i' -> Numerics.Int_16.eq i i'
+  | Int32Lit i, V.Int32 i' -> Numerics.Int_32.eq i i'
+  | Int64Lit i, V.Int64 i' -> Numerics.Int_64.eq i i'
+  | FloatLit z, V.Float z' -> z = z'
+  | CharLit c, V.Char c' -> c = c'
+  | TextLit u, V.Text u' -> u = u'
+  | BlobLit b, V.Blob b' -> b = b'
+  | _ -> false
+
+and match_id id v : val_env =
+  V.Env.singleton id (Lib.Promise.make_fulfilled v)
+
+and match_pat pat v : val_env option =
+  match pat.it with
+  | WildP -> Some V.Env.empty
+  | VarP id -> Some (match_id id v)
+  | LitP lit ->
+    if match_lit lit v
+    then Some V.Env.empty
+    else None
+  | TupP pats ->
+    match_pats pats (V.as_tup v) V.Env.empty
+  | ObjP pfs ->
+    match_pat_fields pfs (V.as_obj v) V.Env.empty
+  | OptP pat1 ->
+    (match v with
+    | V.Opt v1 -> match_pat pat1 v1
+    | V.Null -> None
+    | _ -> assert false
+    )
+  | TagP (i, pat1) ->
+    let tag, v1 = V.as_variant v in
+    if i = tag
+    then match_pat pat1 v1
+    else None
+  | AltP (pat1, pat2) ->
+    (match match_pat pat1 v with
+    | None -> match_pat pat2 v
+    | some -> some
+    )
+
+and match_pats pats vs ve : val_env option =
+  match pats, vs with
+  | [], [] -> Some ve
+  | pat::pats', v::vs' ->
+    (match match_pat pat v with
+    | Some ve' -> match_pats pats' vs' (V.Env.adjoin ve ve')
+    | None -> None
+    )
+  | _ -> assert false
+
+and match_pat_fields pfs vs ve : val_env option =
+  match pfs with
+  | [] -> Some ve
+  | pf::pfs' ->
+    begin
+      match match_pat pf.it.pat (V.Env.find pf.it.name vs) with
+      | Some ve' -> match_pat_fields pfs' vs (V.Env.adjoin ve ve')
+      | None -> None
+    end
+
+(* Blocks and Declarations *)
+
+and interpret_block env ro decs exp k =
+  let ve = declare_decs decs V.Env.empty in
+  Option.iter (fun r -> r := ve) ro;
+  let env' = adjoin_vals env ve in
+  interpret_decs env' decs (fun _ -> interpret_exp env' exp k)
+
+and declare_dec dec : val_env =
+  match dec.it with
+  | LetD (pat, _) -> declare_pat pat
+  | VarD (id, _,  _) | RefD (id, _,  _) -> declare_id id
+
+and declare_decs decs ve : val_env =
+  match decs with
+  | [] -> ve
+  | dec::decs' ->
+    let ve' = declare_dec dec in
+    declare_decs decs' (V.Env.adjoin ve ve')
+
+
+and interpret_dec env dec k =
+  match dec.it with
+  | LetD (pat, exp) ->
+    interpret_exp env exp (fun v ->
+      if define_pat env pat v
+      then k ()
+      else trap pat.at "value %s does not match pattern" (string_of_val env v)
+    )
+  | VarD (id, _, exp) ->
+    interpret_exp env exp (fun v ->
+      define_id env id (V.Mut (ref v));
+      k ()
+    )
+  | RefD (id, _, lexp) ->
+    interpret_lexp env lexp (fun v ->
+      define_id env id (V.Mut v);
+      k ()
+    )
+
+and interpret_decs env decs (k : unit V.cont) =
+  match decs with
+  | [] -> k ()
+  | d::ds -> interpret_dec env d (fun () -> interpret_decs env ds k)
+
+and interpret_func env at sort x args f c v (k : V.value V.cont) =
+  if env.flags.trace then trace "%s%s" x (string_of_arg env v);
+  let caller =
+    if T.is_shared_sort sort
+    then c
+    else env.caller
+  in
+  let ve = match_args at args v in
+  incr trace_depth;
+  let k' = fun v' ->
+    if env.flags.trace then trace "<= %s" (string_of_val env v');
+    decr trace_depth;
+    k v'
+  in
+  let env' =
+    { env with
+      vals = V.Env.adjoin env.vals ve;
+      labs = V.Env.empty;
+      rets = Some k';
+      caller = caller;
+    }
+  in f env' k'
+
+and interpret_message env at x args f c v (k : V.value V.cont) =
+  let v_caller, v_reply, v_reject = match V.as_tup c with
+    | [v_caller; v_reply; v_reject] -> v_caller, v_reply, v_reject
+    | _ -> assert false
+  in
+  if env.flags.trace then trace "%s%s" x (string_of_arg env v);
+  let _, reply = V.as_func v_reply in
+  let _, reject = V.as_func v_reject in
+  let ve = match_args at args v in
+  incr trace_depth;
+  let k' = fun v' ->
+    if env.flags.trace then trace "<= %s" (string_of_val env v');
+    decr trace_depth;
+    k v'
+  in
+  let env' =
+    { env with
+      vals = V.Env.adjoin env.vals ve;
+      labs = V.Env.empty;
+      rets = Some k';
+      replies = Some (fun v -> reply (context env) v V.as_unit);
+      rejects = Some (fun v -> reject (context env) v V.as_unit);
+      caller = v_caller;
+    }
+  in f env' k'
+
+(* Programs *)
+
+and interpret_comp_unit env cu k = match cu with
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let ve = declare_decs ds V.Env.empty in
+    let env' = adjoin_vals env ve in
+    interpret_decs env' ds k
+  | ActorU (None, ds, fs, _, _)
+  | ActorU (Some [], ds, fs, _, _) ->
+    (* to match semantics of installation with empty argument *)
+    interpret_actor env ds fs (fun _ -> k ())
+  | ActorU (Some as_, ds, fs, up, t) ->
+    (* create the closure *)
+    let sort = T.Local in
+    let cc = CC.({ sort; control = T.Returns; n_args = List.length as_; n_res = 1 }) in
+    let f = interpret_func env no_region sort "" as_
+      (fun env' -> interpret_actor env ds fs) in
+    let _v = match cc.CC.sort with
+      | T.Shared _ -> make_message env "" cc f
+      | _ -> V.Func (cc, f)
+    in
+    (* but discard it, since this the last expression in the unit *)
+    k ()
+
+let interpret_prog flags (cu, flavor) =
+  let state = initial_state () in
+  let scope = empty_scope in
+  let env =
+    { (env_of_scope flags flavor state scope)
+      with throws = Some (fun v -> trap !last_region "uncaught throw") }
+  in
+  env.actor_env :=
+    (* ManagementCanister with raw_rand (only) *)
+    V.Env.singleton "" (V.Obj
+       (V.Env.singleton "raw_rand"
+         (make_message env "rand" CC.{
+             sort = T.Shared T.Write;
+             control = if env.flavor.has_async_typ then T.Promises else T.Replies;
+             n_args = 0;
+             n_res = 1
+           }
+           (fun c v k ->
+              async env
+                Source.no_region
+                  (fun k' r ->
+                    k' (V.Blob (V.Blob.rand32 ())))
+                    k))));
+  trace_depth := 0;
+  try
+    Scheduler.queue (fun () ->
+      try interpret_comp_unit env cu  (fun v -> ())
+      with Invalid_argument s -> trap !last_region "%s" s
+    );
+    Scheduler.run ()
+  with exn -> print_exn flags exn
+
+
+
+ + + diff --git a/coverage/ir_passes/async.ml.html b/coverage/ir_passes/async.ml.html new file mode 100644 index 00000000000..3d7c2b1bb09 --- /dev/null +++ b/coverage/ir_passes/async.ml.html @@ -0,0 +1,1625 @@ + + + + + async.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+
+
open Mo_types
+open Ir_def
+
+module E = Env
+open Source
+module Ir = Ir
+open Ir
+open Ir_effect
+module T = Type
+open T
+open Construct
+
+(* lower the async type itself
+   - adds a final reply argument to every awaitable shared function, replace
+     the result by unit
+   - declares a trapping reject callback in every awaitable shared function
+   - transforms types, introductions and eliminations of awaitable shared
+     functions only, leaving non-awaitable shared functions unchanged.
+   - ensures every call to an awaitable shared function that takes a tuple has
+     a manifest tuple argument extended with a final reply continuation.
+ *)
+
+module ConRenaming = E.Make(struct type t = T.con let compare = Cons.compare end)
+
+(* Helpers *)
+
+let selfcallE ts e1 e2 e3 =
+  { it = SelfCallE (ts, e1, e2, e3);
+    at = no_region;
+    note = Note.{ def with typ = T.unit } }
+
+let error_rep_ty = T.(Tup [Variant T.catchErrorCodes; text])
+
+let errorMessageE e =
+  projE (primE (CastPrim (T.error, error_rep_ty)) [e]) 1
+
+let unary typ = [typ]
+
+let nary typ = T.as_seq typ
+
+let fulfillT as_seq typ = T.Func(T.Local, T.Returns, [], as_seq typ, [])
+
+let failT = T.Func(T.Local, T.Returns, [], [T.catch], [])
+
+let t_async_fut as_seq t =
+  T.Func (T.Local, T.Returns, [], [fulfillT as_seq t; failT],
+    [T.sum [
+      ("suspend", T.unit);
+      ("schedule", T.Func(T.Local, T.Returns, [], [], []))]])
+
+let t_async_cmp as_seq t =
+  T.Func (T.Local, T.Returns, [], [fulfillT as_seq t; failT], [])
+
+let new_async_ret as_seq t = [t_async_fut as_seq t; fulfillT as_seq t; failT]
+
+let new_asyncT =
+  T.Func (
+    T.Local,
+    T.Returns,
+    [ { var = "T"; sort = T.Type; bound = T.Any } ],
+    [],
+    new_async_ret unary (T.Var ("T", 0)))
+
+let new_asyncE () =
+  varE (var "@new_async" new_asyncT)
+
+let new_async t =
+  let call_new_async = callE (new_asyncE ()) [t] (unitE()) in
+  let async = fresh_var "async" (typ (projE call_new_async 0)) in
+  let fulfill = fresh_var "fulfill" (typ (projE call_new_async 1)) in
+  let fail = fresh_var "fail" (typ (projE call_new_async 2)) in
+  (async, fulfill, fail), call_new_async
+
+let new_nary_async_reply ts =
+  (* The async implementation isn't n-ary *)
+  let t = T.seq ts in
+  let (unary_async, unary_fulfill, fail), call_new_async = new_async t in
+  (* construct the n-ary async value, coercing the continuation, if necessary *)
+  let nary_async =
+    let coerce u =
+      let v = fresh_var "v" u in
+      let k = fresh_var "k" (contT u T.unit) in
+      let r = fresh_var "r" (err_contT T.unit) in
+      [k; r] -->* (
+        varE unary_async -*-
+          (tupE [
+             [v] -->* (varE k -*- varE v);
+             varE r
+          ])
+      )
+    in
+    match ts with
+    | [t1] ->
+      begin
+      match T.normalize t1 with
+      | T.Tup _ ->
+        (* TODO(#3740): find a better fix than PR #3741 *)
+        (* HACK *)
+        coerce t1
+      | _ ->
+        varE unary_async
+      end
+    | ts1 ->
+      coerce t
+  in
+  (* construct the n-ary reply callback that take a *sequence* of values to fulfill the async *)
+  let nary_reply =
+    let vs, seq_of_vs =
+      let vs = fresh_vars "rep" ts in
+      vs, seqE (List.map varE vs)
+    in
+    vs -->* (varE unary_fulfill -*- seq_of_vs)
+  in
+  let async,reply,reject =
+    fresh_var "async" (typ nary_async),
+    fresh_var "reply" (typ nary_reply),
+    fresh_var "reject" (typ_of_var fail)
+  in
+    (async, reply, reject),
+      blockE [letP (tupP [varP unary_async; varP unary_fulfill; varP fail])  call_new_async]
+        (tupE [nary_async; nary_reply; varE fail])
+
+
+let let_eta e scope =
+  match e.it with
+  | VarE _ -> scope e (* pure, so reduce *)
+  | _  ->
+    let f = fresh_var "x" (typ e) in
+    letD f e :: (scope (varE f)) (* maybe impure; sequence *)
+
+let is_awaitable_func exp =
+  match typ exp with
+  | T.Func (T.Shared _, T.Promises, _, _, _) -> true
+  | _ -> false
+
+(* Given sequence type ts, bind e of type (seq ts) to a
+ sequence of expressions supplied to decs d_of_es,
+ preserving effects of e when the sequence type is empty.
+ d_of_es must not duplicate or discard the evaluation of es.
+ *)
+
+let let_seq ts e d_of_vs =
+  match ts with
+  | [] ->
+    (expD e)::d_of_vs []
+  | [t] ->
+    let x = fresh_var "x" t in
+    let p = varP x in
+    (letP p e)::d_of_vs [x]
+  | ts ->
+    let xs = fresh_vars "x" ts in
+    let p = tupP (List.map varP xs) in
+    (letP p e)::d_of_vs (xs)
+
+(* name e in f unless named already *)
+let ensureNamed e f =
+  match e.it with
+  | VarE v -> f (var v (typ e))
+  | _ ->
+    let v = fresh_var "v" (typ e) in
+    blockE [letD v e] (f v)
+
+(* The actual transformation *)
+
+let transform prog =
+
+  (* the state *)
+  let con_renaming = ref ConRenaming.empty
+
+  (* maps constructors to new constructors (name name, new stamp, new kind)
+     it is initialized with the type constructors defined outside here, which are
+     not rewritten.
+
+     If we run this translation on two program fragments (e.g. prelude and program)
+     we would have to pass down the `con_renaming`. But this is simply the right thing
+     to do for a pass that changes the context.
+
+     Eventually, pipeline will allow us to pass the con_renaming to downstream program
+     fragments, then we would simply start with an empty con_renaming and the prelude.
+  *)
+  in
+
+  let rec t_typ (t:T.typ) =
+    match t with
+    | T.Prim _
+      | Var _ -> t
+    | Con (c, ts) ->
+      Con (t_con c, List.map t_typ ts)
+    | Array t -> Array (t_typ t)
+    | Tup ts -> Tup (List.map t_typ ts)
+    | Func (s, c, tbs, ts1, ts2) ->
+      let c' = match c with T.Promises -> T.Replies | _ -> c in
+      Func (s, c', List.map t_bind tbs, List.map t_typ ts1, List.map t_typ ts2)
+    | Opt t -> Opt (t_typ t)
+    | Variant fs -> Variant (List.map t_field fs)
+    | Async (Fut, _, t) -> t_async_fut nary (t_typ t) (* TBR exploit the index _ *)
+    | Async (Cmp, _, t) -> t_async_cmp nary (t_typ t) (* TBR exploit the index _ *)
+    | Obj (s, fs) -> Obj (s, List.map t_field fs)
+    | Mut t -> Mut (t_typ t)
+    | Any -> Any
+    | Non -> Non
+    | Pre -> Pre
+    | Typ c -> Typ (t_con c)
+
+  and t_bind tb =
+    { tb with bound = t_typ tb.bound }
+
+  and t_binds typbinds = List.map t_bind typbinds
+
+  and t_kind k =
+    match k with
+    | T.Abs (typ_binds,typ) ->
+      T.Abs (t_binds typ_binds, t_typ typ)
+    | T.Def (typ_binds,typ) ->
+      T.Def (t_binds typ_binds, t_typ typ)
+
+  and t_con c =
+    match Cons.kind c with
+    | T.Def ([], T.Prim _) -> c
+    | _ ->
+      match  ConRenaming.find_opt c (!con_renaming) with
+      | Some c' -> c'
+      | None ->
+        let clone = Cons.clone c (Abs ([], Pre)) in
+        con_renaming := ConRenaming.add c clone (!con_renaming);
+        (* Need to extend con_renaming before traversing the kind *)
+        Type.set_kind clone (t_kind (Cons.kind c));
+        clone
+
+  and t_prim p = Ir.map_prim t_typ (fun id -> id) p
+
+  and t_field {lab; typ; depr} =
+    { lab; typ = t_typ typ; depr }
+  in
+
+  let rec t_exp (exp: exp) =
+    { it = t_exp' exp;
+      note = Note.{ def with
+        typ = t_typ exp.note.typ;
+        eff = exp.note.eff
+      };
+      at = exp.at;
+    }
+  and t_exp' (exp:exp) =
+    let exp' = exp.it in
+    match exp' with
+    | LitE _ -> exp'
+    | VarE id -> exp'
+    | AssignE (exp1, exp2) ->
+      AssignE (t_lexp exp1, t_exp exp2)
+    | PrimE (CPSAwait (Fut, cont_typ), [a; kr]) ->
+      begin match cont_typ with
+        | Func(_, _, [], _, []) ->
+          (* unit answer type, from await in `async {}` *)
+          (ensureNamed (t_exp kr) (fun vkr ->
+            let schedule = fresh_var "schedule" (T.Func(T.Local, T.Returns, [], [], [])) in
+            switch_variantE ((t_exp a) -*- varE vkr)
+              [ ("suspend", wildP,
+                  unitE()); (* suspend *)
+                ("schedule", varP schedule, (* resume later *)
+                  (* try await async (); schedule() catch e -> r(e) *)
+                 (let v = fresh_var "call" T.unit in
+                  letE v
+                    (selfcallE [] (ic_replyE [] (unitE())) (varE schedule) (projE (varE vkr) 1))
+                    (check_call_perform_status (varE v) (fun e -> projE (varE vkr) 1 -*- e))))
+              ]
+              T.unit
+          )).it
+        | _ -> assert false
+      end
+    | PrimE (CPSAwait (Cmp, cont_typ), [a; kr]) ->
+      begin match cont_typ with
+      | Func(_, _, [], _, []) ->
+         ((t_exp a) -*- (t_exp kr)).it
+      | _ -> assert false
+      end
+    | PrimE (CPSAsync (Fut, t), [exp1]) ->
+      let t0 = t_typ t in
+      let tb, ts1 = match typ exp1 with
+        | Func(_,_, [tb], [Func(_, _, [], ts1, []); _], []) ->
+          tb, List.map t_typ (List.map (T.open_ [t]) ts1)
+        | t -> assert false in
+      let ((nary_async, nary_reply, reject), def) =
+        new_nary_async_reply ts1
+      in
+      ( blockE [
+          letP (tupP [varP nary_async; varP nary_reply; varP reject]) def;
+          let ic_reply = (* flatten v, here and below? *)
+            let v = fresh_var "v" (T.seq ts1) in
+            v --> (ic_replyE ts1 (varE v)) in
+          let ic_reject =
+            let e = fresh_var "e" T.catch in
+            [e] -->* (ic_rejectE (errorMessageE (varE e))) in
+          let exp' = callE (t_exp exp1) [t0] (tupE [ic_reply; ic_reject]) in
+          expD (selfcallE ts1 exp' (varE nary_reply) (varE reject))
+        ]
+        (varE nary_async)
+      ).it
+    | PrimE (CPSAsync (Cmp, t), [exp1]) ->
+      let t0 = t_typ t in
+      let tb, t_ret, t_fail = match typ exp1 with
+        | Func(_,_, [tb], [t_ret; t_fail], _ ) ->
+          tb,
+          t_typ (T.open_ [t] t_ret),
+          t_typ (T.open_ [t] t_fail)
+        | t -> assert false
+      in
+      let v_ret = fresh_var "v" t_ret in
+      let v_fail = fresh_var "e" t_fail in
+      ([v_ret; v_fail] -->* (callE (t_exp exp1) [t0] (tupE [varE v_ret; varE v_fail]))).it
+    | PrimE (CallPrim typs, [exp1; exp2]) when is_awaitable_func exp1 ->
+      let ts1,ts2 =
+        match typ exp1 with
+        | T.Func (T.Shared _, T.Promises, tbs, ts1, ts2) ->
+          List.map (fun t -> t_typ (T.open_ typs t)) ts1,
+          List.map (fun t -> t_typ (T.open_ typs t)) ts2
+        | _ -> assert(false)
+      in
+      let exp1' = t_exp exp1 in
+      let exp2' = t_exp exp2 in
+      let ((nary_async, nary_reply, reject), def) =
+        new_nary_async_reply ts2
+      in
+      (blockE (
+        letP (tupP [varP nary_async; varP nary_reply; varP reject]) def ::
+        let_eta exp1' (fun v1 ->
+          let_seq ts1 exp2' (fun vs ->
+            [ expD (ic_callE v1 (seqE (List.map varE vs)) (varE nary_reply) (varE reject)) ]
+           )
+          )
+         )
+         (varE nary_async))
+        .it
+    | PrimE (OtherPrim "call_raw", [exp1; exp2; exp3]) ->
+      let exp1' = t_exp exp1 in
+      let exp2' = t_exp exp2 in
+      let exp3' = t_exp exp3 in
+      let ((nary_async, nary_reply, reject), def) = new_nary_async_reply [T.blob] in
+      (blockE (
+        letP (tupP [varP nary_async; varP nary_reply; varP reject]) def ::
+          let_eta exp1' (fun v1 ->
+          let_eta exp2' (fun v2 ->
+          let_eta exp3' (fun v3 ->
+            [ expD (ic_call_rawE v1 v2 v3 (varE nary_reply) (varE reject)) ]
+            )
+          ))
+         )
+         (varE nary_async))
+        .it
+    | PrimE (p, exps) ->
+      PrimE (t_prim p, List.map t_exp exps)
+    | BlockE b ->
+      BlockE (t_block b)
+    | IfE (exp1, exp2, exp3) ->
+      IfE (t_exp exp1, t_exp exp2, t_exp exp3)
+    | SwitchE (exp1, cases) ->
+      let cases' = List.map (fun {it = {pat; exp}; at; note} ->
+        { it = {pat = t_pat pat ; exp = t_exp exp}; at; note })
+        cases
+      in
+      SwitchE (t_exp exp1, cases')
+    | LoopE exp1 ->
+      LoopE (t_exp exp1)
+    | LabelE (id, typ, exp1) ->
+      LabelE (id, t_typ typ, t_exp exp1)
+    | AsyncE _
+    | TryE _ -> assert false
+    | DeclareE (id, typ, exp1) ->
+      DeclareE (id, t_typ typ, t_exp exp1)
+    | DefineE (id, mut ,exp1) ->
+      DefineE (id, mut, t_exp exp1)
+    | FuncE (x, s, c, typbinds, args, ret_tys, exp) ->
+      begin
+        match s with
+        | T.Local  ->
+          FuncE (x, s, c, t_typ_binds typbinds, t_args args, List.map t_typ ret_tys, t_exp exp)
+        | T.Shared s' ->
+          begin
+            match c, exp with
+            | Promises, exp ->
+              let ret_tys = List.map t_typ ret_tys in
+              let args' = t_args args in
+              let typbinds' = t_typ_binds typbinds in
+              let t0, cps = match exp.it with
+                | PrimE (CPSAsync (Type.Fut, t0), [cps]) -> t_typ t0, cps
+                | _ -> assert false in
+              let t1, contT = match typ cps with
+                | Func (_,_,
+                    [tb],
+                    [Func(_, _, [], ts1, []) as contT; _],
+                    []) ->
+                  (t_typ (T.seq (List.map (T.open_ [t0]) ts1)),t_typ (T.open_ [t0] contT))
+                | t -> assert false in
+              let k =
+                let v = fresh_var "v" t1 in
+                v --> (ic_replyE ret_tys (varE v)) in
+              let r =
+                let e = fresh_var "e" T.catch in
+                [e] -->* (ic_rejectE (errorMessageE (varE e))) in
+              let exp' = callE (t_exp cps) [t0] (tupE [k;r]) in
+              FuncE (x, T.Shared s', Replies, typbinds', args', ret_tys, exp')
+            (* oneway, always with `ignore(async _)` body *)
+            | Returns,
+              { it = BlockE (
+                  [ { it = LetD (
+                      { it = WildP; _},
+                      ({ it = PrimE (CPSAsync _, _); _} as exp)); _ }],
+                  { it = PrimE (TupPrim, []); _ } );
+                _ } ->
+              let ret_tys = List.map t_typ ret_tys in
+              let args' = t_args args in
+              let typbinds' = t_typ_binds typbinds in
+              let t0, cps = match exp.it with
+                | PrimE (CPSAsync (Type.Fut, t0), [cps]) -> t_typ t0, cps (* TBR *)
+                | _ -> assert false in
+              let t1, contT = match typ cps with
+                | Func (_, _,
+                    [tb],
+                    [Func(_, _, [], ts1, []) as contT; _],
+                    []) ->
+                  (t_typ (T.seq (List.map (T.open_ [t0]) ts1)),t_typ (T.open_ [t0] contT))
+                | t -> assert false in
+              let k =
+                let v = fresh_var "v" t1 in
+                v --> tupE [] in (* discard return *)
+              let r =
+                let e = fresh_var "e" T.catch in
+                [e] -->* tupE [] in (* discard error *)
+              let exp' = callE (t_exp cps) [t0] (tupE [k;r]) in
+              FuncE (x, T.Shared s', Returns, typbinds', args', ret_tys, exp')
+            | Returns, _ ->
+              assert false
+            | Replies,_ -> assert false
+          end
+      end
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+      ActorE (t_decs ds, t_fields fs,
+        {meta;
+         preupgrade = t_exp preupgrade;
+         postupgrade = t_exp postupgrade;
+         heartbeat = t_exp heartbeat;
+         timer = t_exp timer;
+         inspect = t_exp inspect
+        }, t_typ typ)
+    | NewObjE (sort, ids, t) ->
+      NewObjE (sort, t_fields ids, t_typ t)
+    | SelfCallE _ -> assert false
+
+  and t_lexp lexp =
+    { it = t_lexp' lexp.it;
+      note = t_typ lexp.note;
+      at = lexp.at;
+    }
+  and t_lexp' (lexp':lexp') =
+    match lexp' with
+    | VarLE _ -> lexp'
+    | DotLE (exp1, id) ->
+      DotLE (t_exp exp1, id)
+    | IdxLE (exp1, exp2) ->
+      IdxLE (t_exp exp1, t_exp exp2)
+
+  and t_dec dec = { dec with it = t_dec' dec.it }
+
+  and t_dec' dec' =
+    match dec' with
+    | LetD (pat,exp) -> LetD (t_pat pat,t_exp exp)
+    | VarD (id, t, exp) -> VarD (id, t_typ t, t_exp exp)
+    | RefD (id, t, lexp) -> RefD (id, t_typ t, t_lexp lexp)
+
+  and t_decs decs = List.map t_dec decs
+
+  and t_block (ds, exp) = (t_decs ds, t_exp exp)
+
+  and t_fields fs =
+    List.map (fun f -> { f with note = t_typ f.note }) fs
+
+  and t_args as_ = List.map t_arg as_
+
+  and t_arg a = { a with note = t_typ a.note }
+
+  and t_pat pat =
+    { pat with
+      it = t_pat' pat.it;
+      note = t_typ pat.note }
+
+  and t_pat' pat =
+    match pat with
+    | WildP
+    | LitP _
+    | VarP _ ->
+      pat
+    | TupP pats ->
+      TupP (List.map t_pat pats)
+    | ObjP pfs ->
+      ObjP (map_obj_pat t_pat pfs)
+    | OptP pat1 ->
+      OptP (t_pat pat1)
+    | TagP (i, pat1) ->
+      TagP (i, t_pat pat1)
+    | AltP (pat1, pat2) ->
+      AltP (t_pat pat1, t_pat pat2)
+
+  and t_typ_bind' tb =
+    { tb with con = t_con tb.con; bound = t_typ tb.bound }
+
+  and t_typ_bind typ_bind =
+    { typ_bind with it = t_typ_bind' typ_bind.it }
+
+  and t_typ_binds typbinds = List.map t_typ_bind typbinds
+
+  and t_comp_unit = function
+    | LibU _ -> raise (Invalid_argument "cannot compile library")
+    | ProgU ds -> ProgU (t_decs ds)
+    | ActorU (args_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+      ActorU (Option.map t_args args_opt, t_decs ds, t_fields fs,
+        { meta;
+          preupgrade = t_exp preupgrade;
+          postupgrade = t_exp postupgrade;
+          heartbeat = t_exp heartbeat;
+          timer = t_exp timer;
+          inspect = t_exp inspect
+        }, t_typ t)
+
+  and t_prog (cu, flavor) = (t_comp_unit cu, { flavor with has_async_typ = false } )
+in
+  t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/await.ml.html b/coverage/ir_passes/await.ml.html new file mode 100644 index 00000000000..791ec9d1019 --- /dev/null +++ b/coverage/ir_passes/await.ml.html @@ -0,0 +1,1971 @@ + + + + + await.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+
+
open Ir_def
+open Mo_types
+
+open Source
+open Ir
+open Ir_effect
+module R = Rename
+module T = Type
+open Construct
+
+let fresh_cont typ ans_typ = fresh_var "k" (contT typ ans_typ)
+
+let fresh_err_cont ans_typ  = fresh_var "r" (err_contT ans_typ)
+
+(* continuations, syntactic and meta-level *)
+
+type kont = ContVar of var
+          | MetaCont of T.typ * (var -> exp)
+
+let meta typ exp =
+  let expanded = ref false in
+  let exp v =
+    assert (not(!expanded));
+    expanded := true;
+    exp v
+  in
+  MetaCont (typ, exp)
+
+(* reify a continuation as syntax *)
+let letcont k scope =
+  match k with
+  | ContVar k' -> scope k' (* letcont eta-contraction *)
+  | MetaCont (typ0, cont) ->
+    let v = fresh_var "v" typ0 in
+    let e = cont v in
+    let k' = fresh_cont typ0 (typ e) in
+    blockE [funcD k' v e] (* at this point, I'm really worried about variable capture *)
+            (scope k')
+
+(* Named labels for break, special labels for return and throw *)
+type label = Return | Throw | Named of string
+
+let ( -@- ) k exp2 =
+  match k with
+  | ContVar v ->
+     varE v -*- exp2
+  | MetaCont (typ0, k) ->
+     match exp2.it with
+     | VarE v -> k (var v (typ exp2))
+     | _ ->
+        let u = fresh_var "u" typ0 in
+        letE u exp2 (k u)
+
+(* Label environments *)
+
+module LabelEnv = Env.Make(struct type t = label let compare = compare end)
+
+module PatEnv = Env.Make(String)
+
+type label_sort = Cont of kont | Label
+
+let typ_cases cases = List.fold_left (fun t case -> T.lub t (typ case.it.exp)) T.Non cases
+
+let rec t_async context exp =
+  match exp.it with
+  | AsyncE (s, tb, exp1, typ1) ->
+   let exp1 = R.exp R.Renaming.empty exp1 in (* rename all bound vars apart *) (*Why?*)
+   (* add the implicit return label *)
+   let k_ret = fresh_cont (typ exp1) T.unit in
+   let k_fail = fresh_err_cont T.unit in
+   let context' =
+     LabelEnv.add Return (Cont (ContVar k_ret))
+       (LabelEnv.add Throw (Cont (ContVar k_fail)) LabelEnv.empty)
+   in
+     cps_asyncE s typ1 (typ exp1)
+       (forall [tb] ([k_ret; k_fail] -->*
+          (c_exp context' exp1 (ContVar k_ret))))
+ |  _ -> assert false
+
+(* Trivial translation of pure terms (eff = T.Triv) *)
+and t_exp context exp =
+  assert (eff exp = T.Triv);
+  { exp with it = t_exp' context exp }
+and t_exp' context exp =
+  match exp.it with
+  | VarE _
+  | LitE _ -> exp.it
+  | AssignE (exp1, exp2) ->
+    AssignE (t_lexp context exp1, t_exp context exp2)
+  | BlockE b ->
+    BlockE (t_block context b)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp context exp1, t_exp context exp2, t_exp context exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' = List.map
+      (fun {it = {pat;exp}; at; note} ->
+        {it = {pat;exp = t_exp context exp}; at; note})
+      cases
+    in
+    SwitchE (t_exp context exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp context exp1)
+  | LabelE (id, _typ, exp1) ->
+    let context' = LabelEnv.add (Named id) Label context in
+    LabelE (id, _typ, t_exp context' exp1)
+  | PrimE (BreakPrim id, [exp1]) ->
+    begin
+      match LabelEnv.find_opt (Named id) context with
+      | Some (Cont k) -> (retE (k -@- t_exp context exp1)).it
+      | Some Label -> (breakE id (t_exp context exp1)).it
+      | None -> assert false
+    end
+  | PrimE (RetPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Return context with
+      | Some (Cont k) -> (retE (k -@- t_exp context exp1)).it
+      | Some Label -> (retE (t_exp context exp1)).it
+      | None -> assert false
+    end
+  | AsyncE (T.Cmp, _, _, _) ->
+     (t_async context exp).it
+  | AsyncE (T.Fut, _, _, _) ->
+     assert false  (* must have effect T.Await *)
+  | TryE _ -> assert false (* these never have effect T.Triv *)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp context exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp context exp1)
+  | FuncE (x, T.Local, c, typbinds, pat, typs,
+      ({ it = AsyncE _; _} as async)) ->
+    FuncE (x, T.Local, c, typbinds, pat, typs,
+      t_async context async)
+  | FuncE (x, T.Local, c, typbinds, pat, typs,
+      ({it = BlockE (ds, ({ it = AsyncE _; _} as async)); _} as wrapper)) ->
+    (* GH issue #3910 *)
+    FuncE (x, T.Local, c, typbinds, pat, typs,
+      { wrapper with it = BlockE (ds, t_async context async) })
+  | FuncE (x, (T.Shared _ as s), c, typbinds, pat, typs,
+      ({ it = AsyncE _;_ } as body)) ->
+    FuncE (x, s, c, typbinds, pat, typs,
+      t_async context body)
+  | FuncE (x, (T.Shared _ as s), c, typbinds, pat, typs,
+      { it = BlockE ([
+         { it = LetD (
+            { it = WildP; _} as wild_pat,
+            ({ it = AsyncE _; _} as body)); _ }],
+         ({ it = PrimE (TupPrim, []); _ } as unitE));
+        _
+      }) ->
+    FuncE (x, s, c, typbinds, pat, typs,
+      blockE [letP wild_pat (t_async context body)] unitE)
+  | FuncE (x, s, c, typbinds, pat, typs, exp1) ->
+    assert (not (T.is_local_async_func (typ exp)));
+    assert (not (T.is_shared_func (typ exp)));
+    let context' = LabelEnv.add Return Label LabelEnv.empty in
+    FuncE (x, s, c, typbinds, pat, typs, t_exp context' exp1)
+  | ActorE (ds, ids, { meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+    ActorE (t_decs context ds, ids,
+      { meta;
+        preupgrade = t_exp LabelEnv.empty preupgrade;
+        postupgrade = t_exp LabelEnv.empty postupgrade;
+        heartbeat = t_ignore_throw LabelEnv.empty heartbeat;
+        timer = t_ignore_throw LabelEnv.empty timer;
+        inspect = t_exp LabelEnv.empty inspect
+      },
+      t)
+  | NewObjE (sort, ids, typ) -> exp.it
+  | SelfCallE _ -> assert false
+  | PrimE (p, exps) ->
+    (* async calls have effect T.Await, not T.Triv *)
+    assert (not (is_async_call p exps));
+    PrimE (p, List.map (t_exp context) exps)
+
+and t_lexp context lexp =
+  { lexp with it = t_lexp' context lexp.it }
+and t_lexp' context lexp' =
+  match lexp' with
+  | VarLE i -> VarLE i
+  | DotLE (exp1, id) -> DotLE (t_exp context exp1, id)
+  | IdxLE (exp1, exp2) -> IdxLE (t_exp context exp1, t_exp context exp2)
+
+and t_dec context dec =
+  {dec with it = t_dec' context dec.it}
+and t_dec' context dec' =
+  match dec' with
+  | LetD (pat, exp) -> LetD (pat, t_exp context exp)
+  | VarD (id, t, exp) -> VarD (id, t, t_exp context exp)
+  | RefD (id, t, lexp) -> RefD (id, t, t_lexp context lexp)
+
+and t_decs context decs = List.map (t_dec context) decs
+
+and t_block context (ds, exp) = (t_decs context ds, t_exp context exp)
+
+(* non-trivial translation of possibly impure terms (eff = T.Await) *)
+
+and unary context k unE e1 =
+  match eff e1 with
+  | T.Await ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> k -@- unE v1))
+  | T.Triv ->
+    assert false
+
+and binary context k binE e1 e2 =
+  match eff e1, eff e2 with
+  | T.Triv, T.Await ->
+    let v1 = fresh_var "v" (typ e1) in (* TBR *)
+    letE v1 (t_exp context e1)
+      (c_exp context e2 (meta (typ e2) (fun v2 -> k -@- binE (varE v1) (varE v2))))
+  | T.Await, T.Await ->
+    c_exp context e1
+      (meta (typ e1) (fun v1 ->
+           c_exp context e2
+             (meta (typ e2) (fun v2 ->
+                  k -@- binE (varE v1) (varE v2)))))
+  | T.Await, T.Triv ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> k -@- binE (varE v1) (t_exp context e2)))
+  | T.Triv, T.Triv ->
+    assert false
+
+and nary context k naryE es =
+  let rec nary_aux vs es  =
+    match es with
+    | [] -> k -@- naryE (List.rev vs)
+    | [e1] when eff e1 = T.Triv ->
+      (* TBR: optimization - no need to name the last trivial argument *)
+      k -@- naryE (List.rev (t_exp context e1 :: vs))
+    | e1 :: es ->
+      match eff e1 with
+      | T.Triv ->
+        let v1 = fresh_var "v" (typ e1) in
+        letE v1 (t_exp context e1)
+          (nary_aux (varE v1 :: vs) es)
+      | T.Await ->
+        c_exp context e1
+          (meta (typ e1) (fun v1 -> nary_aux (varE v1 :: vs) es))
+  in
+  nary_aux [] es
+
+
+and c_if context k e1 e2 e3 =
+  letcont k (fun k ->
+  let trans_branch exp = match eff exp with
+    | T.Triv -> varE k -*- t_exp context exp
+    | T.Await -> c_exp context exp (ContVar k)
+  in
+  let e2 = trans_branch e2 in
+  let e3 = trans_branch e3 in
+  match eff e1 with
+  | T.Triv ->
+    ifE (t_exp context e1) e2 e3
+  | T.Await ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> ifE (varE v1) e2 e3))
+  )
+
+and c_loop context k e1 =
+  match eff e1 with
+  | T.Triv ->
+    assert false
+  | T.Await ->
+    let loop = fresh_var "loop" (contT T.unit T.unit) in
+    let v1 = fresh_var "v" T.unit in
+    blockE
+      [funcD loop v1 (c_exp context e1 (ContVar loop))]
+      (varE loop -*- unitE ())
+
+and c_assign context k e lexp1 exp2 =
+ match lexp1.it with
+ | VarLE _ ->
+   unary context k (fun v2 -> e (AssignE(lexp1, varE v2))) exp2
+ | DotLE (exp11, id) ->
+   binary context k (fun v11 v2 ->
+     e (AssignE ({lexp1 with it = DotLE (v11, id)}, v2))) exp11 exp2
+ | IdxLE (exp11, exp12) ->
+   nary context k
+     (fun vs -> match vs with
+       | [v11; v12; v2] ->
+         e (AssignE ({lexp1 with it = IdxLE (v11, v12)}, v2))
+       | _ -> assert false)
+     [exp11; exp12; exp2]
+
+and c_exp context exp =
+  c_exp' context exp
+
+and c_exp' context exp k =
+  let e exp' = {exp with it = exp'} in
+  match exp.it with
+  | _ when is_triv exp ->
+    k -@- (t_exp context exp)
+  | VarE _
+  | LitE _
+  | FuncE _ ->
+    assert false
+  | ActorE _ ->
+    assert false; (* ActorE fields cannot await *)
+  | AssignE (exp1, exp2) ->
+    c_assign context k e exp1 exp2
+  | BlockE (decs, exp) ->
+    c_block context decs exp k
+  | IfE (exp1, exp2, exp3) ->
+    c_if context k exp1 exp2 exp3
+  | SwitchE (exp1, cases) ->
+    letcont k (fun k ->
+    let cases' = List.map
+      (fun {it = {pat;exp}; at; note} ->
+        let exp' = match eff exp with
+          | T.Triv -> varE k -*- (t_exp context exp)
+          | T.Await -> c_exp context exp (ContVar k)
+        in
+        {it = { pat; exp = exp' }; at; note})
+      cases
+    in
+    let typ' = typ_cases cases' in
+    begin
+    match eff exp1 with
+    | T.Triv ->
+      { it = SwitchE(t_exp context exp1, cases');
+        at = exp.at;
+        note = Note.{ exp.note with typ = typ' } }
+    | T.Await ->
+       c_exp context exp1
+         (meta (typ exp1)
+           (fun v1 ->
+             { it = SwitchE(varE v1, cases');
+               at = exp.at;
+               note = Note.{ exp.note with typ = typ' } }))
+    end)
+  | TryE (exp1, cases) ->
+    (* TODO: do we need to reify f? *)
+    let f = match LabelEnv.find Throw context with Cont f -> f | _ -> assert false in
+    letcont f (fun f ->
+    letcont k (fun k ->
+    match eff exp1 with
+    | T.Triv ->
+      varE k -*- (t_exp context exp1)
+    | T.Await ->
+      let error = fresh_var "v" T.catch  in
+      let cases' =
+        List.map
+          (fun {it = {pat;exp}; at; note} ->
+            let exp' = match eff exp with
+              | T.Triv -> varE k -*- (t_exp context exp)
+              | T.Await -> c_exp context exp (ContVar k)
+            in
+            { it = {pat;exp = exp' }; at; note })
+          cases
+        @ [{ it = {pat = varP error; exp = varE f -*- varE error};
+             at = no_region;
+             note = ()
+        }] in
+      let throw = fresh_err_cont (answerT (typ_of_var k)) in
+      let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+      blockE
+        [ let e = fresh_var "e" T.catch in
+          funcD throw e {
+            it = SwitchE (varE e, cases');
+            at = exp.at;
+            note = Note.{ def with typ = typ_cases cases'; eff = T.Await; (* shouldn't matter *) }
+          }
+        ]
+        (c_exp context' exp1 (ContVar k))
+    ))
+  | LoopE exp1 ->
+    c_loop context k exp1
+  | LabelE (id, _typ, exp1) ->
+    letcont k
+      (fun k ->
+        let context' = LabelEnv.add (Named id) (Cont (ContVar k)) context in
+        c_exp context' exp1 (ContVar k)) (* TODO optimize me, if possible *)
+  | PrimE (BreakPrim id, [exp1]) ->
+    begin
+      match LabelEnv.find_opt (Named id) context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label -> assert false
+      | None -> assert false
+    end
+  | PrimE (RetPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Return context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label -> assert false
+      | None -> assert false
+    end
+  | PrimE (ThrowPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Throw context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label
+      | None -> assert false
+    end
+  | AsyncE (T.Cmp, tb, exp1, typ1) ->
+    assert false (* must have effect T.Triv, handled by first case *)
+  | AsyncE (T.Fut, tb, exp1, typ1) ->
+    (* add the implicit return label *)
+    let k_ret = fresh_cont (typ exp1) T.unit in
+    let k_fail = fresh_err_cont T.unit in
+    let context' =
+      LabelEnv.add Return (Cont (ContVar k_ret))
+        (LabelEnv.add Throw (Cont (ContVar k_fail)) LabelEnv.empty)
+    in
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    let cps_async =
+      cps_asyncE T.Fut typ1 (typ exp1)
+        (forall [tb] ([k_ret; k_fail] -->*
+          (c_exp context' exp1 (ContVar k_ret)))) in
+    let k' = meta (typ cps_async)
+      (fun v ->
+        check_call_perform_status
+          (k -@- varE v)
+          (fun e -> r -@- e))
+    in
+    k' -@- cps_async
+  | PrimE (AwaitPrim s, [exp1]) ->
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    letcont r (fun r ->
+    letcont k (fun k ->
+      let kr = tupE [varE k; varE r] in
+      match eff exp1 with
+      | T.Triv ->
+        cps_awaitE s (typ_of_var k) (t_exp context exp1) kr
+      | T.Await ->
+        c_exp context exp1
+          (meta (typ exp1) (fun v1 -> (cps_awaitE s (typ_of_var k) (varE v1) kr)))
+    ))
+  | DeclareE (id, typ, exp1) ->
+    unary context k (fun v1 -> e (DeclareE (id, typ, varE v1))) exp1
+  | DefineE (id, mut, exp1) ->
+    unary context k (fun v1 -> e (DefineE (id, mut, varE v1))) exp1
+  | NewObjE _ -> exp
+  | SelfCallE _ -> assert false
+  | PrimE (p, exps) when is_async_call p exps ->
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    let k' = meta (typ exp)
+      (fun v ->
+        check_call_perform_status
+          (k -@- varE v)
+          (fun e -> r -@- e))
+    in
+    nary context k' (fun vs -> e (PrimE (p, vs))) exps
+  | PrimE (p, exps) ->
+    nary context k (fun vs -> e (PrimE (p, vs))) exps
+
+and c_block context decs exp k =
+  declare_decs decs (c_decs context decs (meta T.unit (fun _ -> c_exp context exp k)))
+
+and c_dec context dec (k:kont) =
+  match dec.it with
+  | LetD (pat,exp) ->
+    let patenv,pat' = rename_pat pat in
+    let block exp =
+      let dec_pat' = {dec with it = LetD(pat',exp)} in
+      blockE (dec_pat' :: define_pat patenv pat)
+        (k -@- tupE[])
+    in
+     begin
+       match eff exp with
+       | T.Triv ->
+         block (t_exp context exp)
+       | T.Await ->
+         c_exp context exp (meta (typ exp) (fun v -> block (varE v)))
+     end
+  | VarD (id, _typ, exp) ->
+    begin
+      match eff exp with
+      | T.Triv ->
+        k -@- define_idE id Var (t_exp context exp)
+      | T.Await ->
+        c_exp context exp
+          (meta (typ exp)
+            (fun v -> k -@- define_idE id Var (varE v)))
+    end
+  | RefD (id, _typ, _lexp) -> assert false
+    (* TODO: unclear if this can arise at all, and if so, how to translate it with existing tools *)
+
+and c_decs context decs k =
+  match decs with
+  | [] ->
+    k -@- unitE ()
+  | dec :: decs ->
+    c_dec context dec (meta T.unit (fun v -> c_decs context decs k))
+
+(* Blocks and Declarations *)
+
+and declare_dec dec exp : exp =
+  match dec.it with
+  | LetD (pat, _) -> declare_pat pat exp
+  | VarD (id, typ, _exp1) -> declare_id id (T.Mut typ) exp
+  | RefD (id, typ, _exp1) -> declare_id id typ exp
+
+and declare_decs decs exp : exp =
+  match decs with
+  | [] -> exp
+  | dec :: decs' ->
+    declare_dec dec (declare_decs decs' exp)
+
+(* Patterns *)
+
+and declare_id id typ exp =
+  declare_idE id typ exp
+
+and declare_pat pat exp : exp =
+  match pat.it with
+  | WildP | LitP  _ ->  exp
+  | VarP id -> declare_id id pat.note exp
+  | TupP pats -> declare_pats pats exp
+  | ObjP pfs -> declare_pats (pats_of_obj_pat pfs) exp
+  | OptP pat1
+  | TagP (_, pat1) -> declare_pat pat1 exp
+  | AltP (pat1, pat2) -> declare_pat pat1 exp
+
+and declare_pats pats exp : exp =
+  match pats with
+  | [] -> exp
+  | pat :: pats' ->
+    declare_pat pat (declare_pats pats' exp)
+
+and rename_pat pat =
+  let (patenv,pat') = rename_pat' pat in
+  (patenv, { pat with it = pat' })
+
+and rename_pat' pat =
+  match pat.it with
+  | WildP
+  | LitP _ -> (PatEnv.empty, pat.it)
+  | VarP id ->
+    let v = fresh_var "v" pat.note in
+    (PatEnv.singleton id v, VarP (id_of_var v))
+  | TupP pats ->
+    let (patenv,pats') = rename_pats pats in
+    (patenv,TupP pats')
+  | ObjP pfs ->
+    let (patenv, pats') = rename_pats (pats_of_obj_pat pfs) in
+    let pfs' = replace_obj_pat pfs pats' in
+    (patenv, ObjP pfs')
+  | OptP pat1 ->
+    let (patenv,pat1) = rename_pat pat1 in
+    (patenv, OptP pat1)
+  | TagP (i, pat1) ->
+    let (patenv,pat1) = rename_pat pat1 in
+    (patenv, TagP (i, pat1))
+  | AltP (pat1,pat2) ->
+    assert(Freevars.(M.is_empty (pat pat1)));
+    assert(Freevars.(M.is_empty (pat pat2)));
+    (PatEnv.empty,pat.it)
+
+and rename_pats pats =
+  match pats with
+  | [] -> (PatEnv.empty,[])
+  | (pat :: pats) ->
+    let (patenv1, pat') = rename_pat pat in
+    let (patenv2, pats') = rename_pats pats in
+    (PatEnv.disjoint_union patenv1 patenv2, pat' :: pats')
+
+and define_pat patenv pat : dec list =
+  match pat.it with
+  | WildP
+  | LitP _ ->
+    []
+  | VarP id ->
+    [ expD (define_idE id Const (varE (PatEnv.find id patenv))) ]
+  | TupP pats -> define_pats patenv pats
+  | ObjP pfs -> define_pats patenv (pats_of_obj_pat pfs)
+  | OptP pat1
+  | TagP (_, pat1) -> define_pat patenv pat1
+  | AltP (pat1, pat2) ->
+    assert(Freevars.(M.is_empty (pat pat1)));
+    assert(Freevars.(M.is_empty (pat pat2)));
+    []
+
+and define_pats patenv (pats : pat list) : dec list =
+  List.concat_map (define_pat patenv) pats
+
+and t_comp_unit context = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    begin
+      match infer_effect_decs ds with
+      | T.Triv ->
+        ProgU (t_decs context ds)
+      | T.Await ->
+        let throw = fresh_err_cont T.unit in
+        let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+        let e = fresh_var "e" T.catch in
+        ProgU [
+          funcD throw e (assertE (falseE ()));
+          expD (c_block context' ds (tupE []) (meta (T.unit) (fun v1 -> tupE [])))
+        ]
+    end
+  | ActorU (as_opt, ds, ids, { meta = m; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+    ActorU (as_opt, t_decs context ds, ids,
+      { meta = m;
+        preupgrade = t_exp LabelEnv.empty preupgrade;
+        postupgrade = t_exp LabelEnv.empty postupgrade;
+        heartbeat = t_ignore_throw LabelEnv.empty heartbeat;
+        timer = t_ignore_throw LabelEnv.empty timer;
+        inspect = t_exp LabelEnv.empty inspect;
+      },
+      t)
+
+and t_ignore_throw context exp =
+  match exp.it with
+  | Ir.PrimE (Ir.TupPrim, []) ->
+     exp
+  | _ ->
+     let throw = fresh_err_cont T.unit in
+     let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+     let e = fresh_var "e" T.catch in
+     { (blockE [
+          funcD throw e (tupE[]);
+        ]
+        (c_exp context' exp (meta (T.unit) (fun v1 -> tupE []))))
+       (* timer logic requires us to preserve any source location,
+          or timer won't be initialized in compile.ml *)
+       with at = exp.at
+     }
+
+
+and t_prog (prog, flavor) =
+  (t_comp_unit LabelEnv.empty prog, { flavor with has_await = false })
+
+let transform prog = t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/const.ml.html b/coverage/ir_passes/const.ml.html new file mode 100644 index 00000000000..b4f5c6ae808 --- /dev/null +++ b/coverage/ir_passes/const.ml.html @@ -0,0 +1,757 @@ + + + + + const.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+
+
open Mo_types
+open Ir_def
+open Source
+open Ir
+open Lbool
+
+(*
+  This module identifies subexpressions that can be compiled statically. This
+  means each subexpression must be a constant, immutable value for which the
+  backend can create the memory representation statically.
+
+  This module should stay in sync with the
+   * the `compile_const_exp` function in `codegen/compile.ml`
+   * the `Const.t` type in `codegen/compile.ml.
+   * the checks in Check_ir.
+
+  ## What is const?
+
+  The high-level idea is
+
+  * Variables can be const if their definition is const (beware, recursion!)
+  * Blocks can be const if
+    - all RHSs are const, and
+    - no mutable variable are defined, and
+    - pattern matching is side-effect free, i.e. irrefutable
+  * Functions can be const if they do not require a closure.
+    This is the case if every free variable is
+    - const or
+    - bound at the top level (`loc_known = true` below)
+  * Literals can be const
+  * Data structures can be const if they are immutable and all components are
+    const
+  * Projections can be const if they cannot fail (so no array index) and
+    their argument is const
+
+  I say “can be const” because the analysis does not have to be complete, just
+  conservative.
+
+  ## How does the analysis work?
+
+  If we didn't have recursion, this would be simple: We'd pass down an environment
+  mapping all free variables to whether they are constant or not (bool E.t), use this
+  in the VarE case, and otherwise const-able expressions are constant when their
+  subexpressions are.
+
+  As always, recursion makes things harder. But not too much, thanks to a trick:
+  we pass down a custom type called `Lbool.t`. It denotes a boolean value,
+  just we do not know which one yet.  But we can still register implications on
+  these values. Internally, these lazy_bool values keep track of their
+  dependencies, and propagate additional information automatically. When one of them
+  knows it is going to be surely false, then it updates the corresponding
+  `note.const` field. See lbool.mli for more on that.
+
+  This analysis relies on the fact that AST notes are mutable. So sharing AST
+  nodes would be bad.  Check_ir checks for the absence of sharing.
+*)
+
+(* The environment *)
+
+type lvl = TopLvl | NotTopLvl
+
+module M = Env.Make(String)
+
+type info = {
+  loc_known : bool;
+  const : Lbool.t;
+}
+type env = info M.t
+
+
+let no_info = { loc_known = false; const = surely_false }
+let arg lvl env a = M.add a.it { no_info with loc_known = lvl = TopLvl } env
+let args lvl env as_ = List.fold_left (arg lvl) env as_
+
+let rec pat env p = match p.it with
+  | WildP
+  | LitP _ -> env
+  | VarP id -> M.add id no_info env
+  | TupP pats -> List.fold_left pat env pats
+  | ObjP pfs -> List.fold_left pat env (pats_of_obj_pat pfs)
+  | AltP (pat1, _) | OptP pat1 | TagP (_, pat1) -> pat env pat1
+
+let find v env = match M.find_opt v env with
+  | None -> raise (Invalid_argument (Printf.sprintf "Unbound var: %s\n" v))
+  | Some lb -> lb
+
+
+(* Setting the notes *)
+
+let set_const e b =
+  if e.note.Note.const != b
+  then e.note <- Note.{ e.note with const = b }
+
+let set_lazy_const e lb =
+  set_const e true;
+  when_false lb (lazy (set_const e false))
+
+(* Traversals *)
+
+let rec exp lvl (env : env) e : Lbool.t =
+  let lb =
+    match e.it with
+    | VarE v -> (find v env).const
+    | FuncE (x, s, c, tp, as_ , ts, body) ->
+      exp_ NotTopLvl (args NotTopLvl env as_) body;
+      begin match s, lvl with
+      (* shared functions are not const for now *)
+      | Type.Shared _, _ -> surely_false
+      (* top-level functions can always be const (all free variables are top-level) *)
+      | _, TopLvl -> surely_true
+      | _, NotTopLvl ->
+        let lb = maybe_false () in
+        Freevars.M.iter (fun v _ ->
+          let {loc_known; const} = find v env in
+          if loc_known then () else (* static definitions are ok *)
+          required_for const lb
+        ) (Freevars.exp e);
+        lb
+      end
+    | NewObjE (Type.(Object | Module), fs, t) when Type.is_immutable_obj t ->
+      all (List.map (fun f -> (find f.it.var env).const) fs)
+    | BlockE (ds, body) ->
+      block lvl env (ds, body)
+    | PrimE (TupPrim, es)
+    | PrimE (ArrayPrim (Const, _), es) ->
+      all (List.map (fun e -> exp lvl env e) es)
+    | PrimE (DotPrim _, [e1] | ProjPrim _, [e1] | OptPrim, [e1] | TagPrim _, [e1]) ->
+      exp lvl env e1
+    | LitE _ ->
+      surely_true
+
+    (* All the following expressions cannot be const, but we still need to descend *)
+    | PrimE (_, es) ->
+      List.iter (exp_ lvl env) es;
+      surely_false
+    | DeclareE (id, _, e1) ->
+      exp_ lvl (M.add id no_info env) e1;
+      surely_false
+    | LoopE e1 | AsyncE (_, _, e1, _) ->
+      exp_ NotTopLvl env e1;
+      surely_false
+    | AssignE (_, e1) | LabelE (_, _, e1) | DefineE (_, _, e1) ->
+      exp_ lvl env e1;
+      surely_false
+    | IfE (e1, e2, e3) ->
+      exp_ lvl env e1;
+      exp_ lvl env e2;
+      exp_ lvl env e3;
+      surely_false
+    | SelfCallE (_, e1, e2, e3) ->
+      exp_ NotTopLvl env e1;
+      exp_ lvl env e2;
+      exp_ lvl env e3;
+      surely_false
+    | SwitchE (e1, cs) | TryE (e1, cs) ->
+      exp_ lvl env e1;
+      List.iter (case_ lvl env) cs;
+      surely_false
+    | NewObjE _ -> (* mutable objects *)
+      surely_false
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, _typ) ->
+      (* this may well be “the” top-level actor, so don’t update lvl here *)
+      let (env', _) = decs lvl env ds in
+      exp_ lvl env' preupgrade;
+      exp_ lvl env' postupgrade;
+      exp_ lvl env' heartbeat;
+      exp_ lvl env' timer;
+      exp_ lvl env' inspect;
+      surely_false
+  in
+  set_lazy_const e lb;
+  lb
+
+and exp_ lvl env e : unit = ignore (exp lvl env e)
+and case_ lvl env c : unit =
+  exp_ lvl (pat env c.it.pat) c.it.exp
+
+and gather_dec lvl scope dec : env =
+  let mk_info const = { loc_known = lvl = TopLvl; const } in
+  let ok = match dec.it with
+  | LetD (p, _) -> Ir_utils.is_irrefutable p
+  | VarD _ | RefD _ -> false
+  in
+  M.fold (fun v _ scope ->
+    if ok
+    then M.add v (mk_info (maybe_false ())) scope
+    else M.add v (mk_info surely_false) scope
+  ) (snd (Freevars.dec dec)) scope (* TODO: implement gather_dec more directly *)
+
+and gather_decs lvl ds : env =
+  List.fold_left (gather_dec lvl) M.empty ds
+
+and check_dec lvl env dec : Lbool.t = match dec.it with
+  | LetD (p, e) when Ir_utils.is_irrefutable p ->
+    let vs = snd (Freevars.dec dec) in (* TODO: implement gather_dec more directly *)
+    let lb = exp lvl env e in
+    M.iter (fun v _ -> required_for lb (M.find v env).const) vs;
+    lb
+  | VarD (_, _, e) | LetD (_, e) ->
+    exp_ lvl env e;
+    surely_false
+  | RefD (_, _, _) ->
+    surely_false
+
+and check_decs lvl env ds : Lbool.t =
+  all (List.map (check_dec lvl env) ds)
+
+and decs lvl env ds : (env * Lbool.t) =
+  let scope = gather_decs lvl ds in
+  let env' = M.adjoin env scope in
+  let could_be = check_decs lvl env' ds in
+  (env', could_be)
+
+and decs_ lvl env ds = ignore (decs lvl env ds)
+
+and block lvl env (ds, body) =
+  let (env', decs_const) = decs lvl env ds in
+  let exp_const = exp lvl env' body in
+  all [decs_const; exp_const]
+
+and comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds -> decs_ TopLvl M.empty ds
+  | ActorU (as_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = match as_opt with
+      | None -> M.empty
+      | Some as_ -> args TopLvl M.empty as_
+    in
+    let (env', _) = decs TopLvl env ds in
+    exp_ TopLvl env' preupgrade;
+    exp_ TopLvl env' postupgrade;
+    exp_ TopLvl env' heartbeat;
+    exp_ TopLvl env' timer;
+    exp_ TopLvl env' inspect
+
+let analyze ((cu, _flavor) : prog) =
+  ignore (comp_unit cu)
+
+
+
+ + + diff --git a/coverage/ir_passes/eq.ml.html b/coverage/ir_passes/eq.ml.html new file mode 100644 index 00000000000..f8dd58d1cac --- /dev/null +++ b/coverage/ir_passes/eq.ml.html @@ -0,0 +1,1024 @@ + + + + + eq.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+
+
(* Translates away equality on structured types. *)
+
+open Ir_def
+open Mo_types
+open Mo_values
+open Source
+open Ir
+module T = Type
+open Construct
+open Typ_hash
+
+(* Environment *)
+
+(* We go through the file and collect all structured type arguments to `OpEq`.
+   We store them in `params`, indexed by their `type_id`
+*)
+
+module M = Map.Make(String)
+type env =
+  { params : T.typ M.t ref
+  }
+
+let empty_env () : env = {
+  params = ref M.empty;
+  }
+
+let add_type env t : unit =
+  env.params := M.add (typ_hash t) t !(env.params)
+
+(* Function names *)
+
+(* For a concrete type `t` we want to create a function name for `eq`.
+   This name needs to be disjoint from all user-generated names.
+   Luckily, we are not limited in the characters to use at this point.
+*)
+
+let eq_name_for t =
+  "@eq<" ^ typ_hash t ^ ">"
+
+let eq_fun_typ_for t =
+  T.Func (T.Local, T.Returns, [], [t; t], [T.bool])
+
+let eq_var_for t : Construct.var =
+  var (eq_name_for t) (eq_fun_typ_for t)
+
+
+(* Smart equality constructor. *)
+
+(* This handles singletons directly, leaves primitives as Prims,
+   and calls the right eq_var_for otherwise
+*)
+
+let eq_func_body : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t e1 e2 ->
+  (* This is used when constructing equality functions, so e1 e2
+     are pure (variables, projections) and can be dropped *)
+  if T.singleton t
+  then blockE [expD (ignoreE e1); expD (ignoreE e2)] (trueE ())
+  else if Check_ir.has_prim_eq t
+  then primE (RelPrim (t, Operator.EqOp)) [e1; e2]
+  else varE (eq_var_for t) -*- (tupE [e1; e2])
+
+(* Construction helpers *)
+
+let arg1Var t = var "x1" t
+let arg2Var t = var "x2" t
+let arg1E t = varE (arg1Var t)
+let arg2E t = varE (arg2Var t)
+
+let define_eq : T.typ -> Ir.exp -> Ir.dec = fun t e ->
+  Construct.nary_funcD (eq_var_for t) [arg1Var t; arg2Var t] e
+
+let array_eq_func_body : T.typ -> Ir.exp -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e1 e2 ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [eq_fun_typ_for (T.Var ("T",0)); T.Array (T.Var ("T",0)); T.Array (T.Var ("T",0))], [T.bool]) in
+  callE (varE (var "@equal_array" fun_typ)) [t] (tupE [f; e1; e2])
+
+(* Synthesizing a single show function *)
+
+(* Returns the new declarations, as well as a list of further types it needs *)
+
+let eq_for : T.typ -> Ir.dec * T.typ list = fun t ->
+  match t with
+  (* Function wrappers around primitive types *)
+  (* These are needed when one of these types appears in an array, as we
+     need a function to pass to @equal_array *)
+  | t when T.singleton t || Check_ir.has_prim_eq t ->
+    define_eq t (eq_func_body t (arg1E t) (arg2E t)),
+    []
+  (* Error cases *)
+  | T.Con (c,_) ->
+    (* t is normalized, so this is a type parameter *)
+    raise (Invalid_argument ("eq_for: cannot handle type parameter " ^ T.string_of_typ t))
+  (* Structured types *)
+  | T.Tup ts' ->
+    let ts' = List.map T.normalize ts' in
+    define_eq t (
+      conjE (List.mapi (fun i t' ->
+        eq_func_body t' (projE (arg1E t) i) (projE (arg2E t) i)
+      ) ts')
+    ),
+    ts'
+  | T.Opt t' ->
+    let t' = T.normalize t' in
+    let y1 = var "y1" t' in
+    let y2 = var "y2" t' in
+    define_eq t (switch_optE (arg1E t)
+      (* x1 is null *)
+      ( switch_optE (arg2E t)
+        (* x2 is null *)
+        (trueE ())
+        (* x2 is ?_ *)
+        wildP (falseE ())
+        (* ret type *)
+        T.bool
+      ) (* x1 is ?y1 *)
+      ( varP y1 )
+      ( switch_optE (arg2E t)
+        (* x2 is null *)
+        (falseE ())
+        (* x2 is ?_ *)
+        ( varP y2 )
+        ( eq_func_body t' (varE y1) (varE y2) )
+        (* ret type *)
+        T.bool
+      )
+      (* ret type *)
+      T.bool
+    ),
+    [t']
+  | T.Array t' ->
+    begin match T.normalize t' with
+    | T.Mut _ -> assert false (* mutable arrays not equatable *)
+    | t' ->
+      define_eq t (array_eq_func_body t' (varE (eq_var_for t')) (arg1E t) (arg2E t)),
+      [t']
+    end
+  | T.Obj ((T.Object | T.Memory | T.Module), fs) ->
+    define_eq t (
+      conjE (List.map (fun f ->
+        let t' = T.as_immut (T.normalize f.Type.typ) in
+        eq_func_body t' (dotE (arg1E t) f.Type.lab t') (dotE (arg2E t) f.Type.lab t')
+      ) fs)
+    ),
+    List.map (fun f -> T.as_immut (T.normalize (f.Type.typ))) fs
+  | T.Variant fs ->
+    define_eq t (
+      (* switching on the diagonal *)
+      { it = SwitchE
+        ( tupE [arg1E t; arg2E t],
+          List.map (fun f ->
+            let t' = T.normalize f.Type.typ in
+            let y1 = var "y1" t' in
+            let y2 = var "y2" t' in
+            { it = {
+                pat = { it = TupP
+                  [ { it = TagP (f.Type.lab, varP y1); at = no_region; note = t }
+                  ; { it = TagP (f.Type.lab, varP y2); at = no_region; note = t }
+                  ]; at = no_region; note = T.Tup [t;t] };
+                exp = eq_func_body t' (varE y1) (varE y2);
+              }; at = no_region; note = ()
+            }) fs @
+            [ { it = { pat = wildP; exp = falseE () };
+                at = no_region; note = () } ]
+        );
+      at = no_region;
+      note = Note.{ def with typ = T.bool }
+      }
+    ),
+    List.map (fun (f : T.field) -> T.normalize f.T.typ) fs
+  | T.Non ->
+    define_eq t (unreachableE ()),
+    []
+  | t ->
+    raise (Invalid_argument ("Ir_passes.Eq.eq_on: Unexpected type " ^ T.string_of_typ t))
+
+(* Synthesizing the types recursively. Hopefully well-founded. *)
+
+let eq_decls : T.typ M.t -> Ir.dec list = fun roots ->
+  let seen = ref M.empty in
+
+  let rec go = function
+    | [] -> []
+    | t::todo when M.mem (typ_hash t) !seen ->
+      go todo
+    | t::todo ->
+      seen := M.add (typ_hash t) () !seen;
+      let (decl, deps) = eq_for t in
+      decl :: go (deps @ todo)
+  in go (List.map snd (M.bindings roots))
+
+(* The AST traversal *)
+
+(* Does two things:
+ - collects all structured uses of `OpEq` in the `env`
+ - for each actor, resets the environment, recurses,
+   and adds the equality functions (this keeps closed actors closed)
+*)
+
+let rec t_exps env = List.map (t_exp env)
+
+and t_exp env (e : Ir.exp) =
+  { e with it = t_exp' env e.it }
+
+and t_exp' env = function
+  | LitE l -> LitE l
+  | VarE id -> VarE id
+  | PrimE (RelPrim (ot, Operator.EqOp), [exp1; exp2]) when T.singleton ot ->
+    (* Handle singletons here, but beware of side-effects *)
+    let e1 = t_exp env exp1 in
+    let e2 = t_exp env exp2 in
+    (blockE [expD (ignoreE e1); expD (ignoreE e2)] (trueE ())).it
+  | PrimE (RelPrim (ot, Operator.EqOp), [exp1; exp2]) when not (Check_ir.has_prim_eq ot) ->
+    let t' = T.normalize ot in
+    add_type env t';
+    (varE (eq_var_for t') -*- (tupE [t_exp env exp1; t_exp env exp2])).it
+  | PrimE (p, es) -> PrimE (p, t_exps env es)
+  | AssignE (lexp1, exp2) ->
+    AssignE (t_lexp env lexp1, t_exp env exp2)
+  | FuncE (s, c, id, typbinds, pat, typT, exp) ->
+    FuncE (s, c, id, typbinds, pat, typT, t_exp env exp)
+  | BlockE block -> BlockE (t_block env block)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp env exp1, t_exp env exp2, t_exp env exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    SwitchE (t_exp env exp1, cases')
+  | TryE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    TryE (t_exp env exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp env exp1)
+  | LabelE (id, typ, exp1) ->
+    LabelE (id, typ, t_exp env exp1)
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, t_exp env e, typ)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp env exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp env exp1)
+  | NewObjE (sort, ids, t) ->
+    NewObjE (sort, ids, t)
+  | SelfCallE (ts, e1, e2, e3) ->
+    SelfCallE (ts, t_exp env e1, t_exp env e2, t_exp env e3)
+  | ActorE (ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    (* Until Actor expressions become their own units,
+       we repeat what we do in `comp_unit` below *)
+    let env1 = empty_env () in
+    let ds' = t_decs env1 ds in
+    let preupgrade' = t_exp env1 preupgrade in
+    let postupgrade' = t_exp env1 postupgrade in
+    let heartbeat' = t_exp env1 heartbeat in
+    let timer' = t_exp env1 timer in
+    let inspect' = t_exp env1 inspect in
+    let decls = eq_decls !(env1.params) in
+    ActorE (decls @ ds', fields,
+      {meta;
+       preupgrade = preupgrade';
+       postupgrade = postupgrade';
+       heartbeat = heartbeat';
+       timer = timer';
+       inspect = inspect'
+      }, typ)
+
+and t_lexp env (e : Ir.lexp) = { e with it = t_lexp' env e.it }
+and t_lexp' env = function
+  | VarLE id -> VarLE id
+  | IdxLE (exp1, exp2) ->
+    IdxLE (t_exp env exp1, t_exp env exp2)
+  | DotLE (exp1, n) ->
+    DotLE (t_exp env exp1, n)
+
+and t_dec env dec = { dec with it = t_dec' env dec.it }
+
+and t_dec' env dec' =
+  match dec' with
+  | LetD (pat,exp) -> LetD (pat,t_exp env exp)
+  | VarD (id, typ, exp) -> VarD (id, typ, t_exp env exp)
+  | RefD (id, typ, lexp) -> RefD (id, typ, t_lexp env lexp)
+
+and t_decs env decs = List.map (t_dec env) decs
+
+and t_block env (ds, exp) = (t_decs env ds, t_exp env exp)
+
+and t_comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let decls = eq_decls !(env.params) in
+    ProgU (decls @ ds')
+  | ActorU (as_opt, ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let preupgrade' = t_exp env preupgrade in
+    let postupgrade' = t_exp env postupgrade in
+    let heartbeat' = t_exp env heartbeat in
+    let timer' = t_exp env timer in
+    let inspect' = t_exp env inspect in
+    let decls = eq_decls !(env.params) in
+    ActorU (as_opt, decls @ ds', fields,
+      {meta;
+       preupgrade = preupgrade';
+       postupgrade = postupgrade';
+       heartbeat = heartbeat';
+       timer = timer';
+       inspect = inspect'
+      }, typ)
+
+(* Entry point for the program transformation *)
+
+let transform (cu, flavor) =
+  assert (not flavor.has_typ_field); (* required for hash_typ *)
+  (t_comp_unit cu, {flavor with has_poly_eq = false})
+
+
+
+ + + diff --git a/coverage/ir_passes/erase_typ_field.ml.html b/coverage/ir_passes/erase_typ_field.ml.html new file mode 100644 index 00000000000..e3f1583faf7 --- /dev/null +++ b/coverage/ir_passes/erase_typ_field.ml.html @@ -0,0 +1,712 @@ + + + + + erase_typ_field.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+
+
open Mo_types
+open Ir_def
+
+module E = Env
+open Source
+module Ir = Ir
+open Ir
+module T = Type
+open T
+
+(* Erase type fields from object types *)
+
+module ConRenaming = E.Make(struct type t = T.con let compare = Cons.compare end)
+
+let transform prog =
+
+  (* the state *)
+  let con_renaming = ref ConRenaming.empty
+
+  (* maps constructors to new constructors (name name, new stamp, new kind)
+     it is initialized with the type constructors defined outside here, which are
+     not rewritten.
+
+     If we run this translation on two program fragments (e.g. prelude and program)
+     we would have to pass down the `con_renaming`. But this is simply the right thing
+     to do for a pass that changes the context.
+
+     Eventually, pipeline will allow us to pass the con_renaming to downstream program
+     fragments, then we would simply start with an empty con_renaming and the prelude.
+
+     (c.f. async.ml.)
+  *)
+  in
+
+  (* Mostly boiler-plate homomorphic translation *)
+  let rec t_typ t =
+    match t with
+    (* The only interesting case *)
+    | Obj (s, fs) ->
+      Obj (s,
+        List.filter_map (fun f ->
+          if is_typ f.typ then None else Some (t_field f))
+        fs)
+    | T.Prim _
+    | Var _ -> t
+    | Con (c, ts) ->
+      Con (t_con c, List.map t_typ ts)
+    | Array t -> Array (t_typ t)
+    | Tup ts -> Tup (List.map t_typ ts)
+    | Func (s, c, tbs, ts1, ts2) ->
+      Func (s, c, List.map t_bind tbs, List.map t_typ ts1, List.map t_typ ts2)
+    | Opt t -> Opt (t_typ t)
+    | Variant fs -> Variant (List.map t_field fs)
+    | Async (s, t1, t2) -> Async (s, t_typ t1, t_typ t2)
+    | Mut t -> Mut (t_typ t)
+    | Any -> Any
+    | Non -> Non
+    | Pre -> Pre
+    | Typ c -> assert false (* second class *)
+
+  and t_bind tb =
+    { tb with bound = t_typ tb.bound }
+
+  and t_binds typbinds = List.map t_bind typbinds
+
+  and t_kind k =
+    match k with
+    | T.Abs (typ_binds,typ) ->
+      T.Abs (t_binds typ_binds, t_typ typ)
+    | T.Def (typ_binds,typ) ->
+      T.Def (t_binds typ_binds, t_typ typ)
+
+  and t_con c =
+    match Cons.kind c with
+    | T.Def ([], T.Prim _) -> c
+    | _ ->
+      match  ConRenaming.find_opt c (!con_renaming) with
+      | Some c' -> c'
+      | None ->
+        let clone = Cons.clone c (Abs ([], Pre)) in
+        con_renaming := ConRenaming.add c clone (!con_renaming);
+        (* Need to extend con_renaming before traversing the kind *)
+        Type.set_kind clone (t_kind (Cons.kind c));
+        clone
+
+  and t_prim p = Ir.map_prim t_typ (fun id -> id) p
+
+  and t_field {lab; typ; depr} =
+    { lab; typ = t_typ typ; depr }
+  in
+
+  let rec t_exp (exp : exp) =
+    { it = t_exp' exp;
+      note = Note.{ def with
+        typ = t_typ exp.note.typ;
+        eff = exp.note.eff
+      };
+      at = exp.at;
+    }
+  and t_exp' (exp : exp) =
+    let exp' = exp.it in
+    match exp' with
+    | LitE _ -> exp'
+    | VarE id -> exp'
+    | AssignE (exp1, exp2) ->
+      AssignE (t_lexp exp1, t_exp exp2)
+    | PrimE (p, exps) ->
+      PrimE (t_prim p, List.map t_exp exps)
+    | BlockE b ->
+      BlockE (t_block b)
+    | IfE (exp1, exp2, exp3) ->
+      IfE (t_exp exp1, t_exp exp2, t_exp exp3)
+    | SwitchE (exp1, cases) ->
+      SwitchE (t_exp exp1, List.map t_case cases)
+    | LoopE exp1 ->
+      LoopE (t_exp exp1)
+    | LabelE (id, typ, exp1) ->
+      LabelE (id, t_typ typ, t_exp exp1)
+    | AsyncE (s, tb, exp1, typ) ->
+      AsyncE (s, t_typ_bind tb, t_exp exp1, t_typ typ)
+    | TryE (exp1, cases) ->
+      TryE (t_exp exp1, List.map t_case cases)
+    | DeclareE (id, typ, exp1) ->
+      DeclareE (id, t_typ typ, t_exp exp1)
+    | DefineE (id, mut ,exp1) ->
+      DefineE (id, mut, t_exp exp1)
+    | FuncE (x, s, c, typbinds, args, ret_tys, exp) ->
+      FuncE (x, s, c, t_typ_binds typbinds, t_args args, List.map t_typ ret_tys, t_exp exp)
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+      ActorE (t_decs ds, t_fields fs,
+       {meta;
+        preupgrade = t_exp preupgrade;
+        postupgrade = t_exp postupgrade;
+        heartbeat = t_exp heartbeat;
+        timer = t_exp timer;
+        inspect = t_exp inspect;
+       }, t_typ typ)
+    | NewObjE (sort, ids, t) ->
+      NewObjE (sort, t_fields ids, t_typ t)
+    | SelfCallE _ -> assert false
+
+  and t_case {it = {pat; exp}; at; note} =
+    { it = {pat = t_pat pat; exp = t_exp exp}; at; note}
+
+  and t_lexp lexp =
+    { it = t_lexp' lexp.it;
+      note = t_typ lexp.note;
+      at = lexp.at;
+    }
+  and t_lexp' (lexp' : lexp') =
+    match lexp' with
+    | VarLE _ -> lexp'
+    | DotLE (exp1, id) ->
+      DotLE (t_exp exp1, id)
+    | IdxLE (exp1, exp2) ->
+      IdxLE (t_exp exp1, t_exp exp2)
+
+  and t_dec dec = { dec with it = t_dec' dec.it }
+
+  and t_dec' dec' =
+    match dec' with
+    | LetD (pat,exp) -> LetD (t_pat pat,t_exp exp)
+    | VarD (id, t, exp) -> VarD (id, t_typ t, t_exp exp)
+    | RefD (id, t, lexp) -> RefD (id, t_typ t, t_lexp lexp)
+
+  and t_decs decs = List.map t_dec decs
+
+  and t_block (ds, exp) = (t_decs ds, t_exp exp)
+
+  and t_fields fs =
+    List.map (fun f -> { f with note = t_typ f.note }) fs
+
+  and t_args as_ = List.map t_arg as_
+
+  and t_arg a = { a with note = t_typ a.note }
+
+  and t_pat pat =
+    { pat with
+      it = t_pat' pat.it;
+      note = t_typ pat.note }
+
+  and t_pat' pat =
+    match pat with
+    | WildP
+    | LitP _
+    | VarP _ ->
+      pat
+    | TupP pats ->
+      TupP (List.map t_pat pats)
+    | ObjP pfs ->
+      ObjP (map_obj_pat t_pat pfs)
+    | OptP pat1 ->
+      OptP (t_pat pat1)
+    | TagP (i, pat1) ->
+      TagP (i, t_pat pat1)
+    | AltP (pat1, pat2) ->
+      AltP (t_pat pat1, t_pat pat2)
+
+  and t_typ_bind' tb =
+    { tb with con = t_con tb.con; bound = t_typ tb.bound }
+
+  and t_typ_bind typ_bind =
+    { typ_bind with it = t_typ_bind' typ_bind.it }
+
+  and t_typ_binds typbinds = List.map t_typ_bind typbinds
+
+  and t_comp_unit = function
+    | LibU _ -> raise (Invalid_argument "cannot compile library")
+    | ProgU ds -> ProgU (t_decs ds)
+    | ActorU (args_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+      ActorU (Option.map t_args args_opt, t_decs ds, t_fields fs,
+        { meta;
+          preupgrade = t_exp preupgrade;
+          postupgrade = t_exp postupgrade;
+          heartbeat = t_exp heartbeat;
+          timer = t_exp timer;
+          inspect = t_exp inspect;
+        }, t_typ t)
+  and t_prog (cu, flavor) = (t_comp_unit cu, { flavor with has_typ_field = false } )
+in
+  t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/show.ml.html b/coverage/ir_passes/show.ml.html new file mode 100644 index 00000000000..5e5bd6eab41 --- /dev/null +++ b/coverage/ir_passes/show.ml.html @@ -0,0 +1,1147 @@ + + + + + show.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+
+
open Ir_def
+open Mo_types
+open Mo_values
+(* Translates away calls to `show`. *)
+open Source
+open Ir
+module T = Type
+open Construct
+open Typ_hash
+
+(* Environment *)
+
+(* We go through the file and collect all type arguments to `show`.
+   We store them in `params`, indexed by their `type_id`
+*)
+
+module M = Map.Make(String)
+type env =
+  { params : T.typ M.t ref
+  }
+
+let empty_env () : env = {
+  params = ref M.empty;
+  }
+
+let add_type env t : unit =
+  env.params := M.add (typ_hash t) t !(env.params)
+
+(* Function names *)
+
+(* For a concrete type `t` we want to create a function name for `show`.
+   This name needs to be disjoint from all user-generated names.
+   Luckily, we are not limited in the characters to use at this point.
+*)
+
+let show_name_for t =
+  "@show<" ^ typ_hash t ^ ">"
+
+let show_fun_typ_for t =
+  T.Func (T.Local, T.Returns, [], [t], [T.text])
+
+let show_var_for t : Construct.var =
+  var (show_name_for t) (show_fun_typ_for t)
+
+
+(* Construction helpers *)
+
+(* Many of these are simply the entry points for helper functions defined in
+   the prelude. *)
+
+let argVar t = var "x" t
+let argE t = varE (argVar t)
+
+let define_show : T.typ -> Ir.exp -> Ir.dec = fun t e ->
+  Construct.funcD (show_var_for t) (argVar t) e
+
+let invoke_generated_show : T.typ -> Ir.exp -> Ir.exp = fun t e ->
+  varE (show_var_for t) -*- e
+
+let invoke_prelude_show : string -> T.typ -> Ir.exp -> Ir.exp = fun n t e ->
+  let fun_typ = T.Func (T.Local, T.Returns, [], [t], [T.text]) in
+  varE (var n fun_typ) -*- argE t
+
+let invoke_text_of_option : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Opt (T.Var ("T",0))], [T.text]) in
+  callE (varE (var "@text_of_option" fun_typ)) [t] (tupE [f; e])
+
+let invoke_text_of_variant : T.typ -> Ir.exp -> T.lab -> Ir.exp -> Ir.exp = fun t f l e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [T.text; show_fun_typ_for (T.Var ("T",0)); T.Var ("T",0)], [T.text]) in
+  callE (varE (var "@text_of_variant" fun_typ)) [t] (tupE [textE l; f; e])
+
+let invoke_text_of_array : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Array (T.Var ("T",0))], [T.text]) in
+  callE (varE (var "@text_of_array" fun_typ)) [t] (tupE [f; e])
+
+let invoke_text_of_array_mut : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Array (T.Mut (T.Var ("T",0)))], [T.text]) in
+  callE (varE (var "@text_of_array_mut" fun_typ)) [t] (tupE [f; e])
+
+let list_build : 'a -> (unit -> 'a) -> 'a -> 'a list -> 'a list = fun pre sep post xs ->
+  let rec go = function
+    | [] -> [ post ]
+    | [x] -> [ x; post ]
+    | x::xs -> [ x; sep () ] @ go xs
+  in [ pre ] @ go xs
+
+let catE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  { it = PrimE (BinPrim (T.text, Operator.CatOp), [e1; e2])
+  ; at = no_region
+  ; note = { Note.def with Note.typ = T.text }
+  }
+
+let cat_list : Ir.exp list -> Ir.exp = fun es ->
+  List.fold_right catE es (textE "")
+
+(* Synthesizing a single show function *)
+
+(* Returns the new declarations, as well as a list of further types it needs *)
+
+
+let show_for : T.typ -> Ir.dec * T.typ list = fun t ->
+  match t with
+  | T.(Prim Bool) ->
+    define_show t (invoke_prelude_show "@text_of_Bool" t (argE t)),
+    []
+  | T.(Prim Nat) ->
+    define_show t (invoke_prelude_show "@text_of_Nat" t (argE t)),
+    []
+  | T.(Prim Int) ->
+    define_show t (invoke_prelude_show "@text_of_Int" t (argE t)),
+    []
+  | T.(Prim Nat8) ->
+    define_show t (invoke_prelude_show "@text_of_Nat8" t (argE t)),
+    []
+  | T.(Prim Nat16) ->
+    define_show t (invoke_prelude_show "@text_of_Nat16" t (argE t)),
+    []
+  | T.(Prim Nat32) ->
+    define_show t (invoke_prelude_show "@text_of_Nat32" t (argE t)),
+    []
+  | T.(Prim Nat64) ->
+    define_show t (invoke_prelude_show "@text_of_Nat64" t (argE t)),
+    []
+  | T.(Prim Int8) ->
+    define_show t (invoke_prelude_show "@text_of_Int8" t (argE t)),
+    []
+  | T.(Prim Int16) ->
+    define_show t (invoke_prelude_show "@text_of_Int16" t (argE t)),
+    []
+  | T.(Prim Int32) ->
+    define_show t (invoke_prelude_show "@text_of_Int32" t (argE t)),
+    []
+  | T.(Prim Int64) ->
+    define_show t (invoke_prelude_show "@text_of_Int64" t (argE t)),
+    []
+  | T.(Prim Float) ->
+    define_show t (invoke_prelude_show "@text_of_Float" t (argE t)),
+    []
+  | T.(Prim Text) ->
+    define_show t (invoke_prelude_show "@text_of_Text" t (argE t)),
+    []
+  | T.(Prim Char) ->
+    define_show t (invoke_prelude_show "@text_of_Char" t (argE t)),
+    []
+  | T.(Prim Blob) ->
+    define_show t (invoke_prelude_show "@text_of_Blob" t (argE t)),
+    []
+  | T.(Prim Principal) ->
+    define_show t (primE IcUrlOfBlob [primE T.(CastPrim (Prim Principal, Prim Blob)) [argE t]]),
+    []
+  | T.(Prim Null) ->
+    define_show t (textE "null"),
+    []
+  | T.Func _ ->
+    define_show t (textE "func"),
+    []
+  | T.Con (c,_) ->
+    (* t is normalized, so this is a type parameter *)
+    define_show t (textE ("show_for: cannot handle type parameter " ^ T.string_of_typ t)),
+    []
+  | T.Tup [] ->
+    define_show t (textE "()"),
+    []
+  | T.Tup ts' ->
+    let ts' = List.map T.normalize ts' in
+    define_show t (
+      cat_list (list_build
+        (textE "(") (fun () -> textE ", ") (textE ")")
+        (List.mapi (fun i t' -> invoke_generated_show t' (projE (argE t) i)) ts')
+      )
+    ),
+    ts'
+  | T.Opt t' ->
+    let t' = T.normalize t' in
+    define_show t (invoke_text_of_option t' (varE (show_var_for t')) (argE t)),
+    [t']
+  | T.Array t' ->
+    let t' = T.normalize t' in
+    begin match t' with
+    | T.Mut t' ->
+      define_show t (invoke_text_of_array_mut t' (varE (show_var_for t')) (argE t)),
+      [t']
+    | _ ->
+      define_show t (invoke_text_of_array t' (varE (show_var_for t')) (argE t)),
+      [t']
+    end
+  | T.Obj (T.Object, fs) ->
+    define_show t (
+      cat_list (list_build
+        (textE "{") (fun () -> textE "; ") (textE "}")
+        (List.map (fun f ->
+          let t' = T.as_immut (T.normalize f.Type.typ) in
+          catE
+            (textE (f.Type.lab ^ " = "))
+            (invoke_generated_show t' (dotE (argE t) f.Type.lab t'))
+          ) fs
+        )
+      )
+    ),
+    List.map (fun f -> T.as_immut (T.normalize (f.Type.typ))) fs
+  | T.Variant fs ->
+    define_show t (
+      switch_variantE
+        (argE t)
+        (List.map (fun {T.lab = l; typ = t'; _} ->
+          let t' = T.normalize t' in
+          l,
+          (varP (argVar t')), (* Shadowing, but that's fine *)
+          (invoke_text_of_variant t' (varE (show_var_for t')) l (argE t'))
+        ) fs)
+        (T.text)
+    ),
+    List.map (fun (f : T.field) -> T.normalize f.T.typ) fs
+  | T.Non ->
+    define_show t (unreachableE ()),
+    []
+  | _ -> assert false (* Should be prevented by can_show *)
+
+(* Synthesizing the types recursively. Hopefully well-founded. *)
+
+let show_decls : T.typ M.t -> Ir.dec list = fun roots ->
+  let seen = ref M.empty in
+
+  let rec go = function
+    | [] -> []
+    | t::todo when M.mem (typ_hash t) !seen ->
+      go todo
+    | t::todo ->
+      seen := M.add (typ_hash t) () !seen;
+      let (decl, deps) = show_for t in
+      decl :: go (deps @ todo)
+  in go (List.map snd (M.bindings roots))
+
+(* The AST traversal *)
+
+(* Does two things:
+ - collects all uses of `debug_show` in the `env`
+ - for each actor, resets the environment, recurses,
+   and adds the show functions (this keeps closed actors closed)
+*)
+
+let rec t_exps env decs = List.map (t_exp env) decs
+
+and t_exp env (e : Ir.exp) =
+  { e with it = t_exp' env e.it }
+
+and t_exp' env = function
+  | LitE l -> LitE l
+  | VarE id -> VarE id
+  | PrimE (ShowPrim ot, [exp1]) ->
+    let t' = T.normalize ot in
+    add_type env t';
+    (varE (show_var_for t') -*- t_exp env exp1).it
+  | PrimE (p, es) -> PrimE (p, t_exps env es)
+  | AssignE (lexp1, exp2) ->
+    AssignE (t_lexp env lexp1, t_exp env exp2)
+  | FuncE (s, c, id, typbinds, pat, typT, exp) ->
+    FuncE (s, c, id, typbinds, pat, typT, t_exp env exp)
+  | BlockE block -> BlockE (t_block env block)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp env exp1, t_exp env exp2, t_exp env exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    SwitchE (t_exp env exp1, cases')
+  | TryE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    TryE (t_exp env exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp env exp1)
+  | LabelE (id, typ, exp1) ->
+    LabelE (id, typ, t_exp env exp1)
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, t_exp env e, typ)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp env exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp env exp1)
+  | NewObjE (sort, ids, t) ->
+    NewObjE (sort, ids, t)
+  | SelfCallE (ts, e1, e2, e3) ->
+    SelfCallE (ts, t_exp env e1, t_exp env e2, t_exp env e3)
+  | ActorE (ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    (* Until Actor expressions become their own units,
+       we repeat what we do in `comp_unit` below *)
+    let env1 = empty_env () in
+    let ds' = t_decs env1 ds in
+    let preupgrade' = t_exp env1 preupgrade in
+    let postupgrade' = t_exp env1 postupgrade in
+    let heartbeat' = t_exp env1 heartbeat in
+    let timer' = t_exp env1 timer in
+    let inspect' = t_exp env1 inspect in
+    let decls = show_decls !(env1.params) in
+    ActorE (decls @ ds', fields,
+      { meta;
+        preupgrade = preupgrade';
+        postupgrade = postupgrade';
+        heartbeat = heartbeat';
+        timer = timer';
+        inspect = inspect'
+      }, typ)
+
+and t_lexp env (e : Ir.lexp) = { e with it = t_lexp' env e.it }
+and t_lexp' env = function
+  | VarLE id -> VarLE id
+  | IdxLE (exp1, exp2) ->
+    IdxLE (t_exp env exp1, t_exp env exp2)
+  | DotLE (exp1, n) ->
+    DotLE (t_exp env exp1, n)
+
+and t_dec env dec = { dec with it = t_dec' env dec.it }
+
+and t_dec' env dec' =
+  match dec' with
+  | LetD (pat,exp) -> LetD (pat,t_exp env exp)
+  | VarD (id, typ, exp) -> VarD (id, typ, t_exp env exp)
+  | RefD (id, typ, lexp) -> RefD (id, typ, t_lexp env lexp)
+
+and t_decs env decs = List.map (t_dec env) decs
+
+and t_block env (ds, exp) = (t_decs env ds, t_exp env exp)
+
+and t_comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let decls = show_decls !(env.params) in
+    ProgU (decls @ ds')
+  | ActorU (as_opt, ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let preupgrade' = t_exp env preupgrade in
+    let postupgrade' = t_exp env postupgrade in
+    let heartbeat' = t_exp env heartbeat in
+    let timer' = t_exp env timer in
+    let inspect' = t_exp env inspect in
+    let decls = show_decls !(env.params) in
+    ActorU (as_opt, decls @ ds', fields,
+      { meta;
+        preupgrade = preupgrade';
+        postupgrade = postupgrade';
+        heartbeat = heartbeat';
+        timer = timer';
+        inspect = inspect';
+      }, typ)
+
+(* Entry point for the program transformation *)
+
+let transform (cu, flavor) =
+  assert (not flavor.has_typ_field); (* required for hash_typ *)
+  (t_comp_unit cu, {flavor with has_show = false})
+
+
+
+ + + diff --git a/coverage/ir_passes/tailcall.ml.html b/coverage/ir_passes/tailcall.ml.html new file mode 100644 index 00000000000..d3ac9623a25 --- /dev/null +++ b/coverage/ir_passes/tailcall.ml.html @@ -0,0 +1,851 @@ + + + + + tailcall.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+
+
open Ir_def
+open Mo_types
+
+open Source
+open Ir
+open Ir_effect
+open Type
+open Construct
+
+(* Optimize (self) tail calls to jumps, avoiding stack overflow
+   in a single linear pass *)
+
+(*
+This is simple tail call optimizer that replaces tail calls to the current function by jumps.
+It can  easily be extended to non-self tail calls, once supported by wasm.
+
+For each function `f` whose `body[...]` has at least one self tailcall to `f<Ts>(es)`, apply the transformation:
+```
+    func f<Ts>(pat) = body[f<Ts>(es)+]
+    ~~>
+    func f<Ts>(args) = {
+       var temp = args;
+       loop {
+         label l {
+           let pat = temp;
+           return body[{temp := es;break l;}+]
+        }
+      }
+    }
+```
+
+
+It's implemented by a recursive traversal that maintains an environment recording whether the current term is in tail position,
+and what its enclosing function (if any) is.
+
+The enclosing function is forgotten when shadowed by a local binding (we don't assume all variables are distinct) and when
+entering a function, class or actor constructor.
+
+On little gotcha for functional programmers: the argument `e` to an early `return e` is *always* in tail position,
+regardless of `return e`s own tail position.
+
+TODO: optimize for multiple arguments using multiple temps (not a tuple).
+
+*)
+
+type func_info = { func: id;
+                   typ_binds: typ_bind list;
+                   temps: var list;
+                   label: id;
+                   tail_called: bool ref;
+                 }
+
+type env = { tail_pos:bool;          (* is the expression in tail position *)
+             info: func_info option; (* the innermost enclosing func, if any *)
+           }
+
+
+let bind env i (info:func_info option) : env =
+  match info with
+  | Some _ ->
+    { env with info = info; }
+  | None ->
+    match env.info with
+    | Some { func; _} when i = func ->
+      { env with info = None } (* remove shadowed func info *)
+    | _ -> env (* preserve existing, non-shadowed info *)
+
+let bind_arg env a info = bind env a.it info
+
+
+let are_generic_insts (tbs : typ_bind list) insts =
+  List.for_all2 (fun (tb : typ_bind) inst ->
+      match inst with
+      | Con(c2,[]) -> Cons.eq tb.it.con c2 (* conservative, but safe *)
+      |  _ -> false
+      ) tbs insts
+
+let rec tailexp env e =
+  {e with it = exp' env e}
+
+and exp env e  : exp =
+  {e with it = exp' {env with tail_pos = false}  e}
+
+and assignEs vars exp : dec list =
+  match vars, exp.it with
+  | [v], _ -> [ expD (assignE v exp) ]
+  | _, PrimE (TupPrim, es) when List.length es = List.length vars ->
+       List.map expD (List.map2 assignE vars es)
+  | _, _ ->
+    let tup = fresh_var "tup" (typ exp) in
+    letD tup exp ::
+    List.mapi (fun i v -> expD (assignE v (projE (varE v) i))) vars
+
+and exp' env e  : exp' = match e.it with
+  | VarE _ | LitE _     -> e.it
+  | AssignE (e1, e2)    -> AssignE (lexp env e1, exp env e2)
+  | PrimE (CallPrim insts, [e1; e2])  ->
+    begin match e1.it, env with
+    | VarE f1, { tail_pos = true;
+                 info = Some { func; typ_binds; temps; label; tail_called } }
+         when f1 = func && are_generic_insts typ_binds insts  ->
+      tail_called := true;
+      (blockE (assignEs temps (exp env e2)) (breakE label (unitE ()))).it
+    | _,_-> PrimE (CallPrim insts, [exp env e1; exp env e2])
+    end
+  | BlockE (ds, e)      -> BlockE (block env ds e)
+  | IfE (e1, e2, e3)    -> IfE (exp env e1, tailexp env e2, tailexp env e3)
+  | SwitchE (e, cs)     -> SwitchE (exp env e, cases env cs)
+  | TryE (e, cs)        -> TryE (exp env e, cases env cs) (* TBR *)
+  | LoopE e1            -> LoopE (exp env e1)
+  | LabelE (i, t, e)    -> let env1 = bind env i None in
+                           LabelE(i, t, exp env1 e)
+  | PrimE (RetPrim, [e])-> PrimE (RetPrim, [tailexp { env with tail_pos = true } e])
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, exp { tail_pos = true; info = None } e, typ)
+  | DeclareE (i, t, e)  -> let env1 = bind env i None in
+                           DeclareE (i, t, tailexp env1 e)
+  | DefineE (i, m, e)   -> DefineE (i, m, exp env e)
+  | FuncE (x, s, c, tbs, as_, ret_tys, exp0) ->
+    let env1 = { tail_pos = true; info = None} in
+    let env2 = args env1 as_ in
+    let exp0' = tailexp env2 exp0 in
+    FuncE (x, s, c, tbs, as_, ret_tys, exp0')
+  | SelfCallE (ts, exp1, exp2, exp3) ->
+    let env1 = { tail_pos = true; info = None} in
+    let exp1' = tailexp env1 exp1 in
+    let exp2' = exp env exp2 in
+    let exp3' = exp env exp3 in
+    SelfCallE (ts, exp1', exp2', exp3')
+  | ActorE (ds, fs, u, t) ->
+    let u = { u with preupgrade = exp env u.preupgrade; postupgrade = exp env u.postupgrade } in
+    ActorE (snd (decs env ds), fs, u, t)
+  | NewObjE (s,is,t)    -> NewObjE (s, is, t)
+  | PrimE (p, es)       -> PrimE (p, List.map (exp env) es)
+
+and lexp env le : lexp = {le with it = lexp' env le}
+
+and lexp' env le : lexp' = match le.it with
+  | VarLE i -> VarLE i
+  | DotLE (e, sn)  -> DotLE (exp env e, sn)
+  | IdxLE (e1, e2) -> IdxLE (exp env e1, exp env e2)
+
+and args env as_ =
+  List.fold_left (fun env a -> bind_arg env a None) env as_
+
+and pat env p =
+  let env = pat' env p.it in
+  env
+
+and pat' env = function
+  | WildP
+  | LitP _         -> env
+  | VarP i         -> bind env i None
+  | TupP ps        -> pats env ps
+  | ObjP pfs       -> pats env (pats_of_obj_pat pfs)
+  | OptP p
+  | TagP (_, p)    -> pat env p
+  | AltP (p1, _p2) -> pat env p1 (* both bind the same vars, ensured in check_pat *)
+
+and pats env ps  =
+  match ps with
+  | [] -> env
+  | p :: ps ->
+    let env1 = pat env p in
+    pats env1 ps
+
+and case env (c : case) =
+  { c with it = case' env c.it }
+and case' env {pat=p;exp=e} =
+  let env1 = pat env p in
+  let e' = tailexp env1 e in
+  { pat=p; exp=e' }
+
+
+and cases env cs = List.map (case env) cs
+
+and dec env d =
+  let (mk_d,env1) = dec' env d in
+  ({d with it = mk_d}, env1)
+
+and dec' env d =
+  match d.it with
+  (* A local let bound function, this is what we are looking for *)
+  (* TODO: Do we need to detect more? A tuple of functions? *)
+  | LetD (({it = VarP id;_} as id_pat),
+          ({it = FuncE (x, Local, c, tbs, as_, typT, exp0);_} as funexp)) ->
+    let env = bind env id None in
+    begin fun env1 ->
+      let temps = fresh_vars "temp" (List.map (fun a -> Mut a.note) as_) in
+      let label = fresh_id "tailcall" () in
+      let tail_called = ref false in
+      let env2 = { tail_pos = true;
+                   info = Some { func = id;
+                                 typ_binds = tbs;
+                                 temps;
+                                 label;
+                                 tail_called } }
+      in
+      let env3 = args env2 as_ in (* shadow id if necessary *)
+      let exp0' = tailexp env3 exp0 in
+      let cs = List.map (fun (tb : typ_bind) -> Con (tb.it.con, [])) tbs in
+      if !tail_called then
+        let ids = match typ funexp with
+          | Func( _, _, _, dom, _) ->
+            fresh_vars "id" (List.map (fun t -> open_ cs t) dom)
+          | _ -> assert false
+        in
+        let l_typ = Type.unit in
+        let body =
+          blockE (List.map2 (fun t i -> varD t (varE i)) temps ids) (
+            loopE (
+              labelE label l_typ (blockE
+                (List.map2 (fun a t -> letD (var_of_arg a) (immuteE (varE t))) as_ temps)
+                (retE exp0'))
+            )
+          )
+        in
+        LetD (id_pat, {funexp with it = FuncE (x, Local, c, tbs, List.map arg_of_var ids, typT, body)})
+      else
+        LetD (id_pat, {funexp with it = FuncE (x, Local, c, tbs, as_, typT, exp0')})
+    end,
+    env
+  | LetD (p, e) ->
+    let env = pat env p in
+    (fun env1 -> LetD(p,exp env1 e)),
+    env
+  | VarD (i, t, e) ->
+    let env = bind env i None in
+    (fun env1 -> VarD(i, t, exp env1 e)),
+    env
+  | RefD (i, t, e) ->
+    let env = bind env i None in
+    (fun env1 -> RefD(i, t, lexp env1 e)),
+    env
+
+and decs env ds =
+  let rec decs_aux env ds =
+    match ds with
+    | [] -> ([],env)
+    | d::ds ->
+      let (mk_d, env1) = dec env d in
+      let (mk_ds, env2) = decs_aux env1 ds in
+      (mk_d :: mk_ds,env2)
+  in
+  let mk_ds,env1 = decs_aux env ds in
+  env1,
+  List.map
+    (fun mk_d ->
+      let env2 = { env1 with tail_pos = false } in
+      { mk_d with it = mk_d.it env2 })
+    mk_ds
+
+and block env ds exp =
+  let (env1, ds') = decs env ds in
+  ( ds', tailexp env1 exp)
+
+and comp_unit env = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds -> ProgU (snd (decs env ds))
+  | ActorU (as_opt, ds, fs, u, t)  ->
+    let u = { u with preupgrade = exp env u.preupgrade; postupgrade = exp env u.postupgrade } in
+    ActorU (as_opt, snd (decs env ds), fs, u, t)
+
+and prog (cu, flavor) =
+  let env = { tail_pos = false; info = None } in
+  (comp_unit env cu, flavor)
+
+(* validation *)
+
+let transform = prog
+
+
+
+ + + diff --git a/coverage/lang_utils/diag.ml.html b/coverage/lang_utils/diag.ml.html new file mode 100644 index 00000000000..3eb3888a694 --- /dev/null +++ b/coverage/lang_utils/diag.ml.html @@ -0,0 +1,338 @@ + + + + + diag.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+
+
open Mo_config
+
+type error_code = string
+type severity = Warning | Error | Info
+type message = {
+  sev : severity;
+  code : error_code;
+  at : Source.region;
+  cat : string;
+  text : string
+}
+type messages = message list
+
+let info_message at cat text = {sev = Info; code = ""; at; cat; text}
+let warning_message at code cat text = {sev = Warning; code; at; cat; text}
+let error_message at code cat text = {sev = Error; code; at; cat; text}
+
+type 'a result = ('a * messages, messages) Stdlib.result
+
+let return x = Ok (x, [])
+
+let info at cat text = Ok ((), [info_message at cat text])
+let warn at code cat text = Ok ((), [warning_message at code cat text])
+let error at code cat text = Stdlib.Error [error_message at code cat text]
+
+let map f = function
+  | Stdlib.Error msgs -> Stdlib.Error msgs
+  | Ok (x, msgs) -> Ok (f x, msgs)
+
+let bind x f = match x with
+  | Stdlib.Error msgs -> Stdlib.Error msgs
+  | Ok (y, msgs1) -> match f y with
+    | Ok (z, msgs2) -> Ok (z, msgs1 @ msgs2)
+    | Stdlib.Error msgs2 -> Error (msgs1 @ msgs2)
+
+let finally f r = f (); r
+
+module Syntax = struct
+  let (let*) = bind
+end
+
+let rec traverse : ('a -> 'b result) -> 'a list -> 'b list result = fun f -> function
+  | [] -> return []
+  | x :: xs -> bind (f x) (fun y -> map (fun ys -> y :: ys) (traverse f xs))
+
+let rec traverse_ : ('a -> unit result) -> 'a list -> unit result = fun f -> function
+  | [] -> return ()
+  | x :: xs -> bind (f x) (fun () -> traverse_ f xs)
+
+let rec fold : ('a -> 'b -> 'a result) -> 'a -> 'b list -> 'a result = fun f acc -> function
+  | [] -> return acc
+  | x :: xs -> bind (f acc x) (fun y -> fold f y xs)
+
+type msg_store = messages ref
+let add_msg s m = s := m :: !s
+let add_msgs s ms = s := List.rev ms @ !s
+let get_msgs s = List.rev !s
+
+let has_errors : messages -> bool =
+  List.fold_left (fun b msg -> b || msg.sev == Error) false
+
+let string_of_message msg =
+  let code = match msg.sev, msg.code with
+    | Info, _ -> ""
+    | _, "" -> ""
+    | _, code -> Printf.sprintf " [%s]" code in
+  let label = match msg.sev with
+    | Error -> Printf.sprintf "%s error" msg.cat
+    | Warning -> "warning"
+    | Info -> "info" in
+  Printf.sprintf "%s: %s%s, %s\n" (Source.string_of_region msg.at) label code msg.text
+
+let print_message msg =
+  if msg.sev <> Error && not !Flags.print_warnings
+  then ()
+  else Printf.eprintf "%s%!" (string_of_message msg)
+
+let print_messages = List.iter print_message
+
+let with_message_store f =
+  let s = ref [] in
+  let r = f s in
+  let msgs = get_msgs s in
+  match r with
+  | Some x when not (has_errors msgs) -> Ok (x, msgs)
+  | _ -> Error msgs
+
+let flush_messages : 'a result -> 'a option = function
+  | Stdlib.Error msgs ->
+    print_messages msgs;
+    None
+  | Ok (x, msgs) ->
+    print_messages msgs;
+    if !Flags.warnings_are_errors && msgs <> []
+    then None
+    else Some x
+
+let run r = match flush_messages r with
+  | None -> exit 1
+  | Some x -> x
+
+
+
+ + + diff --git a/coverage/lang_utils/dom.ml.html b/coverage/lang_utils/dom.ml.html new file mode 100644 index 00000000000..056d7f41f17 --- /dev/null +++ b/coverage/lang_utils/dom.ml.html @@ -0,0 +1,93 @@ + + + + + dom.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+
+
module type S =
+sig
+  include Set.S
+
+  exception Clash of elt
+
+  val disjoint_add : elt -> t -> t (* raises Clash *)
+  val disjoint_union : t -> t -> t (* raises Clash *)
+end
+
+module Make(X : Set.OrderedType) : S with type elt = X.t =
+struct
+  include Set.Make(X)
+
+  exception Clash of elt
+
+  let disjoint_add e set = if mem e set then raise (Clash e) else add e set
+  let disjoint_union set1 set2 = fold (fun e s -> disjoint_add e s) set2 set1
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/env.ml.html b/coverage/lang_utils/env.ml.html new file mode 100644 index 00000000000..389c1d41a17 --- /dev/null +++ b/coverage/lang_utils/env.ml.html @@ -0,0 +1,145 @@ + + + + + env.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+
+
module type S =
+sig
+  include Map.S
+
+  module Dom : Dom.S with type elt = key
+
+  exception Clash of key
+
+  val dom : 'a t -> Dom.t
+  val keys : 'a t -> key list
+  val from_list : (key * 'a) list -> 'a t
+  val from_list2 : key list -> 'a list -> 'a t
+  val adjoin : 'a t -> 'a t -> 'a t
+  val disjoint_add : key -> 'a -> 'a t -> 'a t (* raises Clash *)
+  val disjoint_union : 'a t -> 'a t -> 'a t (* raises Clash *)
+  val disjoint_unions : 'a t list -> 'a t (* raises Clash *)
+end
+
+module Make(X : Map.OrderedType) : S with type key = X.t =
+struct
+  include Map.Make(X)
+
+  module Dom = Dom.Make(X)
+
+  exception Clash of key
+
+  let dom env = List.fold_left (fun s (x, _) -> Dom.add x s) Dom.empty (bindings env)
+  let keys env = List.map fst (bindings env)
+  let from_list kxs = List.fold_left (fun env (k, x) -> add k x env) empty kxs
+  let from_list2 ks xs = List.fold_left2 (fun env k x -> add k x env) empty ks xs
+  let adjoin env1 env2 = union (fun _ x1 x2 -> Some x2) env1 env2
+  let disjoint_union env1 env2 = union (fun k _ _ -> raise (Clash k)) env1 env2
+  let disjoint_unions envs = List.fold_left disjoint_union empty envs
+  let disjoint_add k x env = disjoint_union env (singleton k x)
+
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/error_codes.ml.html b/coverage/lang_utils/error_codes.ml.html new file mode 100644 index 00000000000..e98e40d718e --- /dev/null +++ b/coverage/lang_utils/error_codes.ml.html @@ -0,0 +1,626 @@ + + + + + error_codes.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+
+
(* A list of all error codes used in the compiler. The second field in
+   each tuple represents a possible long-form description of the
+   error. *)
+let error_codes : (string * string option) list =
+  [
+    "M0000", None; (* Internal compiler error *)
+    "M0001", None; (* Parsing errors *)
+    "M0002", None; (* Lexer errors *)
+    "M0003", Some([%blob "lang_utils/error_codes/M0003.md"]); (* Self-import *)
+    "M0004", None; (* IDL file doesn't define a service *)
+    "M0005", None; (* Case mismatch between import and filename *)
+    "M0006", None; (* Failed to parse import URL *)
+    "M0007", None; (* Failed to parse actor alias *)
+    "M0008", None; (* Actor import without IDL path *)
+    "M0009", None; (* File not found for import *)
+    "M0010", None; (* Imported package was not defined *)
+    "M0011", None; (* Imported canister alias was not defined *)
+    "M0012", None; (* File for package does not exist *)
+    "M0013", None; (* Tried to map the prim package *)
+    "M0014", None; (* Non-static expression in library or module *)
+    "M0015", None; (* Non-trivial pattern in static expression *)
+    "M0016", None; (* Usage before definition *)
+    "M0017", None; (* Duplicate binding in pattern *)
+    "M0018", None; (* Duplicate name in type *)
+    "M0019", None; (* Colliding hashes in type *)
+    "M0020", None; (* Unresolved import *)
+    "M0021", None; (* Cannot infer type of forward import *)
+    "M0022", None; (* Imported file not loaded *)
+    "M0023", None; (* Path expression is not a module, object, or actor *)
+    "M0024", None; (* Cannot infer type of forward variable *)
+    "M0025", None; (* Unavailable variable *)
+    "M0026", None; (* Unbound variable *)
+    "M0027", None; (* Cannot infer type of forward field reference *)
+    "M0028", None; (* Field does not exist in type *)
+    "M0029", None; (* Unbound type *)
+    "M0030", None; (* Type field does not exist in type *)
+    "M0031", None; (* Shared function has non-shared parameter type *)
+    "M0032", None; (* Shared function has non-shared return type *)
+    "M0033", None; (* Async has non-shared content type *)
+    "M0034", None; (* Shared constructor has non-shared parameter type *)
+    "M0035", None; (* Invalid return type for shared function *)
+    "M0036", None; (* Invalid return type for shared query function *)
+    "M0037", None; (* Misplaced async expression *)
+    "M0038", None; (* Misplaced await *)
+    "M0039", None; (* Misplaced try/throw/catch *)
+    "M0040", None; (* Unknown primitive type *)
+    "M0041", None; (* Shared function has non-async result type *)
+    "M0042", None; (* Actor field must have shared function type *)
+    "M0043", None; (* Type parameter has cyclic bounds *)
+    "M0044", None; (* Duplicate name in type parameter list *)
+    "M0045", None; (* Wrong number of type arguments *)
+    "M0046", None; (* Type argument does not match parameter bound *)
+    "M0047", None; (* Send capability required *)
+    "M0048", None; (* Literal out of range *)
+    "M0049", None; (* String literal is not valid utf8 *)
+    "M0050", None; (* Literal does not have expected type *)
+    "M0051", None; (* Duplicate definition in block *)
+    (* "M0052" DEFUNCT Duplicate definition in object *)
+    "M0053", None; (* Cannot infer expression in class using forward type reference *)
+    "M0054", None; (* Cannot infer type of primitive *)
+    "M0055", None; (* Cannot infer type of forward variable *)
+    "M0056", None; (* Variable is not available in compiled code *)
+    "M0057", None; (* Unbound variable *)
+    "M0058", None; (* No type can be inferred for actor reference *)
+    "M0059", None; (* Operator is not defined for operand type *)
+    "M0060", None; (* Operator is not defined for operand types *)
+    "M0061", None; (* Comparing abstract type to itself at supertype *)
+    "M0062", None; (* Comparing incompatible type at common supertype *)
+    "M0063", None; (* Show is not defined for operand type *)
+    "M0064", None; (* Misplaced '!' without enclosing do block *)
+    "M0065", None; (* Expected option type before '!' *)
+    "M0066", None; (* Tuple projection is out of bounds *)
+    "M0067", None; (* Expected tuple type *)
+    "M0068", None; (* Actors are not supported *)
+    "M0069", None; (* Non-toplevel actor *)
+    "M0070", None; (* Expected object type *)
+    "M0071", None; (* Cannot infer type of forward field reference *)
+    "M0072", None; (* Field does not exist in type *)
+    "M0073", None; (* Expected mutable assignment target *)
+    "M0074", None; (* Array elements have inconsistent types *)
+    "M0075", None; (* Expected array type *)
+    "M0076", None; (* Shared functions are not supported *)
+    "M0077", None; (* Shared function is only allowed as a public field of an actor *)
+    "M0078", None; (* Shared function with () result type has unexpected body *)
+    "M0079", None; (* Shared function with async result type has non-async body *)
+    (* "M0080" DEFUNCT Local class type is contained in inferred block type *)
+    "M0081", None; (* If branches have inconsistent types *)
+    "M0082", None; (* Expected iterable type *)
+    "M0083", None; (* Unbound label *)
+    "M0084", None; (* Cannot infer return type *)
+    "M0085", None; (* Misplaced return *)
+    "M0086", None; (* Async expressions are not supported *)
+    "M0087", None; (* Ill-scoped await *)
+    "M0088", None; (* Expected async type *)
+    "M0089", None; (* Redundant ignore *)
+    "M0090", None; (* Actor reference must have an actor type *)
+    "M0091", None; (* Mutable array expression cannot produce expected type *)
+    "M0092", None; (* Async cannot produce scope *)
+    "M0093", None; (* Bases of record extensions must be objects or modules *)
+    "M0094", None; (* Shared functions does not match shared function type *)
+    "M0095", None; (* Function return type does not match expected return type *)
+    "M0096", None; (* Expression can't produce expected type *)
+    "M0097", None; (* Expected function type *)
+    "M0098", None; (* Cannot instantiate function type *)
+    "M0099", None; (* Shared function argument contains abstract type *)
+    "M0100", None; (* Shared function call result contains abstract type *)
+    "M0101", None; (* Switch with inconsistent branch types *)
+    "M0102", None; (* Cannot infer type of wildcard *)
+    "M0103", None; (* Cannot infer type of variable *)
+    (* "M0104" DEFUNCT Pattern branches have incompatible types *)
+    (* "M0105" DEFUNCT Variables are not allowed in pattern alternatives *)
+    "M0106", None; (* Shared function cannot take a context pattern *)
+    "M0107", None; (* Non-actor class cannot take a context pattern *)
+    "M0108", None; (* Actor class cannot take a context pattern *)
+    "M0109", None; (* Class cannot be a query *)
+    "M0110", None; (* Literal pattern cannot consume type *)
+    "M0111", None; (* Operator pattern cannot consume type *)
+    "M0112", None; (* Tuple pattern cannot consume type *)
+    "M0113", None; (* Object pattern cannot consume type *)
+    "M0114", None; (* Object pattern cannot consume actor type *)
+    "M0115", None; (* Option pattern cannot consume type *)
+    "M0116", None; (* Variant pattern cannot consume type *)
+    "M0117", None; (* Pattern cannot consume type *)
+    "M0118", None; (* Tuple pattern size mismatch *)
+    "M0119", None; (* Object field is not contained in type *)
+    "M0120", None; (* Cannot pattern match mutable field *)
+    "M0121", None; (* Duplicate field in object pattern *)
+    "M0122", None; (* Colliding hashes in object type *)
+    (* "M0123" DEFUNCT Local class type contained in object or actor type *)
+    "M0124", None; (* Public actor field has non-shared type *)
+    "M0125", None; (* Public actor field needs to be a manifest function *)
+    "M0126", None; (* Shared function cannot be private *)
+    "M0127", None; (* System function with wrong type *)
+    "M0128", None; (* Function with system function name but wrong visibility *)
+    "M0129", None; (* Unexpected system method name *)
+    "M0130", None; (* Misplaced system visibility *)
+    "M0131", None; (* Expected stable type *)
+    "M0132", None; (* Misplaced stability declaration *)
+    "M0133", None; (* Misplaced stability modifier *)
+    "M0134", None; (* Class body type mismatch *)
+    "M0135", None; (* Actor class has non-async return type *)
+    "M0136", None; (* Empty block type mismatch *)
+    "M0137", Some([%blob "lang_utils/error_codes/M0137.md"]); (* Type definition references type parameter from outer scope *)
+    "M0138", None; (* Actor classes are not supported *)
+    "M0139", None; (* Inner actor classes are not supported *)
+    "M0140", None; (* Actor classes with type parameters are not supported *)
+    "M0141", None; (* Forbidden declaration in program *)
+    "M0142", None; (* An imported library should be a module or named actor class *)
+    "M0143", None; (* Imported actor class cannot be anonymous *)
+    "M0144", None; (* Expected a module or actor class *)
+    "M0145", None; (* Pattern does not cover value *)
+    "M0146", None; (* Pattern is never matched *)
+    (* "M0147" DEFUNCT Object syntax is deprecated in this position *)
+    (* "M0148" DEFUNCT Block syntax is deprecated in this position *)
+    "M0149", Some([%blob "lang_utils/error_codes/M0149.md"]); (* Expected mutable 'var' field, found immutable field *)
+    "M0150", Some([%blob "lang_utils/error_codes/M0150.md"]); (* Expected immutable field, found mutable 'var' field *)
+    "M0151", Some([%blob "lang_utils/error_codes/M0151.md"]); (* missing field in object literal *)
+    (* "M0152" DEFUNCT Word field deprecation *)
+    "M0153", Some([%blob "lang_utils/error_codes/M0153.md"]); (* IDL types not expressible in Motoko *)
+    "M0154", Some([%blob "lang_utils/error_codes/M0154.md"]); (* Deprecation annotation *)
+    "M0155", Some([%blob "lang_utils/error_codes/M0155.md"]); (* Inferred type Nat for subtraction *)
+    "M0156", Some([%blob "lang_utils/error_codes/M0156.md"]); (* block contains expansive type definitions *)
+    "M0157", Some([%blob "lang_utils/error_codes/M0157.md"]); (* block contains non-productive type definitions *)
+    "M0158", Some([%blob "lang_utils/error_codes/M0158.md"]); (* a public class cannot be anonymous, please provide a name *)
+    (* "M0159" DEFUNCT Word deprecation *)
+    "M0160", None; (* Candid method name is not a valid Motoko identifier *)
+    "M0161", None; (* Candid float32 type cannot be imported as a Motoko type *)
+    "M0162", None; (* Candid service constructor type not supported as Motoko type *)
+    (* "M0163" DEFUNCT Cannot import a Candid service constructor *)
+    "M0164", None; (* Unknown record or variant label in textual representation *)
+    "M0165", None; (* Odd expected type *)
+    "M0166", None; (* Type intersection results in abstract type *)
+    "M0167", None; (* Type union results in bottom type *)
+    "M0168", None; (* Type union or intersection on forward types *)
+    "M0169", None; (* Stable variable cannot be discarded *)
+    "M0170", None; (* Stable variable must subtype *)
+    "M0171", None; (* Stable variable changing mutability *)
+    "M0172", None; (* to_candid produces Blob, not -- *)
+    "M0173", None; (* to_candid arg must have shared type, not -- *)
+    "M0174", None; (* from_candid produces an optional shared, not -- *)
+    "M0175", None; (* to_candid argument must have shared type, not -- *)
+    "M0176", None; (* from_candid requires known type from context *)
+    "M0177", None; (* Bases of record extensions must not have common fields that are not overwritten *)
+    "M0178", None; (* Bases of record extensions must be either objects or modules *)
+    "M0179", None; (* Mutable (var) fields from bases must be overwritten explicitly *)
+    "M0180", None; (* Shared function has unexpected type parameters *)
+    "M0181", None; (* Verification mode assertions not allowed *)
+    "M0182", None; (* Timer defined by user when -no-timer flag is specified *)
+    "M0183", None; (* Incompatible async sorts *)
+    "M0184", None; (* Cannot infer or-pattern, please use an annotation *)
+    "M0185", None; (* Importing Candid service constructor as instantiated service *)
+    "M0186", None; (* Send capability required (calling shared from composite) *)
+    "M0187", None; (* Send capability required (calling composite from non-composite) *)
+    "M0188", None; (* Send capability required (calling shared from query) *)
+    "M0189", None; (* Different set of bindings in pattern alternatives *)
+    "M0190", None; (* Types inconsistent for alternative pattern variables, losing information *)
+  ]
+
+
+
+ + + diff --git a/coverage/lang_utils/expGraph.ml.html b/coverage/lang_utils/expGraph.ml.html new file mode 100644 index 00000000000..722948a9328 --- /dev/null +++ b/coverage/lang_utils/expGraph.ml.html @@ -0,0 +1,710 @@ + + + + + expGraph.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+
+
module IM = Map.Make(Int)
+module IS = Set.Make(Int)
+
+(*
+Note [A running example]
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+How do we go from
+
+  type A = ?[A]
+  type B = [?B]
+  t = ([A], B, [B])
+
+to the canonical representation
+
+  t = (1=?[!1], !1, [!1])
+
+in this code? By these transformations:
+
+Step 1: `unfold` will turn this tree into the following graph (depth first,
+memoizing graph nodes based on structural equality on the tree)
+
+  0: ("tuple", [1,4,6])
+  1: ("vector",[2])
+  2: ("opt",   [3])
+  3: ("vector",[2])
+  4: ("vector",[5])
+  5: ("opt",   [4])
+  6: ("vector",[4])
+
+Note that this graph is not minimal.
+
+Step 2: `combine` will find the equivalence relations on the nodes of the graph.
+To find the coarsest we begin with
+
+   [0 1 2 3 4 5 6]
+
+and now iterate using `equiv_classes`. First distinguishing by constructor
+
+   [0] [1 3 4 6] [2 5]
+
+then by whether the argument list is different (with respect to the current equivalence relation!)
+
+   [0] [1 3 4] [6] [2 5]
+
+Now the iteration stops (could go further with deeper types). Renumbering based
+on this equivelence relation gives:
+
+  0: ("tuple", [1,1,2])
+  1: ("vector",[3])
+  2: ("vector",[1])
+  3: ("opt",   [1])
+
+Step 3: `renumber` to get canonical numbers (depth-first traversal)
+
+  0: ("tuple", [1,1,3])
+  1: ("vector",[2])
+  2: ("opt",   [1])
+  3: ("vector",[1])
+
+
+Step 4: `unfold`
+
+To unfold nicely, the nodes that are referenced more than once are 1, so only
+that gets a name. This way we end up with something like
+
+  t = (1=?[!1], !1, [!1])
+
+*)
+
+
+(* A graph of nodes, nodes labeled by ints, root at node 0 *)
+type 'a t = ('a * int list) IM.t
+
+(* Simple counter data structure *)
+let start_counting start : (unit -> int) =
+  let r = ref start in
+  fun () -> let i = !r in r := !r + 1; i
+
+let unfold (type e) node (root : e) : 'a t =
+  let module M = Map.Make (struct type t = e let compare = compare end) in
+
+  let seen = ref M.empty in
+  let next = start_counting 0 in
+  let graph = ref IM.empty in
+  let rec go e : int =
+    match M.find_opt e !seen with
+    | Some i -> i
+    | None ->
+      let i = next () in
+      seen := M.add e i !seen;
+      let (k, args) = node e in
+      let args' = List.map go args in
+      graph := IM.add i (k, args') !graph;
+      i
+  in
+  let i = go root in
+  assert (i == 0);
+  !graph
+
+
+(* Maps an index mapping over the graph. If not injective, will combine nodes *)
+let rename (lookup : int -> int) graph = graph
+    |> IM.to_seq
+    |> Seq.map (fun (i, (k, args)) -> (lookup i, (k, List.map lookup args)))
+    |> IM.of_seq
+
+(* Given a function on int (given as sequences of points),
+   calculates the equivalence classes it represents,
+   in the form of a mapping from int to int (plus size)
+
+   Example Input:   Example Output:
+     0 ↦ "Ho"         0 ↦ 0
+     1 ↦ "Hi"         1 ↦ 1
+     3 ↦ "Ho"         3 ↦ 0
+
+*)
+let equiv_classes (type b) (graph : (int * b) Seq.t) : (int IM.t * int) =
+  let module BM = Map.Make (struct type t = b let compare = compare end) in
+  let m = ref BM.empty in
+  let next = start_counting 0 in
+
+  let m =
+    IM.of_seq (Seq.map (fun (i,y) ->
+      match BM.find_opt y !m with
+      | Some j -> (i, j)
+      | None ->
+        let j = next () in
+        m := BM.add y j !m;
+        (i, j)
+    ) graph) in
+  let size = next () in
+  m, size
+
+
+(* Finds a minimal graph by finding the smallest index mapping that is consistent *)
+(* Equivalently: The coarsest equivalence classes on the nodes *)
+let combine graph =
+  let m : int IM.t ref = ref IM.empty in
+  let lookup i = IM.find i !m in
+  (* map all nodes to the same initially *)
+  IM.iter (fun i _ -> m := IM.add i 0 !m) graph;
+  let size = ref 1 in
+  let finished = ref false in
+
+  (* Fixed-point iteration *)
+  while not !finished do
+    (* Update the equivalence classes. By including the previous class,
+       this is a refinement *)
+    let m', size' = graph
+      |> IM.to_seq
+      |> Seq.map (fun (i, (k, args)) -> (i, (lookup i, k, List.map lookup args)))
+      |> equiv_classes in
+    assert (size' >= !size); (* New equivalence class better be finer *)
+    finished := size' = !size;
+    size := size';
+    m := m';
+  done;
+
+  assert (lookup 0 = 0);
+  rename lookup graph
+
+(* Changes the numbering to be canonical (depth first) *)
+let renumber graph =
+  let m = ref IM.empty in
+  let lookup i = IM.find i !m in
+  let next = start_counting 0 in
+
+  let rec go i = match IM.find_opt i !m with
+    | None -> (* not seen before *)
+      m := IM.add i (next ()) !m;
+      let (k, args) = IM.find i graph in
+      List.iter go args
+    | Some _ -> ()
+  in
+  go 0;
+
+  assert (lookup 0 = 0);
+  rename lookup graph
+
+(* Find a canonical graph *)
+let canonicalize graph = renumber (combine graph)
+
+(* Folds over the graph *)
+let fold
+  (of_con : 'a -> 'b list -> 'b)
+  (of_def : int -> 'b -> 'b)
+  (of_ref : int -> 'b)
+  (graph : 'a t) : 'b =
+
+  (* Find which entries are referenced more than once *)
+  let tally : int IM.t =
+    let tally = ref IM.empty in
+    let succ = function | None -> Some 1 | Some i -> Some (i + 1) in
+    let bump i = tally := IM.update i succ !tally in
+    bump 0;
+    IM.iter (fun _ (_, args) -> List.iter bump args) graph;
+    !tally
+  in
+
+  (* Nodes need an explicit definition if not nullary and referenced
+     more than once
+   *)
+  let needs_def : IS.t =
+    IS.of_seq (Seq.filter_map (fun (i, (k, args)) ->
+        if args != [] && IM.find i tally > 1 then Some i else None
+    ) (IM.to_seq graph))
+  in
+
+  (* Now fold the graph using the user-provided combinators *)
+  let seen = ref IS.empty in
+  let rec go_con i : 'b =
+    (* This node is only visited once *)
+    let (k, args) = IM.find i graph in
+    of_con k (List.map go args)
+  and go i : 'b =
+    (* This node is only visited once: *)
+    if IS.mem i needs_def then
+      (* We have seen this before: *)
+      if IS.mem i !seen then of_ref i
+      (* This is a shared node, first visit: *)
+      else (seen := IS.add i !seen; of_def i (go_con i))
+    else go_con i
+  in
+  go 0
+
+
+
+ + + diff --git a/coverage/lang_utils/lbool.ml.html b/coverage/lang_utils/lbool.ml.html new file mode 100644 index 00000000000..a7e16424352 --- /dev/null +++ b/coverage/lang_utils/lbool.ml.html @@ -0,0 +1,174 @@ + + + + + lbool.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+
+
(*
+See lbool.mli for an overview
+*)
+
+type callback = unit Lazy.t
+
+let do_nothing : callback = lazy ()
+
+let (>>) cb1 cb2 = lazy Lazy.(force cb1; force cb2)
+
+(* The lazy bool value type *)
+
+type t' =
+  | SurelyTrue
+  | SurelyFalse
+  | MaybeFalse of callback (* whom to notify when turning false *)
+type t = t' ref
+
+let set_false (l : t) =
+  match !l with
+  | SurelyTrue ->
+    raise (Invalid_argument "Lbool.set_false() on surely true variable")
+  | SurelyFalse -> ()
+  | MaybeFalse when_false ->
+    l := SurelyFalse; (* do this first, this breaks cycles *)
+    Lazy.force when_false
+
+let when_false (l : t) (act : callback) =
+  match !l with
+  | SurelyTrue -> ()
+  | SurelyFalse -> Lazy.force act
+  | MaybeFalse when_false ->
+    l := MaybeFalse (act >> when_false)
+
+let surely_true = ref SurelyTrue (* sharing is ok *)
+let surely_false = ref SurelyFalse (* sharing is ok *)
+let maybe_false () = ref (MaybeFalse do_nothing) (* no sharing, so unit argument *)
+
+let required_for (a : t) (b : t) =
+  when_false a (lazy (set_false b))
+
+let all (xs : t list) : t =
+  if xs = [] then surely_true else
+  let b = maybe_false () in
+  List.iter (fun a -> required_for a b) xs;
+  b
+
+
+
+ + + diff --git a/coverage/lang_utils/nameRel.ml.html b/coverage/lang_utils/nameRel.ml.html new file mode 100644 index 00000000000..2c9b7ed44e1 --- /dev/null +++ b/coverage/lang_utils/nameRel.ml.html @@ -0,0 +1,280 @@ + + + + + nameRel.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
+
(* A data structure for binary relations on names *)
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+type t = S.t M.t
+
+let empty : t = M.empty
+
+let cardinal : t -> int = fun m ->
+  M.fold (fun _ s c -> S.cardinal s + c) m 0
+
+let iter : (string -> string -> unit) -> t -> unit = fun f ->
+  M.iter (fun x -> S.iter (f x))
+
+let diag : string list -> t =
+  List.fold_left (fun rel x -> M.add x (S.singleton x) rel) empty
+
+let diag_set : S.t -> t = fun s ->
+  S.fold (fun x rel -> M.add x (S.singleton x) rel) s empty
+
+let cross : S.t -> S.t -> t = fun s1 s2 ->
+  S.fold (fun x rel -> M.add x s2 rel) s1 empty
+
+let lookup : string -> t -> S.t = fun k rel ->
+  match M.find_opt k rel with
+  | None -> S.empty
+  | Some s -> s
+
+(* dom R = { x | (x,y) ∈ R } *)
+let dom : t -> S.t = fun rel ->
+  M.fold (fun v s dom -> if S.is_empty s then dom else S.add v dom) rel S.empty
+
+(* range R = { y | (x,y) ∈ R } *)
+let range : t -> S.t = fun rel ->
+  M.fold (fun _ s ran -> S.union s ran) rel S.empty
+
+(* remove_range R S = { (x,y) | (x,y) ∈ R ∧ y ∉ S } *)
+let remove_range : S.t -> t -> t = fun s ->
+  M.map (fun s' -> S.diff s' s)
+
+(* union R1 R2 = R1 ∪ R2 = { (x,y) | (x,y) ∈ R1 ∨ (x,y) ∈ R2 } *)
+let union : t -> t -> t =
+  M.union (fun _ s1 s2 -> Some (S.union s1 s2))
+
+let unions : t list -> t =
+  List.fold_left union empty
+
+(* prod S1 S2 = S1 × S2 *)
+let prod : S.t -> S.t -> t = fun s1 s2 ->
+  S.fold (fun x rel -> M.add x s2 rel) s1 empty
+
+(* Just a utility function *)
+let set_bind f s =
+  S.fold (fun y -> S.union (f y)) s S.empty
+
+(* comp R1 R2 = R1 ∘ R2 = { (x,z) | (x,y) ∈ R1 ∧ (y,z) ∈ R2 } *)
+let comp : t -> t -> t = fun rel1 rel2 ->
+  M.map (set_bind (fun y -> lookup y rel2)) rel1
+
+(* We can use a relation R to represent its transitive closure R⁺,
+   and operations like dom, union, prod, comp work just fine.
+   Only removing needs special care:*)
+
+(* remove_range_trans S R = R' where remove_range S R⁺ = R'⁺ *)
+let remove_range_trans : S.t -> t -> t = fun s rel ->
+  M.map (set_bind (fun y -> if S.mem y s then S.diff (lookup y rel) s else S.singleton y)) rel
+
+(* restricted_rtcl S R = { (x,z) | x ∈ S ∧ (x,z) ∈ R^* } *)
+let restricted_rtcl : S.t -> t -> t = fun s rel ->
+  let rec go prev =
+    (* Add one iteration of R to the relation *)
+    let next = union prev (comp prev rel) in
+    (* Do we have a fixed point? *)
+    if cardinal prev = cardinal next
+    then prev
+    else go next
+  in go (diag_set s)
+
+
+
+
+
+ + + diff --git a/coverage/lang_utils/scc.ml.html b/coverage/lang_utils/scc.ml.html new file mode 100644 index 00000000000..401c611a40a --- /dev/null +++ b/coverage/lang_utils/scc.ml.html @@ -0,0 +1,311 @@ + + + + + scc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
+
(*
+  A naive implementation of Tarjan's algorithm.
+
+  Computes the strongly connected components of a directed graph, returning
+  the list of components in topological order.
+
+  Adapted from:
+  https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+*)
+
+module Make(Vertex : Set.OrderedType) :
+  sig
+    module VertexSet :
+      Set.S with type elt = Vertex.t with type t = Set.Make(Vertex).t
+    module Edge : Set.OrderedType with type t = Vertex.t * Vertex.t
+    module EdgeSet : Set.S with type elt = Edge.t
+    val scc : VertexSet.t -> EdgeSet.t -> VertexSet.t list
+  end
+ = struct
+
+  module Edge = struct
+    type t = Vertex.t * Vertex.t
+    (* the lexicographic ordering on pairs *)
+    let compare (v1, w1) (v2, w2) =
+     match Vertex.compare v1 v2 with
+     | 0 -> Vertex.compare w1 w2
+     | o -> o
+  end
+
+  module VertexSet = Set.Make(Vertex)
+  module EdgeSet = Set.Make(Edge)
+
+  module VertexMap = Map.Make(Vertex)
+
+  type state = {
+    mutable index : int;
+    mutable lowlink : int;
+    mutable onstack : bool
+  }
+
+  let scc vs es =
+  let sccs = ref [] in
+  let undefined = -1 in
+  let index = ref 0 in
+  let states = VertexSet.fold (fun v m ->
+    VertexMap.add v {index = undefined; lowlink = 0; onstack = false} m)
+    vs VertexMap.empty
+  in
+  let stack = ref [] in
+  let successors = EdgeSet.fold (fun (v, w) m ->
+    VertexMap.add v (VertexSet.add w (VertexMap.find v m)) m)
+      es
+      (VertexSet.fold (fun v m -> VertexMap.add v VertexSet.empty m) vs VertexMap.empty)
+  in
+  let rec strongconnect v =
+    let sv = VertexMap.find v states in
+    sv.index <- !index;
+    sv.lowlink <- !index;
+    index := !index +1 ;
+    stack := v::!stack;
+    sv.onstack <- true;
+
+    let ws = VertexMap.find v successors in
+    ws |> VertexSet.iter (fun w ->
+      let sw = VertexMap.find w states in
+      if sw.index = undefined then begin
+        strongconnect(w);
+        sv.lowlink <- min sv.lowlink sw.lowlink;
+      end
+      else
+        if sw.onstack then
+          sv.lowlink <- min sv.lowlink sw.index);
+    if sv.lowlink = sv.index then
+      let rec pop scc =
+        let w = List.hd !stack in
+        stack := List.tl !stack;
+        let sw = VertexMap.find w states in
+        sw.onstack <- false;
+        let scc' = VertexSet.add w scc in
+        if Vertex.compare w v <> 0
+        then pop scc'
+        else sccs := scc' :: !sccs
+      in
+      pop VertexSet.empty
+  in
+  vs |> VertexSet.iter (fun v ->
+    let sv = VertexMap.find v states in
+    if sv.index = undefined then
+      strongconnect v);
+  List.rev !sccs
+
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/source.ml.html b/coverage/lang_utils/source.ml.html new file mode 100644 index 00000000000..f374a84e5d1 --- /dev/null +++ b/coverage/lang_utils/source.ml.html @@ -0,0 +1,126 @@ + + + + + source.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+
type pos = {file : string; line : int; column : int}
+type region = {left : pos; right : pos}
+type ('a, 'b) annotated_phrase = {at : region; it : 'a; mutable note: 'b}
+type 'a phrase = ('a, unit) annotated_phrase
+
+let (@@) it at = {it; at; note = ()}
+
+(* Positions and regions *)
+
+let no_pos = {file = ""; line = 0; column = 0}
+let no_region = {left = no_pos; right = no_pos}
+
+let span r1 r2 = {left = r1.left; right = r2.right}
+let between r1 r2 = {left = r1.right; right = r2.left}
+
+let string_of_pos pos =
+  if pos.line = -1 then
+    Printf.sprintf "0x%x" pos.column
+  else
+    string_of_int pos.line ^ "." ^ string_of_int (pos.column + 1)
+
+let string_of_region r =
+  if r.left.file = "" then "(unknown location)" else
+  r.left.file ^ ":" ^ string_of_pos r.left ^
+  (if r.right = r.left then "" else "-" ^ string_of_pos r.right)
+
+(* generic parse error *)
+
+exception ParseError of region * string
+
+
+
+
+ + + diff --git a/coverage/lib/lib.ml.html b/coverage/lib/lib.ml.html new file mode 100644 index 00000000000..d52cf753032 --- /dev/null +++ b/coverage/lib/lib.ml.html @@ -0,0 +1,2768 @@ + + + + + lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+
+
module Format =
+struct
+  let with_str_formatter f x =
+    let b = Buffer.create 16 in
+    let ppf = Format.formatter_of_buffer b in
+    Format.pp_set_geometry ppf ~max_indent:2 ~margin:(1000000010-1); (* hack to output all on one line *)
+    Format.fprintf ppf "@[%a@]" f x;
+    Format.pp_print_flush ppf ();
+    Buffer.contents b
+
+  let display pp ppf x =
+    Format.fprintf ppf "@\n@[<v 2>  %a@]" pp x
+end
+
+module Fun =
+struct
+  let curry f x y = f (x, y)
+  let uncurry f (x, y) = f x y
+
+  let rec repeat n f x =
+    if n = 0 then () else (f x; repeat (n - 1) f x)
+end
+
+module Int =
+struct
+  let log2 n =
+    if n <= 0 then failwith "log2";
+    let rec loop acc n = if n = 1 then acc else loop (acc + 1) (n lsr 1) in
+    loop 0 n
+
+  let is_power_of_two n =
+    if n < 0 then failwith "is_power_of_two";
+    n <> 0 && n land (n - 1) = 0
+end
+
+module Uint32 =
+struct
+  type t = int32
+  let of_string str = Int32.of_string ("0u" ^ str)
+  let of_string_opt str = Int32.of_string_opt ("0u" ^ str)
+  let to_string n = Printf.sprintf "%lu" n
+  let add = Int32.add
+  let sub = Int32.sub
+  let mul = Int32.mul
+  let succ = Int32.succ
+  let zero = Int32.zero
+  let one = Int32.one
+  let of_int = Int32.of_int
+  let to_int = Int32.to_int
+  let logand = Int32.logand
+  let logor = Int32.logor
+  let shift_right_logical = Int32.shift_right_logical
+  let of_int32 x = x
+  let to_int32 x = x
+  let compare i1 i2 =
+    if i1 < 0l && i2 >= 0l then 1
+    else if i1 >= 0l && i2 < 0l then -1
+    else Int32.compare i1 i2
+end
+
+module CRC =
+struct
+  let crc8 (bs : string) : int =
+    let inner _ = function
+      | crc when crc land 0x80 <> 0 -> (crc lsl 1) lxor 0x7
+      | crc -> crc lsl 1 in
+    let outer crc b =
+      List.fold_right inner [0;1;2;3;4;5;6;7] (Char.code b lxor crc) land 0xFF in
+    Seq.fold_left outer 0 (String.to_seq bs)
+
+  let crc32 (bs : string) : int32 =
+    Optint.(to_int32 (Checkseum.Crc32.digest_string bs 0 (String.length bs) zero))
+end
+
+module Hex =
+struct
+  let hexdigit = let open Char in function
+    | c when c >= '0' && c <= '9' -> code c - code '0'
+    | c when c >= 'A' && c <= 'F' -> code c - code 'A' + 10
+    | c when c >= 'a' && c <= 'f' -> code c - code 'a' + 10
+    | _ -> assert false
+
+  let bytes_of_hex hex : string =
+    let open String in
+    let extract i _ =
+      Char.chr (hexdigit (get hex (i * 2)) lsl 4 lor hexdigit (get hex (i * 2 + 1))) in
+    Bytes.to_string (Bytes.mapi extract (Bytes.create (length hex / 2)))
+
+  let int_of_hex_byte hex : int =
+    assert (String.length hex = 2);
+    String.(hexdigit (get hex 0) lsl 4 lor hexdigit (get hex 1))
+
+  let hex_of_nibble =
+    let open Char in
+    function
+    | c when 0 <= c && c <= 9 -> chr (code '0' + c)
+    | c when 10 <= c && c <= 15 -> chr (code 'A' + (c - 10))
+    | _ -> assert false
+
+  let hex_of_byte i : string =
+    String.init 2 (function
+      | 0 -> hex_of_nibble (i / 16)
+      | 1 -> hex_of_nibble (i mod 16)
+      | _ -> assert false)
+
+  let hex_of_char c = hex_of_byte (Char.code c)
+
+  let hex_of_bytes bytes : string =
+    let open Stdlib.String in
+    of_seq (Stdlib.Seq.flat_map (fun c -> to_seq (hex_of_char c)) (to_seq bytes))
+end
+
+module Base32 =
+struct
+  let decode input =
+    let len = String.length input in
+    let buf = Buffer.create (len / 2) in
+    let rec evac = function
+      | v, b when b >= 8 ->
+        let b' = b - 8 in
+        Buffer.add_uint8 buf (v lsr b');
+        evac (v land (1 lsl b' - 1), b')
+      | vb -> vb in
+    let b32 a = function
+      | v when v >= 'A' && v <= 'Z' -> a lsl 5 lor (Char.code v - 65)
+      | v when v >= '2' && v <= '7' -> a lsl 5 lor (Char.code v - 24)
+      | '=' -> a
+      | _ -> raise (Invalid_argument "Char out of base32 alphabet") in
+      let pump (v, b) c = evac (b32 v c, b + 5) in
+    try
+      ignore (Seq.fold_left pump (0, 0) (String.to_seq input));
+      Ok (Buffer.contents buf)
+    with Invalid_argument s -> Error s
+
+  let encode input =
+    let len = String.length input in
+    let buf = Buffer.create (len * 2) in
+    let b32 = function
+      | v when v <= 25 -> 65 + v
+      | v -> 24 + v in
+    let rec evac = function
+      | v, b when b >= 5 ->
+        let b' = b - 5 in
+        Buffer.add_uint8 buf (b32 (v lsr b'));
+        evac (v land (1 lsl b' - 1), b')
+      | vb -> vb
+    in
+    let pump (v, b) c = evac (v lsl 8 lor (Char.code c land 0xFF), b + 8) in
+    let v, b = Seq.fold_left pump (0, 0) (String.to_seq input) in
+    if b > 0 then ignore (evac (v lsl 4, b + 4));
+    Buffer.contents buf
+end
+
+module String =
+struct
+
+  let implode cs =
+    let buf = Buffer.create 80 in
+    List.iter (Buffer.add_char buf) cs;
+    Buffer.contents buf
+
+  let implode_map f cs =
+    let buf = Buffer.create 80 in
+    List.iter (fun c -> Buffer.add_char buf (f c)) cs;
+    Buffer.contents buf
+
+  let explode s =
+    let cs = ref [] in
+    for i = String.length s - 1 downto 0 do cs := s.[i] :: !cs done;
+    !cs
+
+  let explode_map f s =
+    let cs = ref [] in
+    for i = String.length s - 1 downto 0 do cs := f s.[i] :: !cs done;
+    !cs
+
+  (** Stack.fold (fun x y -> y ^ c ^ x) "" (String.split s c) == s *)
+  let split s c =
+    let len = String.length s in
+    let rec loop i =
+      if i > len then [] else
+      let j = try String.index_from s i c with Not_found -> len in
+      String.sub s i (j - i) :: loop (j + 1)
+    in loop 0
+
+  let breakup s n =
+    let rec loop i =
+      let len = min n (String.length s - i) in
+      if len = 0 then [] else String.sub s i len :: loop (i + len)
+    in loop 0
+
+  let rec find_from_opt f s i =
+    if i = String.length s then
+      None
+    else if f s.[i] then
+      Some i
+    else
+      find_from_opt f s (i + 1)
+
+  let chop_prefix prefix s =
+    let prefix_len = String.length prefix in
+    let s_len = String.length s in
+    if s_len < prefix_len then
+      None
+    else if String.sub s 0 prefix_len = prefix then
+      Some (String.sub s prefix_len (s_len - prefix_len))
+    else
+      None
+
+  let starts_with prefix s = (* in OCaml 4.13 *)
+    match chop_prefix prefix s with
+    | Some _ -> true
+    | _ -> false
+
+  let chop_suffix suffix s =
+    let suffix_len = String.length suffix in
+    let s_len = String.length s in
+    if s_len < suffix_len then
+      None
+    else if String.sub s (s_len - suffix_len) suffix_len = suffix then
+      Some (String.sub s 0 (s_len - suffix_len))
+    else
+      None
+
+  let lightweight_escaped s =
+    let buf = Buffer.create (String.length s) in
+    for i = 0 to String.length s - 1 do
+      match s.[i] with
+      | '\"' | '\'' | '\\' as c ->
+        Buffer.add_char buf '\\'; Buffer.add_char buf c
+      | '\n' -> Buffer.add_string buf "\\n"
+      | '\r' -> Buffer.add_string buf "\\r"
+      | '\t' -> Buffer.add_string buf "\\t"
+      | c -> Buffer.add_char buf c
+    done;
+    Buffer.contents buf
+end
+
+module Utf8 =
+struct
+  type t = int list
+  exception Utf8 = Wasm.Utf8.Utf8
+
+  let rec is_valid s = is_valid' (String.explode_map Char.code s)
+  and is_valid' = function
+    | [] -> true
+    | b1::bs when b1 < 0x80 ->
+      is_valid' bs
+    | b1::bs when b1 < 0xc0 -> false
+    | b1::b2::bs when b1 < 0xe0 ->
+      (b2 land 0xc0 = 0x80) && is_valid' bs
+    | b1::b2::b3::bs when b1 < 0xf0 ->
+      (b2 land 0xc0 = 0x80) && (b3 land 0xc0 = 0x80) && is_valid' bs
+    | b1::b2::b3::b4::bs when b1 < 0xf8 ->
+      (b2 land 0xc0 = 0x80) && (b3 land 0xc0 = 0x80) && (b4 land 0xc0 = 0x80) && is_valid' bs
+    | _ -> false
+
+  let con b = if b land 0xc0 = 0x80 then b land 0x3f else raise Utf8
+  let code min n =
+    if n < min || (0xd800 <= n && n < 0xe000) || n >= 0x110000 then raise Utf8
+    else n
+
+  let rec decode s = decode' [] (String.explode_map Char.code s)
+  and decode' acc = function
+    | [] -> List.rev acc
+    | b1::bs when b1 < 0x80 ->
+      decode' (code 0x0 b1 :: acc) bs
+    | b1::bs when b1 < 0xc0 -> raise Utf8
+    | b1::b2::bs when b1 < 0xe0 ->
+      decode' (code 0x80 ((b1 land 0x1f) lsl 6 + con b2) :: acc) bs
+    | b1::b2::b3::bs when b1 < 0xf0 ->
+      decode' (code 0x800 ((b1 land 0x0f) lsl 12 + con b2 lsl 6 + con b3) :: acc) bs
+    | b1::b2::b3::b4::bs when b1 < 0xf8 ->
+      decode' (code 0x10000 ((b1 land 0x07) lsl 18 + con b2 lsl 12 + con b3 lsl 6 + con b4) :: acc) bs
+    | _ -> raise Utf8
+
+  let con n = 0x80 lor (n land 0x3f)
+
+  let rec encode ns = String.implode_map Char.chr (encode' [] ns)
+  and encode' acc = function
+    | [] -> List.rev acc
+    | n::ns when n < 0 -> raise Utf8
+    | n::ns when n < 0x80 ->
+      encode' (n :: acc) ns
+    | n::ns when n < 0x800 ->
+      encode' (con n :: 0xc0 lor (n lsr 6) :: acc) ns
+    | n::ns when n < 0x10000 ->
+      encode' (con n :: con (n lsr 6) :: 0xe0 lor (n lsr 12) :: acc) ns
+    | n::ns when n < 0x110000 ->
+      encode' (con n :: con (n lsr 6) :: con (n lsr 12) :: 0xf0 lor (n lsr 18) :: acc) ns
+    | _ -> raise Utf8
+end
+
+module List =
+struct
+  let equal p xs ys =
+    try List.for_all2 p xs ys with _ -> false
+
+  let rec make n x = make' n x []
+  and make' n x xs =
+    if n = 0 then xs else make' (n - 1) x (x::xs)
+
+  let rec table n f = table' n f []
+  and table' n f xs =
+    if n = 0 then xs else table' (n - 1) f (f (n - 1) :: xs)
+
+  let group f l =
+    let rec grouping acc = function
+      | [] -> acc
+      | hd::tl ->
+         let l1,l2 = List.partition (f hd) tl in
+         grouping ((hd::l1)::acc) l2
+    in grouping [] l
+
+  let rec take n xs =
+    match n, xs with
+    | _ when n <= 0 -> []
+    | n, x::xs' when n > 0 -> x :: take (n - 1) xs'
+    | _ -> failwith "take"
+
+  let rec drop n xs =
+    match n, xs with
+    | 0, _ -> xs
+    | n, _::xs' when n > 0 -> drop (n - 1) xs'
+    | _ -> failwith "drop"
+
+  let split_at n xs =
+    if n <= List.length xs
+    then (take n xs, drop n xs)
+    else (xs, [])
+
+  let hd_opt = function
+    | x :: _ -> Some x
+    | _ -> None
+
+  let rec last = function
+    | [x] -> x
+    | _::xs -> last xs
+    | [] -> failwith "last"
+
+  let last_opt = function
+    | [] -> None
+    | xs -> Some (last xs)
+
+  let rec split_last = function
+    | [x] -> [], x
+    | x::xs -> let ys, y = split_last xs in x::ys, y
+    | [] -> failwith "split_last"
+
+  let rec index_where p xs = index_where' p xs 0
+  and index_where' p xs i =
+    match xs with
+    | [] -> None
+    | x::xs' when p x -> Some i
+    | x::xs' -> index_where' p xs' (i+1)
+
+  let index_of x = index_where ((=) x)
+
+  let rec compare f xs ys =
+    match xs, ys with
+    | [], [] -> 0
+    | [], _ -> -1
+    | _, [] -> +1
+    | x::xs', y::ys' ->
+      match f x y with
+      | 0 -> compare f xs' ys'
+      | n -> n
+
+  let rec is_ordered f xs =
+    match xs with
+    | [] | [_] -> true
+    | x1::x2::xs' ->
+      match f x1 x2 with
+      | -1 | 0 -> is_ordered f (x2::xs')
+      | _ -> false
+
+  let rec is_strictly_ordered f xs =
+    match xs with
+    | [] | [_] -> true
+    | x1::x2::xs' ->
+      match f x1 x2 with
+      | -1 -> is_strictly_ordered f (x2::xs')
+      | _ -> false
+
+  let rec iter_pairs f = function
+    | [] -> ()
+    | x::ys -> List.iter (fun y -> f x y) ys; iter_pairs f ys
+
+  let rec is_prefix equal prefix list =
+    match prefix with
+    | [] -> true
+    | hd :: tl ->
+      (match list with
+       | [] -> false
+       | hd' :: tl' -> equal hd hd' && is_prefix equal tl tl')
+end
+
+module List32 =
+struct
+  let rec make n x = make' n x []
+  and make' n x xs =
+    if n = 0l then xs else make' (Int32.sub n 1l) x (x::xs)
+
+  let rec length xs = length' xs 0l
+  and length' xs n =
+    match xs with
+    | [] -> n
+    | _::xs' when n < Int32.max_int -> length' xs' (Int32.add n 1l)
+    | _ -> failwith "length"
+
+  let rec nth xs n =
+    match n, xs with
+    | 0l, x::_ -> x
+    | n, _::xs' when n > 0l -> nth xs' (Int32.sub n 1l)
+    | _ -> failwith "nth"
+
+  let rec take n xs =
+    match n, xs with
+    | 0l, _ -> []
+    | n, x::xs' when n > 0l -> x :: take (Int32.sub n 1l) xs'
+    | _ -> failwith "take"
+
+  let rec drop n xs =
+    match n, xs with
+    | 0l, _ -> xs
+    | n, _::xs' when n > 0l -> drop (Int32.sub n 1l) xs'
+    | _ -> failwith "drop"
+end
+
+module Array =
+struct
+  include Array
+
+  let rec compare f x y = compare' f x y 0
+  and compare' f x y i =
+    match i = Array.length x, i = Array.length y with
+    | true, true -> 0
+    | true, false -> -1
+    | false, true -> +1
+    | false, false ->
+      match f x.(i) y.(i) with
+      | 0 -> compare' f x y (i + 1)
+      | n -> n
+
+  let for_all2 p xs ys =
+    if Array.length xs <> Array.length ys then failwith "for_all2"
+    else
+      let rec go i =
+        i = Array.length xs || (p xs.(i) ys.(i) && go (i + 1))
+      in
+      go 0
+end
+
+module Array32 =
+struct
+  let make n x =
+    if n < 0l || Int64.of_int32 n > Int64.of_int max_int then
+      raise (Invalid_argument "Array32.make");
+    Array.make (Int32.to_int n) x
+
+  let length a = Int32.of_int (Array.length a)
+
+  let index_of_int32 i =
+    if i < 0l || Int64.of_int32 i > Int64.of_int max_int then -1 else
+    Int32.to_int i
+
+  let get a i = Array.get a (index_of_int32 i)
+  let set a i x = Array.set a (index_of_int32 i) x
+  let blit a1 i1 a2 i2 n =
+    Array.blit a1 (index_of_int32 i1) a2 (index_of_int32 i2) (index_of_int32 n)
+end
+
+module Bigarray =
+struct
+  open Bigarray
+
+  module Array1_64 =
+  struct
+    let create kind layout n =
+      if n < 0L || n > Int64.of_int max_int then
+        raise (Invalid_argument "Bigarray.Array1_64.create");
+      Array1.create kind layout (Int64.to_int n)
+
+    let dim a = Int64.of_int (Array1.dim a)
+
+    let index_of_int64 i =
+      if i < 0L || i > Int64.of_int max_int then -1 else
+      Int64.to_int i
+
+    let get a i = Array1.get a (index_of_int64 i)
+    let set a i x = Array1.set a (index_of_int64 i) x
+    let sub a i n = Array1.sub a (index_of_int64 i) (index_of_int64 n)
+  end
+end
+
+module Seq =
+struct
+  let rec for_all p s = match s () with
+    | Seq.Nil -> true
+    | Seq.Cons (x, s') -> p x && for_all p s'
+end
+
+module Option =
+struct
+  let get o x =
+    match o with
+    | Some y -> y
+    | None -> x
+
+  let map2 (f : 'a -> 'b -> 'c) (a : 'a option) (b : 'b option) =
+    match a, b with
+    | Some a, Some b -> Some (f a b)
+    | _ -> None
+
+  module Syntax =
+  struct
+    let (let+) x f = Option.map f x
+    let (and+) x y = match x, y with
+      | Some x, Some y -> Some (x, y)
+      | _  -> None
+    let (let*) = Option.bind
+  end
+end
+
+module Promise =
+struct
+  type 'a t = 'a option ref
+
+  exception Promise
+
+  let make () = ref None
+  let make_fulfilled x = ref (Some x)
+  let fulfill p x = if !p = None then p := Some x else raise Promise
+  let is_fulfilled p = !p <> None
+  let value_opt p = !p
+  let value p = match !p with Some x -> x | None -> raise Promise
+  let lazy_value p f =
+    begin
+      if not (is_fulfilled p) then
+      let x = f () in
+      (* Evaluating f might have actually fulfilled this. We assume f to be pure
+         (or at least be idempotent), and do not try to update it again.
+      *)
+      if not (is_fulfilled p) then fulfill p x
+    end;
+    value p
+end
+
+module AllocOnUse =
+struct
+  (*
+  A slighty more elaborate form of a promise: It describes something that can
+  be allocated, defined, and used (e.g. a Wasm function with a function id). It
+  will only be allocated if it is both defined and used. Cyclic use is supported,
+  e.g. the code that defines the thing will already be able to use it.
+
+  Beware: Calling def twice is allowed, the second one will be ignored.
+
+  Re `… Lazy.t` vs. `unit -> …`:
+  We use `… Lazy.t` for thunks that will be called exactly once (e.g. producing the
+  definition), but `unit -> …` for functions called many times with different
+  results (e.g. allocation)
+  *)
+
+  type ('a, 'b) alloc = unit -> ('a * ('b -> unit))
+
+  type ('a, 'b) t' =
+    | UnUsedUnDef of ('a, 'b) alloc
+    | UsedUnDef of 'a * ('b -> unit)
+    | UnUsedDef of ('a, 'b) alloc * ('b Lazy.t)
+    | UsedDef of 'a
+  type ('a, 'b) t = ('a, 'b) t' ref
+
+  let make : ('a, 'b) alloc -> ('a, 'b) t =
+    fun alloc -> ref (UnUsedUnDef alloc)
+
+  let def : ('a, 'b) t -> ('b Lazy.t) -> unit =
+    fun r mk -> match !r with
+      | UnUsedUnDef alloc ->
+        r := UnUsedDef (alloc, mk)
+      | UsedUnDef (a, fill) ->
+        r := UsedDef a;
+        fill (Lazy.force mk);
+      | UnUsedDef _ | UsedDef _ ->
+        ()
+
+  let use : ('a, 'b) t -> 'a =
+    fun r -> match !r with
+      | UnUsedUnDef alloc ->
+        let (a, fill) = alloc () in
+        r := UsedUnDef (a, fill);
+        a
+      | UsedUnDef (a, fill) ->
+        a
+      | UnUsedDef (alloc, mk) ->
+        let (a, fill) = alloc () in
+        r := UsedDef a;
+        fill (Lazy.force mk);
+        a
+      | UsedDef a ->
+        a
+end
+
+module FilePath =
+struct
+  let segments p = String.split p '/'
+
+  let normalise file_path =
+    if file_path = "" then "" else
+    let has_trailing_slash =
+      Stdlib.Option.is_some (String.chop_suffix "/" file_path) in
+    let has_leading_slash = not (Filename.is_relative file_path) in
+    let acc = Stack.create () in
+    segments file_path |> Stdlib.List.iter
+     (function
+      | "" -> ()
+      | "." -> ()
+      | ".." ->
+         if Stack.is_empty acc || Stack.top acc = ".."
+         then Stack.push ".." acc
+         else ignore (Stack.pop acc)
+      | segment -> Stack.push segment acc);
+    let result = Stack.fold (fun x y -> y ^ "/" ^ x) "" acc in
+    if result = ""
+    then
+      (if has_leading_slash then "/" else
+      (if has_trailing_slash then "./" else "."))
+    else
+      (if has_leading_slash then "/" else "") ^
+      (if has_trailing_slash then result
+      else Stdlib.Option.get (String.chop_suffix "/" result))
+
+  let relative_to base path =
+    String.chop_prefix
+      (normalise (base ^ "/"))
+      (normalise path)
+  let make_absolute base path =
+    if not (Filename.is_relative path)
+    then path
+    else normalise (Filename.concat base path)
+
+  let is_subpath base path =
+    if Filename.is_relative base || Filename.is_relative path
+    then assert false
+    (* We can't just check for prefixing on the string because
+       /path/tosomething is not a subpath of /path/to*)
+    else List.is_prefix (=) (segments base) (segments path)
+
+  (* TODO: this function does not belong here *)
+  (* When opening is successful, but there is a case mismatch (because the file
+     system is case insensitive), generate a warning. *)
+  let open_in path : in_channel * string list =
+    let ic = Stdlib.open_in path in
+    let dir, base = Filename.(dirname path, basename path) in
+    (* TODO: we could check dir too, but it's hairier *)
+    let files = Sys.readdir dir in
+    if not (Array.exists (fun name -> name = base) files) then
+      begin
+        let open Stdlib.String in
+        let lbase = lowercase_ascii base in
+        if Array.exists (fun name -> lowercase_ascii name = lbase) files then
+          let message = Printf.sprintf "file %s has been located with a name of different case" base in
+          ic, [message]
+        else
+          let message = Printf.sprintf "file %s has been located with a different name" base in
+          ic, [message]
+      end
+    else ic, []
+end
+
+
+[@@@warning "-60-32"]
+module Test =
+struct
+(* need to put tests in this file because
+   dune does not like it if other files in lib depend on Lib
+   Maybe we should break up lib into its components, now that
+   it is a dune library.
+*)
+  let%test "bytes_of_hex DEADBEEF" =
+    Hex.bytes_of_hex "DEADBEEF" = "\xDE\xAD\xBE\xEF"
+  let%test "bytes_of_hex 0000" =
+    Hex.bytes_of_hex "0000" = "\x00\x00"
+  let%test "bytes_of_hex empty" =
+    Hex.bytes_of_hex "" = ""
+
+  let%test "int_of_hex_byte 00" = Hex.int_of_hex_byte "00" = 0
+  let%test "int_of_hex_byte AB" = Hex.int_of_hex_byte "AB" = 0xAB
+  let%test "int_of_hex_byte FF" = Hex.int_of_hex_byte "FF" = 0xFF
+
+  (* see https://crccalc.com/ *)
+  let %test "crc8 DEADBEEF" = CRC.crc8 "\xDE\xAD\xBE\xEF" = 0xCA
+  let %test "crc8 empty" = CRC.crc8 "" = 0x00
+  let %test "crc8 0000" = CRC.crc8 "\x00\x00" = 0x00
+
+  let%test "Base32.decode empty" = Base32.decode "" = Ok ""
+  let%test "Base32.decode 0000000000" = Base32.decode "AAAAAAA" = Ok "\x00\x00\x00\x00"
+  let%test "Base32.decode 000000000000" = Base32.decode "AAAAAAAA" = Ok "\x00\x00\x00\x00\x00"
+  let%test "Base32.decode DEADBEEF" = Base32.decode "32W353Y" = Ok "\xDE\xAD\xBE\xEF"
+
+  let%test "Utf8.decode prim emoji" = Wasm.Utf8.encode (Utf8.decode "mo:⛔") = "mo:⛔"
+  let%test "Utf8.encode prim emoji" = Utf8.encode (Wasm.Utf8.decode "mo:⛔") = "mo:⛔"
+
+  let%test "Utf8.encode decode large" =
+    (* this test overflows if we use Wasm.Utf8 functions instead *)
+    let b = Buffer.create 16 in
+    for i = 0 to 65535*16 do
+      Buffer.add_char b (Char.chr (i land 0x7F))
+    done;
+    let s = Buffer.contents b in
+    Utf8.is_valid s &&
+    Utf8.encode (Utf8.decode s) = s
+
+  let%test "Utf8.is_valid agrees with Utf8.decode for single-byte strings" =
+    let rec loop f i =
+      if i > 0xFF then true
+      else if not (f i) then false
+      else loop f (i + 1)
+    in loop (fun i ->
+      let s = Utf8.encode [i] in
+      Utf8.is_valid s = (try (ignore (Utf8.decode s); true) with Utf8.Utf8 -> false)
+    ) 0
+
+  let%test "String.split \"\"" = String.split "" '/' = [""]
+  let%test "String.split \"/\"" = String.split "/" '/' = ["";""]
+  let%test "String.split \"//\"" = String.split "//" '/' = ["";"";""]
+  let%test "String.split \"a/b/c\"" = String.split "a/b/c" '/' = ["a";"b";"c"]
+  let%test "String.split \"a/b//c\"" = String.split "a/b//c" '/' = ["a";"b";"";"c"]
+
+  (* FilePath tests *)
+  let normalise_test_case input expected =
+    let actual = FilePath.normalise input in
+    Stdlib.String.equal actual expected ||
+      (Printf.printf
+         "\nExpected: %s\nActual: %s\n"
+         expected
+         actual;
+       false)
+
+  let relative_to_test_case root contained expected =
+    let actual = FilePath.relative_to root contained in
+    let show = function
+      | None -> "None"
+      | Some s -> "Some " ^ s in
+    Stdlib.Option.equal Stdlib.String.equal actual expected ||
+      (Printf.printf
+         "\nExpected: %s\nActual: %s\n"
+         (show expected)
+         (show actual);
+       false)
+
+  let%test "it removes leading current directory" =
+    normalise_test_case "./ListClient.mo" "ListClient.mo"
+
+  let%test "it removes leading `./` for relative paths" =
+    normalise_test_case "./lib/foo" "lib/foo"
+
+  let%test "it removes duplicate `//`s" =
+    normalise_test_case ".//lib/foo" "lib/foo"
+
+  let%test "it preserves trailing slashes" =
+    normalise_test_case "lib/foo/" "lib/foo/"
+
+  let%test "it combines multiple trailing slashes" =
+    normalise_test_case "lib/foo//" "lib/foo/"
+
+  let%test "it drops intermediate references to the `.` directory" =
+    normalise_test_case "lib/./foo/" "lib/foo/"
+
+  let%test "it applies parent directory traversals" =
+    normalise_test_case "lib/../foo/" "foo/"
+
+  let%test "it keeps parent directory references at the start of a path" =
+    normalise_test_case "../foo/lib" "../foo/lib"
+
+  let%test "it keeps multiple parent directory references at the start of a path" =
+    normalise_test_case "../../foo/lib" "../../foo/lib"
+
+  let%test "it does everything at once" =
+    normalise_test_case "../foo//.././lib" "../lib"
+
+  let%test "it handles absolute paths" =
+    normalise_test_case "/foo" "/foo"
+
+  let%test "it handles absolute directory paths" =
+    normalise_test_case "/foo/./lib/" "/foo/lib/"
+
+  let%test "it handles ." =
+    normalise_test_case "." "."
+
+  let%test "it handles ./" =
+    normalise_test_case "./." "."
+
+  let%test "it handles ./" =
+    normalise_test_case "./" "./"
+
+  let%test "it handles .//" =
+    normalise_test_case ".//" "./"
+
+  let%test "it makes one absolute path relative to another one" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/src/main.mo"
+      (Some "src/main.mo")
+
+  let%test "it's robust in the face of trailing slashes" =
+    relative_to_test_case
+      "/home/project/"
+      "/home/project/src/main.mo"
+      (Some "src/main.mo")
+
+  let%test "it makes a file path relative to a path" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/main.mo"
+      (Some "main.mo")
+
+  let%test "it preserves trailing slashes" =
+    relative_to_test_case
+      "/home/project/"
+      "/home/project/src/"
+      (Some "src/")
+
+  let%test "it handles directory traversals" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/src/../lib/"
+      (Some "lib/")
+
+  let%test "it fails to make disjoint paths relative to one another" =
+    relative_to_test_case
+      "/home/project"
+      "/home/main.mo"
+      None
+
+  let%test "it handles relative paths" =
+    relative_to_test_case
+      "project/src"
+      "project/src/Main.mo"
+      (Some "Main.mo")
+end
+
+
+
+ + + diff --git a/coverage/linking/linkModule.ml.html b/coverage/linking/linkModule.ml.html new file mode 100644 index 00000000000..bb437dd292a --- /dev/null +++ b/coverage/linking/linkModule.ml.html @@ -0,0 +1,2781 @@ + + + + + linkModule.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+
+
(*
+The type for a dynamic library: A normal WebAssembly module
+plus the dylink section.
+*)
+
+open Wasm_exts.Ast
+open Wasm.Source
+open Wasm_exts.CustomModule
+
+(*
+This module is a first stab that should be functionally working, but will go
+through further refactoring before we are happy with it. Things to do:
+
+ * much code (finding imports, counting) is duplicated for globals and
+   functions. This could be refactored into general functions and predicates.
+ * There are multiple AST traversals. These could be turned into a single one
+   (taking multiple rename functions) or even more generally taking a record
+   of functions for each syntactic category.
+*)
+
+(*
+Resolving GOT.func and GOT.mem imports
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+GOT.func and GOT.mem imports arise from function and data pointers,
+respectively, in languages with pointers (e.g. C and Rust). The idea is that if
+a shared library exposes a function/data pointer the entire process should use
+the same pointer for the function/data so that the pointer arithmetic and
+comparisons will work. For example, this C code:
+
+    __attribute__ ((visibility("default")))
+    int f0(int x, int y)
+    {
+        return x + y;
+    }
+
+    __attribute__ ((visibility("default")))
+    int (\*f1(void)) (int x, int y)
+    {
+        return &f0;
+    }
+
+generates this GOT.func import:
+
+    (import "GOT.func" "f0" (global (;N;) (mut i32)))
+
+The host is responsible of allocating a table index for this function and
+resolving the import to the table index for `f0` so that this code in the
+importing module would work:
+
+    assert(f1() == f0);
+
+Note that the definition of `f1` is in the *imported* module and this assertion
+is in the *importing* module.
+
+Similarly exposing a data pointer generates a GOT.mem import. All GOT.mem
+imports to a symbol should resolve to the same constant to support equality as
+above, and additionally pointer arithmetic.
+
+(Pointer arithmetic on function pointers are undefined behavior is C and is not
+supported by clang's wasm backend)
+
+Normally this stuff is for dynamic linking, but we want to link the RTS
+statically, so we resolve these imports during linking. Currently we only
+support GOT.func imports, but implementing GOT.mem imports would be similar.
+Secondly, we only support GOT.func imports in the module that defines the
+function that we take the address of. This currently works as moc-generated code
+doesn't import function addresses from the RTS.
+
+We resolve GOT.func imports in two steps:
+
+- After loading the RTS module we generate a list of (global index, function
+  index) pairs of GOT.func imports. In the example above, global index is N and
+  function index is the index of f0 in the defining module (the RTS).
+
+  This is implemented in `collect_got_func_imports`.
+
+- After merging the sections we add the functions to the table and replace
+  `GOT.func` imports with globals to the functions' table indices.
+
+  Note that we don't reuse table entries when a function is already in the
+  table, to avoid breakage when [ref-types] proposal is implemented, which will
+  allow mutating table entries.
+
+  [ref-types]: https://github.com/WebAssembly/reference-types
+
+  This is implemented in `replace_got_func_imports`.
+
+See also the test `test/ld/fun-ptr` for a concrete exaple of GOT.func generation
+and resolving.
+*)
+
+(* Linking *)
+
+type imports = (int32 * name) list
+
+let phrase f x = { x with it = f x.it }
+
+let map_module f (em : extended_module) = { em with module_ = f em.module_ }
+let map_name_section f (em : extended_module) = { em with name = f em.name }
+
+(* Generic functions about import and export lists *)
+
+let get_import is_thing j m =
+  let open Int32 in
+  let rec go i = function
+    | [] -> assert false
+    | imp::is ->
+      if is_thing imp.it.idesc.it
+      then
+        if i = j
+        then imp
+        else go (add i 1l) is
+      else go i is
+  in go 0l m.imports
+
+let find_imports is_thing libname m : imports =
+  let name = Lib.Utf8.decode libname in
+  let rec go i acc = function
+    | [] -> List.rev acc
+    | imp::is ->
+      if is_thing imp.it.idesc.it
+      then
+        if imp.it.module_name = name
+        then go (i + 1) ((Int32.of_int i, imp.it.item_name) :: acc) is
+        else go (i + 1) acc is
+      else go i acc is
+  in go 0 [] m.imports
+
+let remove_imports is_thing resolved : module_' -> module_' = fun m ->
+  let rec go i = function
+    | [] -> []
+    | (imp::is) ->
+      if is_thing imp.it.idesc.it
+      then
+        if List.mem_assoc i resolved
+        then go (Int32.add i 1l) is
+        else imp :: go (Int32.add i 1l) is
+      else imp :: go i is
+  in
+  { m with imports = go 0l m.imports }
+
+let count_imports is_thing m =
+  Lib.List32.length (List.filter (fun i -> is_thing i.it.idesc.it) m.imports)
+
+let remove_export is_thing name : module_' -> module_' = fun m ->
+  let to_remove e =
+    not (is_thing e.it.edesc.it <> None && e.it.name = Lib.Utf8.decode name)
+  in
+  { m with exports = List.filter to_remove m.exports }
+
+module NameMap = Map.Make(struct type t = Wasm.Ast.name let compare = compare end)
+
+type exports = int32 NameMap.t
+
+let find_exports is_thing m : exports =
+  List.fold_left (fun map exp ->
+    match is_thing exp.it.edesc.it with
+    | Some v -> NameMap.add exp.it.name v.it map
+    | _ -> map
+  ) NameMap.empty m.exports
+
+
+(* Predicate to specialize these generic functions to the various entities *)
+
+let is_fun_import = function
+  | FuncImport _ -> true
+  | _ -> false
+
+let is_global_import = function
+  | GlobalImport _ -> true
+  | _ -> false
+
+let is_table_import = function
+  | TableImport _ -> true
+  | _ -> false
+
+let is_memory_import = function
+  | MemoryImport _ -> true
+  | _ -> false
+
+let is_fun_export = function
+  | FuncExport v -> Some v
+  | _ -> None
+
+let is_global_export = function
+  | GlobalExport v -> Some v
+  | _ -> None
+
+
+let get_fun_typ i m : Wasm.Types.func_type =
+  let imports_n = count_imports is_fun_import m in
+  let tyvar =
+    if i < imports_n
+    then
+      match (get_import is_fun_import i m).it.idesc.it with
+      | FuncImport ty -> ty.it
+      | _ -> assert false
+    else
+      let f = Lib.List32.nth m.funcs (Int32.sub i imports_n) in
+      f.it.ftype.it
+    in
+  (Lib.List32.nth m.types tyvar).it
+
+let get_global_typ i m : Wasm.Types.global_type =
+  let imports_n = count_imports is_global_import m in
+  if i < imports_n
+  then
+    match (get_import is_global_import i m).it.idesc.it with
+    | GlobalImport ty -> ty
+    | _ -> assert false
+  else
+    let f = Lib.List32.nth m.globals (Int32.sub i imports_n) in
+    f.it.gtype
+
+(* Utilities related to functions *)
+
+let remove_fun_imports_name_section resolved : name_section -> name_section = fun ns ->
+  let keep (fi, x) = not (List.mem_assoc fi resolved) in
+  { ns with
+    function_names = List.filter keep ns.function_names;
+    locals_names = List.filter keep ns.locals_names;
+  }
+
+let prepend_to_start fi ftype (em : extended_module)  =
+  let imports_n = count_imports is_fun_import em.module_ in
+  let wrap_fi = Int32.add imports_n (Lib.List32.length em.module_.funcs) in
+
+  let wrap_fun = {
+    ftype = ftype @@ no_region;
+    locals = [];
+    body =
+      [ Call (fi @@ no_region) @@ no_region ] @
+      (match em.module_.start with
+        | Some start_fi -> [ Call start_fi @@ no_region ]
+        | None -> [])
+    } @@ no_region in
+
+  { em with
+    module_ =
+      { em.module_ with
+        funcs = em.module_.funcs @ [ wrap_fun ];
+        start = Some (wrap_fi @@ no_region)
+      };
+    name =
+      { em.name with
+        function_names = em.name.function_names @ [ wrap_fi, "link_start" ]
+      }
+  }
+
+let _remove_non_canister_exports (em : extended_module) : extended_module =
+  let is_canister_export (exp : export) = Lib.String.chop_prefix "canister_" (Lib.Utf8.encode exp.it.name) <> None in
+  map_module (fun m -> { m with exports = List.filter is_canister_export m.exports }) em
+
+let remove_non_ic_exports (em : extended_module) : extended_module =
+  (* We assume that every exported function that does not have an entry in the
+   custom types section was only exported for linking, and should not be
+   exported in the final module *)
+  let is_ic_export (exp : export) =
+    Lib.String.chop_prefix "canister_" (Lib.Utf8.encode exp.it.name) <> None ||
+    "_start" = Lib.Utf8.encode exp.it.name
+  in
+
+  let keep_export exp =
+    is_ic_export exp ||
+    match exp.it.edesc.it with
+      | FuncExport _
+      | GlobalExport _ -> false
+      | MemoryExport _
+      | TableExport _ -> true in
+
+  map_module (fun m -> { m with exports = List.filter keep_export m.exports }) em
+
+(* Generic linking logic *)
+
+exception LinkError of string
+
+type renumbering = int32 -> int32
+
+let resolve imports exports : (int32 * int32) list =
+  List.flatten (List.map (fun (fi, name) ->
+    match NameMap.find_opt name exports with
+    | Some fi' -> [ (fi, fi') ]
+    | None -> []
+    ) imports)
+
+let calculate_renaming n_imports1 n_things1 n_imports2 resolved12 resolved21 : (renumbering * renumbering) =
+  let open Int32 in
+
+  let n_imports1' = sub n_imports1 (Lib.List32.length resolved12) in
+  let n_imports2' = sub n_imports2 (Lib.List32.length resolved21) in
+
+  let rec fun1 i =
+    let rec go skipped = function
+      | (imp, exp)::is ->
+        if i < imp then sub i skipped
+        else if i = imp then fun2 exp
+        else go (add skipped 1l) is
+      | [] ->
+        if i < n_imports1
+        then sub i skipped
+        else sub (add i n_imports2') skipped
+    in go 0l resolved12
+  and fun2 i =
+    let rec go skipped = function
+      | (imp, exp)::is ->
+        if i < imp then sub (add i n_imports1') skipped
+        else if i = imp then fun1 exp
+        else go (add skipped 1l) is
+      | [] ->
+        if i < n_imports2
+        then sub (add i n_imports1') skipped
+        else sub (add (add i n_imports1') n_things1) skipped
+    in go 0l resolved21
+  in
+  (fun1, fun2)
+
+
+(* AST traversals *)
+
+let rename_funcs rn : module_' -> module_' = fun m ->
+  let var' = rn in
+  let var = phrase var' in
+
+  let rec instr' = function
+    | Call v -> Call (var v)
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let edesc' = function
+    | FuncExport v -> FuncExport (var v)
+    | e -> e in
+  let edesc = phrase edesc' in
+  let export' e = { e with edesc = edesc e.edesc } in
+  let export = phrase export' in
+  let exports = List.map export in
+
+  let segment' f s = { s with init  = f s.init } in
+  let segment f = phrase (segment' f) in
+
+  { m with
+    funcs = funcs m.funcs;
+    exports = exports m.exports;
+    start = Option.map var m.start;
+    elems = List.map (segment (List.map var)) m.elems;
+  }
+
+let rename_globals rn : module_' -> module_' = fun m ->
+  let var' = rn in
+  let var = phrase var' in
+
+  let rec instr' = function
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | GlobalGet v -> GlobalGet (var v)
+    | GlobalSet v -> GlobalSet (var v)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let const = phrase instrs in
+
+  let global' g = { g with value = const g.value } in
+  let global = phrase global' in
+  let globals = List.map global in
+
+  let table_segment' (s : var list segment') = { s with offset = const s.offset; } in
+  let table_segment = phrase (table_segment') in
+  let table_segments = List.map table_segment in
+
+  let memory_segment' (s : string segment') = { s with offset = const s.offset; } in
+  let memory_segment = phrase (memory_segment') in
+  let memory_segments = List.map memory_segment in
+
+
+  { m with
+    funcs = funcs m.funcs;
+    globals = globals m.globals;
+    elems = table_segments m.elems;
+    data = memory_segments m.data;
+  }
+
+let set_global global value = fun m ->
+  let rec go i = function
+    | [] -> assert false
+    | g::gs when i = Int32.to_int global ->
+      let open Wasm.Types in
+      assert (g.it.gtype = GlobalType (I32Type, Immutable));
+      let g = phrase (fun g' ->
+        { g' with value = [Const (Wasm.Values.I32 value @@ g.at) @@ g.at] @@ g.at }
+      ) g in
+      g :: gs
+    | g::gs -> g :: go (i+1) gs
+  in
+  { m with globals = go 0 m.globals }
+
+let fill_global (global : int32) (value : int32) : module_' -> module_' = fun m ->
+  let rec instr' = function
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | GlobalGet v when v.it = global -> Const (Wasm.Values.I32 value @@ v.at)
+    | GlobalSet v when v.it = global -> assert false
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let const = phrase instrs in
+
+  let global' g = { g with value = const g.value } in
+  let global = phrase global' in
+  let globals = List.map global in
+
+  let table_segment' (s : var list segment') = { s with offset = const s.offset; } in
+  let table_segment = phrase (table_segment') in
+  let table_segments = List.map table_segment in
+
+  let memory_segment' (s : string segment') = { s with offset = const s.offset; } in
+  let memory_segment = phrase (memory_segment') in
+  let memory_segments = List.map memory_segment in
+
+
+  { m with
+    funcs = funcs m.funcs;
+    globals = globals m.globals;
+    elems = table_segments m.elems;
+    data = memory_segments m.data;
+  }
+
+let rename_funcs_name_section rn (ns : name_section) =
+  { ns with
+    function_names = List.map (fun (fi, name) -> (rn fi, name)) ns.function_names;
+    locals_names = List.map (fun (fi, locals) -> (rn fi, locals)) ns.locals_names;
+  }
+
+let rename_funcs_extended rn (em : extended_module) =
+  { em with
+    module_ = rename_funcs rn em.module_;
+    name = rename_funcs_name_section rn em.name;
+  }
+
+let rename_globals_extended rn (em : extended_module) =
+  { em with
+    module_ = rename_globals rn em.module_;
+  }
+
+let rename_types rn m =
+  let ty_var = phrase rn in
+
+  let block_type = function
+    | VarBlockType tv -> VarBlockType (ty_var tv)
+    | ValBlockType vto -> ValBlockType vto in
+
+  let rec instr' = function
+    | CallIndirect tv -> CallIndirect (ty_var tv)
+    | Block (bty, is) -> Block (block_type bty, instrs is)
+    | Loop (bty, is) -> Loop (block_type bty, instrs is)
+    | If (bty, is1, is2) -> If (block_type bty, instrs is1, instrs is2)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with ftype = ty_var f.ftype; body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let idesc' = function
+    | FuncImport tv -> FuncImport (ty_var tv)
+    | id -> id in
+  let idesc = phrase idesc' in
+  let import' i = { i with idesc = idesc i.idesc } in
+  let import = phrase import' in
+  let imports = List.map import in
+
+  { m with
+    funcs = funcs m.funcs;
+    imports = imports m.imports;
+  }
+
+(* Setting and getting top-level module data *)
+
+let read_global gi (m : module_') : int32 =
+  let n_impo = count_imports is_global_import m in
+  let g = List.nth m.globals (Int32.(to_int (sub gi n_impo))) in
+  let open Wasm.Types in
+  assert (g.it.gtype = GlobalType (I32Type, Immutable));
+  match g.it.value.it with
+  | [{ it = Const {it = Wasm.Values.I32 i;_}; _}] -> i
+  | _ -> assert false
+
+let read_table_size (m : module_') : int32 =
+  (* Assumes there is one table *)
+  let open Wasm.Types in
+  match m.tables with
+  | [t] ->
+    let TableType ({min;max}, _) = t.it.ttype in
+    if Some min <> max
+    then raise (LinkError "Expect fixed sized table in first module")
+    else min
+  | _ -> raise (LinkError "Expect one table in first module")
+
+let set_memory_size new_size_bytes : module_' -> module_' = fun m ->
+  let open Wasm.Types in
+  let page_size = Int32.of_int (64*1024) in
+  let new_size_pages = Int32.(add (div new_size_bytes page_size) 1l) in
+  match m.memories with
+  | [t] ->
+    { m with
+      memories = [ phrase (fun m ->
+        { mtype = MemoryType ({min = new_size_pages; max = None}) }
+      ) t ]
+    }
+  | _ -> raise (LinkError "Expect one memory in first module")
+
+let set_table_size new_size : module_' -> module_' = fun m ->
+  let open Wasm.Types in
+  match m.tables with
+  | [t] ->
+    { m with
+      tables = [ phrase (fun t ->
+        let TableType (_, ty) = t.ttype in
+        { ttype = TableType ({min = new_size; max = Some new_size}, ty) }
+      ) t ]
+    }
+  | _ -> raise (LinkError "Expect one table in first module")
+
+
+let fill_item_import module_name item_name new_base (m : module_') : module_' =
+  (* We need to find the right import,
+     replace all uses of get_global of that import with the constant,
+     and finally rename all globals
+  *)
+  let base_global =
+    let rec go i = function
+      | [] -> assert false
+      | imp::is -> match imp.it.idesc.it with
+        | GlobalImport _ty
+          when imp.it.module_name = Lib.Utf8.decode module_name &&
+               imp.it.item_name = Lib.Utf8.decode item_name ->
+          Int32.of_int i
+        | GlobalImport _ ->
+          go (i + 1) is
+        | _ ->
+          go i is
+    in go 0 m.imports in
+
+    m |> fill_global base_global new_base
+      |> remove_imports is_global_import [base_global, base_global]
+      |> rename_globals Int32.(fun i ->
+          if i < base_global then i
+          else if i = base_global then assert false
+          else sub i one
+        )
+
+let fill_memory_base_import new_base : module_' -> module_' =
+  fill_item_import "env" "__memory_base" new_base
+
+let fill_table_base_import new_base : module_' -> module_' =
+  fill_item_import "env" "__table_base" new_base
+
+
+(* Concatenation of modules *)
+
+let join_modules
+      (em1 : extended_module) (m2 : module_') (ns2 : name_section)
+      (type_indices : (Wasm.Types.func_type, int32) Hashtbl.t) : extended_module =
+  let m1 = em1.module_ in
+  let joined = 
+    { em1 with
+      module_ = {
+        types = m1.types @ m2.types;
+        globals = m1.globals @ m2.globals;
+        tables = m1.tables @ m2.tables;
+        memories = m1.memories @ m2.memories;
+        funcs = m1.funcs @ m2.funcs;
+        start = m1.start;
+        elems = m1.elems @ m2.elems;
+        data = m1.data @ m2.data;
+        imports = m1.imports @ m2.imports;
+        exports = m1.exports @ m2.exports;
+      };
+      name = {
+        em1.name with
+        function_names = em1.name.function_names @ ns2.function_names;
+        locals_names = em1.name.locals_names @ ns2.locals_names;
+      };
+      motoko = em1.motoko;
+    }
+  in
+  (* If second module has a start, prepend it to the first module's start.
+     OK to use `Hashtbl.find` below as the first module will have a start, so
+     we'll have the unit function in the type section already. *)
+  match m2.start with
+  | None -> joined
+  | Some fi -> prepend_to_start fi.it (Hashtbl.find type_indices (Wasm.Types.FuncType ([], []))) joined
+
+(* The main linking function *)
+
+let check_typ is_thing get_typ string_of m1 m2 (i1, i2) =
+  let t1 = get_typ i1 m1 in
+  let t2 = get_typ i2 m2 in
+  let imp = get_import is_thing i1 m1 in
+  if t1 <> t2 then
+    let msg = Printf.sprintf
+      "Type mismatch when linking %s.%s:\nimport type: %s\nexport type: %s"
+      (string_of_name imp.it.module_name)
+      (string_of_name imp.it.item_name)
+      (string_of t1)
+      (string_of t2)
+    in
+    raise (LinkError msg)
+
+let check_fun_typ =
+  check_typ is_fun_import get_fun_typ Wasm.Types.string_of_func_type
+let check_global_typ =
+  check_typ is_global_import get_global_typ Wasm.Types.string_of_global_type
+
+
+let align p n =
+  let open Int32 in
+  let p = to_int p in
+  shift_left (shift_right_logical (add n (sub (shift_left 1l p) 1l)) p) p
+
+let find_fun_export (name : name) (exports : export list) : var option =
+  List.find_map (fun (export : export) ->
+    if export.it.name = name then
+      match export.it.edesc.it with
+      | FuncExport var -> Some var
+      | _ -> raise (LinkError (Format.sprintf "Export %s is not a function" (Lib.Utf8.encode name)))
+    else
+      None
+  ) exports
+
+let remove_got_func_imports (imports : import list) : import list =
+  let got_func_str = Lib.Utf8.decode "GOT.func" in
+  List.filter (fun import -> import.it.module_name <> got_func_str) imports
+
+(* Merge global list of a module with a sorted (on global index) list of (global
+   index, global) pairs, overriding globals at those indices, and appending
+   left-overs at the end. *)
+let add_globals (globals0 : global list) (insert0 : (int32 * global') list) : global list =
+  let rec go (current_idx : int32) globals insert =
+    match insert with
+    | [] -> globals
+    | (insert_idx, global) :: rest ->
+      if current_idx = insert_idx then
+        (global @@ no_region) :: go (Int32.add current_idx 1l) globals rest
+      else
+        match globals with
+        | [] -> List.map (fun (_, global) -> global @@ no_region) insert
+        | global :: globals -> global :: go (Int32.add current_idx 1l) globals rest
+  in
+  go 0l globals0 insert0
+
+let mk_i32_const (i : int32) =
+  Const (Wasm.Values.I32 i @@ no_region) @@ no_region
+
+let mk_i32_global (i : int32) =
+  { gtype = Wasm.Types.GlobalType (Wasm.Types.I32Type, Wasm.Types.Immutable);
+    value = [mk_i32_const i] @@ no_region }
+
+(* Generate (global index, function index) pairs for GOT.func imports of a
+   module. Uses import and export lists of the module so those should be valid. *)
+let collect_got_func_imports (m : module_') : (int32 * int32) list =
+  let got_func_name = Lib.Utf8.decode "GOT.func" in
+
+  let get_got_func_import (global_idx, imports) import : (int32 * (int32 * int32) list) =
+    if import.it.module_name = got_func_name then
+      (* Found a GOT.func import, find the exported function for it *)
+      let name = import.it.item_name in
+      let fun_idx =
+        match find_fun_export name m.exports with
+        | None -> raise (LinkError (Format.sprintf "Can't find export for GOT.func import %s" (Lib.Utf8.encode name)))
+        | Some export_idx -> export_idx.it
+      in
+      let global_idx =
+        if is_global_import import.it.idesc.it then
+          global_idx
+        else
+          raise (LinkError "GOT.func import is not global")
+      in
+      ( Int32.add global_idx (Int32.of_int 1), (global_idx, fun_idx) :: imports )
+    else
+      let global_idx =
+        if is_global_import import.it.idesc.it then
+          Int32.add global_idx (Int32.of_int 1)
+        else
+          global_idx
+      in
+      ( global_idx, imports )
+  in
+
+  (* (global index, function index) list *)
+  let (_, got_func_imports) =
+    List.fold_left get_got_func_import (0l, []) m.imports
+  in
+
+  got_func_imports
+
+(* Add functions imported from GOT.func to the table, replace GOT.func imports
+   with globals to the table indices.
+
+   `tbe_size` is the size of the table in the merged module before adding
+   GOT.func functions. *)
+let replace_got_func_imports (tbl_size : int32) (imports : (int32 * int32) list) (m : module_') : module_' =
+  (* null check to avoid adding empty elem section *)
+  if imports = [] then
+    m
+  else
+    let imports =
+      List.sort (fun (gbl_idx_1, _) (gbl_idx_2, _) -> compare gbl_idx_1 gbl_idx_2) imports
+    in
+
+    let elems : var list =
+      List.map (fun (_, fun_idx) -> fun_idx @@ no_region) imports
+    in
+
+    let elem_section =
+      { index = 0l @@ no_region; offset = [ mk_i32_const tbl_size ] @@ no_region; init = elems }
+    in
+
+    let globals =
+      List.mapi (fun idx (global_idx, _) -> (global_idx, mk_i32_global (Int32.add tbl_size (Int32.of_int idx)))) imports
+    in
+
+    { m with
+      elems = List.append m.elems [elem_section @@ no_region];
+      imports = remove_got_func_imports m.imports;
+      globals = add_globals m.globals globals
+    }
+
+(* The first argument specifies the global of the first module indicating the
+start of free memory *)
+let link (em1 : extended_module) libname (em2 : extended_module) =
+
+  let global_exports1 = find_exports is_global_export em1.module_ in
+
+  let heap_global =
+    match NameMap.find_opt (Lib.Utf8.decode "__heap_base") global_exports1 with
+    | None -> raise (LinkError "First module does not export __heap_base")
+    | Some gi -> gi in
+
+  let dylink = match em2.dylink with
+    | Some dylink -> dylink
+    | None -> raise (LinkError "Second module does not have a dylink section") in
+
+  (* Beginning of unused space *)
+  let old_heap_start = read_global heap_global em1.module_ in
+  let lib_heap_start = align dylink.memory_alignment old_heap_start in
+  let new_heap_start = align 4l (Int32.add lib_heap_start dylink.memory_size) in
+
+  let old_table_size = read_table_size em1.module_ in
+  let lib_table_start = align dylink.table_alignment old_table_size in
+
+  (* Fill in memory and table base pointers *)
+  let dm2 = em2.module_
+    |> fill_memory_base_import lib_heap_start
+    |> fill_table_base_import lib_table_start in
+
+  let got_func_imports = collect_got_func_imports dm2 in
+
+  (* Link functions *)
+  let fun_required1 = find_imports is_fun_import libname em1.module_ in
+  let fun_required2 = find_imports is_fun_import "env" dm2 in
+  let fun_exports1 = find_exports is_fun_export em1.module_ in
+  let fun_exports2 = find_exports is_fun_export dm2 in
+  (* Resolve imports, to produce a renumbering function: *)
+  let fun_resolved12 = resolve fun_required1 fun_exports2 in
+  let fun_resolved21 = resolve fun_required2 fun_exports1 in
+  let (funs1, funs2) =
+    calculate_renaming
+      (count_imports is_fun_import em1.module_)
+      (Lib.List32.length em1.module_.funcs)
+      (count_imports is_fun_import dm2)
+      fun_resolved12
+      fun_resolved21 in
+
+  List.iter (check_fun_typ em1.module_ dm2) fun_resolved12;
+  List.iter (check_fun_typ dm2 em1.module_) fun_resolved21;
+
+  (* Link globals *)
+  let global_required1 = find_imports is_global_import libname em1.module_ in
+  let global_required2 = find_imports is_global_import "env" dm2 in
+  let global_exports2 = find_exports is_global_export dm2 in
+  (* Resolve imports, to produce a renumbering *)
+  let global_resolved12 = resolve global_required1 global_exports2 in
+  let global_resolved21 = resolve global_required2 global_exports1 in
+  let (globals1, globals2) =
+    calculate_renaming
+      (count_imports is_global_import em1.module_)
+      (Lib.List32.length em1.module_.globals)
+      (count_imports is_global_import dm2)
+      global_resolved12
+      global_resolved21 in
+  assert (global_required1 = []); (* so far, we do not import globals *)
+
+  List.iter (check_global_typ em1.module_ dm2) global_resolved12;
+  List.iter (check_global_typ dm2 em1.module_) global_resolved21;
+
+  (* Rename types in both modules to eliminate duplicate types. *)
+
+  (* Maps function types to their indices in the new module we're creating *)
+  let type_indices : (Wasm.Types.func_type, int32) Hashtbl.t = Hashtbl.create 100 in
+
+  (* Get index of a function type. Creates a new one if we haven't added this
+     type yet. *)
+  let add_or_get_ty (ty : Wasm.Types.func_type) =
+    match Hashtbl.find_opt type_indices ty with
+    | None ->
+      let idx = Int32.of_int (Hashtbl.length type_indices) in
+      Hashtbl.add type_indices ty idx;
+      idx
+    | Some idx ->
+      idx
+  in
+
+  (* Rename a type in a module. First argument is the list of types in the module. *)
+  let ty_renamer (tys : Wasm.Types.func_type phrase list) (t : int32) : int32 =
+    let fun_ty = List.nth tys (Int32.to_int t) in
+    add_or_get_ty fun_ty.it
+  in
+
+  (* Rename types in first module *)
+  let em1_tys =
+    map_module (fun m -> { (rename_types (ty_renamer m.types) m) with types = [] }) em1
+  in
+
+  (* Rename types in second module *)
+  let dm2 =
+    { (rename_types (ty_renamer dm2.types) dm2) with types = [] }
+  in
+
+  (* Generate type section for the final module *)
+  let type_indices_sorted : type_ list =
+    Hashtbl.to_seq type_indices |>
+    List.of_seq |>
+    List.sort (fun (_, idx1) (_, idx2) -> compare idx1 idx2) |>
+    List.map (fun (ty, _) -> ty @@ no_region)
+  in
+
+  (* Inject call to "__wasm_call_ctors" *)
+  let add_call_ctors =
+    match NameMap.find_opt (Lib.Utf8.decode "__wasm_call_ctors") fun_exports2 with
+    | None -> fun em -> em
+    | Some fi -> prepend_to_start (funs2 fi) (add_or_get_ty (Wasm.Types.FuncType ([], [])))
+  in
+
+  let new_table_size =
+    Int32.add (Int32.add lib_table_start dylink.table_size) (Int32.of_int (List.length got_func_imports))
+  in
+
+  let merged = join_modules
+    ( em1_tys
+    |> map_module (fun m -> { m with types = type_indices_sorted })
+    |> map_module (remove_imports is_fun_import fun_resolved12)
+    |> map_name_section (remove_fun_imports_name_section fun_resolved12)
+    |> map_module (remove_imports is_global_import global_resolved12)
+    |> rename_funcs_extended funs1
+    |> rename_globals_extended globals1
+    |> map_module (set_global heap_global new_heap_start)
+    |> map_module (set_memory_size new_heap_start)
+    |> map_module (set_table_size new_table_size)
+    )
+    ( dm2
+    |> remove_imports is_fun_import fun_resolved21
+    |> remove_imports is_global_import global_resolved21
+    |> remove_imports is_memory_import [0l, 0l]
+    |> remove_imports is_table_import [0l, 0l]
+    |> rename_funcs funs2
+    |> rename_globals globals2
+    |> remove_export is_fun_export "__wasm_call_ctors"
+    )
+    ( em2.name
+    |> remove_fun_imports_name_section fun_resolved21
+    |> rename_funcs_name_section funs2
+    )
+    type_indices
+  |> add_call_ctors
+  |> remove_non_ic_exports (* only sane if no additional files get linked in *)
+  in
+
+  (* Rename global and function indices in GOT.func stuff *)
+  let got_func_imports =
+    List.map (fun (global_idx, func_idx) -> (globals2 global_idx, funs2 func_idx)) got_func_imports
+  in
+
+  (* Replace GOT.func imports with globals to function table indices *)
+  let final =
+    replace_got_func_imports (Int32.add lib_table_start dylink.table_size) got_func_imports merged.module_
+  in
+
+  { merged with module_ = final }
+
+
+
+ + + diff --git a/coverage/lowering/desugar.ml.html b/coverage/lowering/desugar.ml.html new file mode 100644 index 00000000000..e4e5ed62e5c --- /dev/null +++ b/coverage/lowering/desugar.ml.html @@ -0,0 +1,3514 @@ + + + + + desugar.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+
+
open Ir_def
+open Mo_def
+open Mo_types
+open Mo_values
+open Syntax
+
+open Source
+open Operator
+module S = Syntax
+module I = Ir
+module T = Type
+open Construct
+
+(*
+As a first scaffolding, we translate imported files into let-bound
+variables with a special, non-colliding name, which we sometimes
+want to recognize for better user experience.
+*)
+
+let id_of_full_path (fp : string) : string =
+  "file$" ^ fp
+
+(* Combinators used in the desugaring *)
+
+let apply_sign op l = Syntax.(match op, l with
+  | PosOp, l -> l
+  | NegOp, (NatLit n | IntLit n) -> IntLit (Numerics.Int.sub Numerics.Int.zero n)
+  | NegOp, Int8Lit n -> Int8Lit (Numerics.Int_8.sub Numerics.Int_8.zero n)
+  | NegOp, Int16Lit n -> Int16Lit (Numerics.Int_16.sub Numerics.Int_16.zero n)
+  | NegOp, Int32Lit n -> Int32Lit (Numerics.Int_32.sub Numerics.Int_32.zero n)
+  | NegOp, Int64Lit n -> Int64Lit (Numerics.Int_64.sub Numerics.Int_64.zero n)
+  | _, _ -> raise (Invalid_argument "Invalid signed pattern")
+  )
+
+let phrase f x = { x with it = f x.it }
+
+let typ_note : S.typ_note -> Note.t =
+  fun S.{ note_typ; note_eff } -> Note.{ def with typ = note_typ; eff = note_eff }
+
+let phrase' f x =
+  { x with it = f x.at x.note x.it }
+
+let typed_phrase' f x =
+  let n' = typ_note x.note in
+  { x with it = f x.at n' x.it; note = n' }
+
+
+let rec exps es = List.map exp es
+
+and exp e =
+    (* We short-cut AnnotE here, so that we get the position of the inner expression *)
+    match e.it with
+    | S.AnnotE (e', t) -> exp e'
+    | _ -> typed_phrase' exp' e
+
+and exp' at note = function
+  | S.VarE i -> I.VarE i.it
+  | S.ActorUrlE e ->
+    I.(PrimE (ActorOfIdBlob note.Note.typ, [url e at]))
+  | S.LitE l -> I.LitE (lit !l)
+  | S.UnE (ot, o, e) ->
+    I.PrimE (I.UnPrim (!ot, o), [exp e])
+  | S.BinE (ot, e1, o, e2) ->
+    I.PrimE (I.BinPrim (!ot, o), [exp e1; exp e2])
+  | S.RelE (ot, e1, Operator.NeqOp, e2) ->
+    (notE (primE (I.RelPrim (!ot, Operator.EqOp)) [exp e1; exp e2])).it
+  | S.RelE (ot, e1, o, e2) ->
+    I.PrimE (I.RelPrim (!ot, o), [exp e1; exp e2])
+  | S.ShowE (ot, e) ->
+    I.PrimE (I.ShowPrim !ot, [exp e])
+  | S.ToCandidE es ->
+    let args = exps es in
+    let ts = List.map (fun e -> e.note.Note.typ) args in
+    (primE (I.SerializePrim ts) [seqE args]).it
+  | S.FromCandidE e ->
+    begin match T.normalize note.Note.typ with
+    | T.Opt t -> (primE (I.DeserializeOptPrim (T.as_seq t)) [exp e]).it
+    | _ -> assert false
+    end
+  | S.TupE es -> (tupE (exps es)).it
+  | S.ProjE (e, i) -> (projE (exp e) i).it
+  | S.OptE e -> (optE (exp e)).it
+  | S.DoOptE e ->
+    I.LabelE ("!", note.Note.typ, optE (exp e))
+  | S.BangE e ->
+    let ty = note.Note.typ in
+    let v = fresh_var "v" ty in
+    (switch_optE (exp e)
+      (* case null : *)
+      (breakE "!" (nullE()))
+      (* case ? v : *)
+      (varP v) (varE v) ty).it
+  | S.ObjBlockE (s, dfs) ->
+    obj_block at s None dfs note.Note.typ
+  | S.ObjE (bs, efs) ->
+    obj note.Note.typ efs bs
+  | S.TagE (c, e) -> (tagE c.it (exp e)).it
+  | S.DotE (e, x) when T.is_array e.note.S.note_typ ->
+    (array_dotE e.note.S.note_typ x.it (exp e)).it
+  | S.DotE (e, x) when T.is_prim T.Blob e.note.S.note_typ ->
+    (blob_dotE  x.it (exp e)).it
+  | S.DotE (e, x) when T.is_prim T.Text e.note.S.note_typ ->
+    (text_dotE  x.it (exp e)).it
+  | S.DotE (e, x) ->
+    begin match T.as_obj_sub [x.it] e.note.S.note_typ with
+    | T.Actor, _ -> I.PrimE (I.ActorDotPrim x.it, [exp e])
+    | _ -> I.PrimE (I.DotPrim x.it, [exp e])
+    end
+  | S.AssignE (e1, e2) -> I.AssignE (lexp e1, exp e2)
+  | S.ArrayE (m, es) ->
+    let t = T.as_array note.Note.typ in
+    I.PrimE (I.ArrayPrim (mut m, T.as_immut t), exps es)
+  | S.IdxE (e1, e2) -> I.PrimE (I.IdxPrim, [exp e1; exp e2])
+  | S.FuncE (name, sp, tbs, p, _t_opt, _, e) ->
+    let s, po = match sp.it with
+      | T.Local -> (T.Local, None)
+      | T.Shared (ss, {it = S.WildP; _} ) -> (* don't bother with ctxt pat *)
+        (T.Shared ss, None)
+      | T.Shared (ss, sp) -> (T.Shared ss, Some sp) in
+    let args, wrap, control, res_tys = to_args note.Note.typ po p in
+    let tbs' = typ_binds tbs in
+    let vars = List.map (fun (tb : I.typ_bind) -> T.Con (tb.it.I.con, [])) tbs' in
+    let tys = List.map (T.open_ vars) res_tys in
+    I.FuncE (name, s, control, tbs', args, tys, wrap (exp e))
+  (* Primitive functions in the prelude have particular shapes *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_}, _);note;_}, _, e)
+    when Lib.String.chop_prefix "num_conv" p <> None ->
+    begin match String.split_on_char '_' p with
+    | ["num"; "conv"; s1; s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      I.PrimE (I.NumConvTrapPrim (p1, p2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_}, _);note;_}, _, e)
+    when Lib.String.chop_prefix "num_wrap" p <> None ->
+    begin match String.split_on_char '_' p with
+    | ["num"; "wrap"; s1; s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      I.PrimE (I.NumConvWrapPrim (p1, p2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "decodeUtf8";_},_);_}, _, e) ->
+    I.PrimE (I.DecodeUtf8, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "encodeUtf8";_},_);_}, _, e) ->
+    I.PrimE (I.EncodeUtf8, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cast";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.CastPrim (T.seq ts1, T.seq ts2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "serialize";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.SerializePrim ts1, [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "deserialize";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.DeserializePrim ts2, [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "caller";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.ICCallerPrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "time";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemTimePrim, [])
+  (* Cycles *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesBalance";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesBalancePrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAvailable";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesAvailablePrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesRefunded";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesRefundedPrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAccept";_},_);_}, _, e) ->
+    I.PrimE (I.SystemCyclesAcceptPrim, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAdd";_},_);_}, _, e) ->
+    I.PrimE (I.SystemCyclesAddPrim, [exp e])
+  (* Certified data *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "setCertifiedData";_},_);_}, _, e) ->
+    I.PrimE (I.SetCertifiedData, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "getCertificate";_},_);_}, _, {it=S.TupE es;_}) ->
+    I.PrimE (I.GetCertificate, [])
+  (* Other *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_},_);_}, _, {it=S.TupE es;_}) ->
+    I.PrimE (I.OtherPrim p, exps es)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_},_);_}, _, e) ->
+    I.PrimE (I.OtherPrim p, [exp e])
+  (* Optimizing array.size() *)
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.is_array e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "array_len", [exp e1])
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.(is_prim Text) e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "text_len", [exp e1])
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.(is_prim Blob) e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "blob_size", [exp e1])
+  (* Normal call *)
+  | S.CallE (e1, inst, e2) ->
+    I.PrimE (I.CallPrim inst.note, [exp e1; exp e2])
+  | S.BlockE [] -> (unitE ()).it
+  | S.BlockE [{it = S.ExpD e; _}] -> (exp e).it
+  | S.BlockE ds -> I.BlockE (block (T.is_unit note.Note.typ) ds)
+  | S.NotE e -> (notE (exp e)).it
+  | S.AndE (e1, e2) -> (andE (exp e1) (exp e2)).it
+  | S.OrE (e1, e2) -> (orE (exp e1) (exp e2)).it
+  | S.ImpliesE (e1, e2) -> (impliesE (exp e1) (exp e2)).it
+  | S.OldE e -> (oldE (exp e)).it
+  | S.IfE (e1, e2, e3) -> I.IfE (exp e1, exp e2, exp e3)
+  | S.SwitchE (e1, cs) -> I.SwitchE (exp e1, cases cs)
+  | S.TryE (e1, cs) -> I.TryE (exp e1, cases cs)
+  | S.WhileE (e1, e2) -> (whileE (exp e1) (exp e2)).it
+  | S.LoopE (e1, None) -> I.LoopE (exp e1)
+  | S.LoopE (e1, Some e2) -> (loopWhileE (exp e1) (exp e2)).it
+  | S.ForE (p, {it=S.CallE ({it=S.DotE (arr, proj); _}, _, e1); _}, e2)
+      when T.is_array arr.note.S.note_typ && (proj.it = "vals" || proj.it = "keys")
+    -> (transform_for_to_while p arr proj e1 e2).it
+  | S.ForE (p, e1, e2) -> (forE (pat p) (exp e1) (exp e2)).it
+  | S.DebugE e -> if !Mo_config.Flags.release_mode then (unitE ()).it else (exp e).it
+  | S.LabelE (l, t, e) -> I.LabelE (l.it, t.Source.note, exp e)
+  | S.BreakE (l, e) -> (breakE l.it (exp e)).it
+  | S.RetE e -> (retE (exp e)).it
+  | S.ThrowE e -> I.PrimE (I.ThrowPrim, [exp e])
+  | S.AsyncE (s, tb, e) ->
+    I.AsyncE (s, typ_bind tb, exp e,
+      match note.Note.typ with
+      | T.Async (_, t, _) -> t
+      | _ -> assert false)
+  | S.AwaitE (s, e) -> I.PrimE (I.AwaitPrim s, [exp e])
+  | S.AssertE (Runtime, e) -> I.PrimE (I.AssertPrim, [exp e])
+  | S.AssertE (_, e) -> (unitE ()).it
+  | S.AnnotE (e, _) -> assert false
+  | S.ImportE (f, ir) -> raise (Invalid_argument (Printf.sprintf "Import expression found in unit body: %s" f))
+  | S.PrimE s -> raise (Invalid_argument ("Unapplied prim " ^ s))
+  | S.IgnoreE e ->
+    I.BlockE ([
+      { it = I.LetD ({it = I.WildP; at = e.at; note = T.Any}, exp e);
+        at = e.at; note = ()}], (unitE ()))
+
+and url e at =
+    (* Set position explicitly *)
+    match e.it with
+    | S.AnnotE (e,_) -> url e at
+    | _ ->
+      let e' = exp e in
+      { it = I.(PrimE (BlobOfIcUrl, [e'])); at; note = Note.{def with typ = T.blob; eff = e'.note.eff } }
+
+and lexp e =
+    (* We short-cut AnnotE here, so that we get the position of the inner expression *)
+    match e.it with
+    | S.AnnotE (e,_) -> lexp e
+    | _ -> { e with it = lexp' e.it; note = e.note.S.note_typ }
+
+and lexp' = function
+  | S.VarE i -> I.VarLE i.it
+  | S.DotE (e, x) -> I.DotLE (exp e, x.it)
+  | S.IdxE (e1, e2) -> I.IdxLE (exp e1, exp e2)
+  | _ -> raise (Invalid_argument ("Unexpected expression as lvalue"))
+
+and transform_for_to_while p arr_exp proj e1 e2 =
+  (* for (p in (arr_exp : [_]).proj(e1)) e2 when proj in {"keys", "vals"}
+     ~~>
+     let arr = arr_exp ;
+     let size = arr.size(e1) ;
+     var indx = 0 ;
+     label l loop {
+       if indx < size
+       then { let p = arr[indx]; e2; indx += 1 }
+       else { break l }
+     } *)
+  let arr_typ = arr_exp.note.note_typ in
+  let arrv = fresh_var "arr" arr_typ in
+  let indx = fresh_var "indx" T.(Mut nat) in
+  let spacing, indexing_exp = match proj.it with
+    | "vals" -> I.ElementSize, primE I.DerefArrayOffset [varE arrv; varE indx]
+    | "keys" -> I.One, varE indx
+    | _ -> assert false in
+  let size_exp = primE I.(GetPastArrayOffset spacing) [varE arrv] in
+  let size = fresh_var "size" T.nat in
+  blockE
+    [ letD arrv (exp arr_exp)
+    ; expD (exp e1)
+    ; letD size size_exp
+    ; varD indx (natE Numerics.Nat.zero)]
+    (whileE (primE I.ValidArrayOffset
+               [varE indx; varE size])
+       (blockE [ letP (pat p) indexing_exp
+               ; expD (exp e2)]
+          (assignE indx
+             (primE I.(NextArrayOffset spacing) [varE indx]))))
+
+and mut m = match m.it with
+  | S.Const -> Ir.Const
+  | S.Var -> Ir.Var
+
+and obj_block at s self_id dfs obj_typ =
+  match s.it with
+  | T.Object | T.Module ->
+    build_obj at s.it self_id dfs obj_typ
+  | T.Actor ->
+    build_actor at [] self_id dfs obj_typ
+  | T.Memory -> assert false
+
+and build_field {T.lab; T.typ;_} =
+  { it = I.{ name = lab
+           ; var = lab
+           }
+  ; at = no_region
+  ; note = typ
+  }
+
+and build_fields obj_typ =
+    match obj_typ with
+    | T.Obj (_, fields) ->
+      (* TBR: do we need to sort val_fields?*)
+      let val_fields = List.filter (fun {T.lab; T.typ; _} -> not (T.is_typ typ)) fields in
+      List.map build_field val_fields
+    | _ -> assert false
+
+and with_self i typ decs =
+  let_no_shadow (var i typ) (selfRefE typ) decs
+
+and call_system_func_opt name es obj_typ =
+  List.find_map (fun es ->
+    match es.it with
+    | { S.vis = { it = S.System; _ };
+        S.dec = { it = S.LetD( { it = S.VarP id; note; _ }, _, _); at; _ };
+        _ }
+      when id.it = name ->
+      Some (
+        match name with
+        | "timer" when not !Mo_config.Flags.global_timer -> assert false;
+        | "timer" ->
+           let timer =
+             blockE
+               [ expD T.(callE (varE (var id.it note)) [Any]
+                   (varE (var "@set_global_timer" (Func (Local, Returns, [], [Prim Nat64], []))))) ]
+               (unitE ()) in
+           { timer with at }
+        | "heartbeat" ->
+          blockE
+            [ expD (callE (varE (var id.it note)) [T.Any] (unitE())) ]
+           (unitE ())
+        | "inspect" ->
+          let _, tfs = T.as_obj obj_typ in
+          let caller = fresh_var "caller" T.caller in
+          let arg = fresh_var "arg" T.blob in
+          let msg_typ = T.decode_msg_typ tfs in
+          let msg = fresh_var "msg" msg_typ in
+          let record_typ =
+            T.Obj (T.Object, List.sort T.compare_field
+             [{T.lab = "caller"; T.typ = typ_of_var caller; T.depr = None};
+               {T.lab = "arg"; T.typ = typ_of_var arg; T.depr = None};
+               {T.lab = "msg"; T.typ = typ_of_var msg; T.depr = None}])
+          in
+          let record = fresh_var "record" record_typ in
+          let msg_variant =
+            switch_textE (primE Ir.ICMethodNamePrim [])
+              (List.map (fun tf ->
+                (tf.T.lab,
+                  match tf.T.typ with
+                  | T.Func(T.Local, _, [], [], ts) ->
+                    tagE tf.T.lab
+                      T.(funcE ("$"^tf.lab) Local Returns [] [] ts
+                        (primE (Ir.DeserializePrim ts) [varE arg]))
+                  | _ -> assert false))
+                (T.as_variant msg_typ))
+               (* Trap early, refusing all other messages,
+                  including those in T.well_known_actor_fields. *)
+              (wildP,
+                (primE (Ir.OtherPrim "trap")
+                  [textE "canister_inspect_message implicitly refused message"]))
+              msg_typ
+          in
+          let accept = fresh_var "accept" T.bool
+          in
+            blockE
+              [ letD record (
+                  blockE [
+                    letD caller (primE Ir.ICCallerPrim []);
+                    letD arg (primE Ir.ICArgDataPrim []);
+                    letD msg msg_variant
+                  ]
+                  (newObjE T.Object [
+                    {it = I.{name = "caller"; var = id_of_var caller}; at = no_region; note = typ_of_var caller };
+                    {it = I.{name = "arg"; var = id_of_var arg}; at = no_region; note = typ_of_var arg };
+                    {it = I.{name = "msg"; var = id_of_var msg}; at = no_region; note = typ_of_var msg }]
+                    record_typ));
+                letD accept (callE (varE (var id.it note)) [] (varE record))]
+              (ifE (varE accept)
+                (unitE ())
+                (primE (Ir.OtherPrim "trap")
+                  [textE "canister_inspect_message explicitly refused message"]))
+        | _name ->
+          callE (varE (var id.it note)) [] (tupE []))
+    | _ -> None) es
+and build_candid ts obj_typ =
+  let (args, prog) = Mo_idl.Mo_to_idl.of_service_type ts obj_typ in
+  I.{
+   args = Idllib.Arrange_idl.string_of_args args;
+   service = Idllib.Arrange_idl.string_of_prog prog;
+  }
+
+and export_interface txt =
+  (* This is probably a temporary hack. *)
+  let open T in
+  let {lab;typ;_} = get_candid_interface_fld in
+  let v = "$"^lab  in
+  let scope_con1 = Cons.fresh "T1" (Abs ([], scope_bound)) in
+  let scope_con2 = Cons.fresh "T2" (Abs ([], Any)) in
+  let bind1  = typ_arg scope_con1 Scope scope_bound in
+  let bind2 = typ_arg scope_con2 Scope scope_bound in
+  ([ letD (var v typ) (
+    funcE v (Shared Query) Promises [bind1] [] [text] (
+      asyncE Type.Fut bind2 (textE txt) (Con (scope_con1, []))
+    )
+  )],
+  [{ it = I.{ name = lab; var = v }; at = no_region; note = typ }])
+
+and export_footprint self_id expr =
+  let open T in
+  let {lab;typ;_} = motoko_stable_var_info_fld in
+  let v = "$"^lab in
+  let size = fresh_var "size" T.nat64 in
+  let scope_con1 = Cons.fresh "T1" (Abs ([], scope_bound)) in
+  let scope_con2 = Cons.fresh "T2" (Abs ([], Any)) in
+  let bind1  = typ_arg scope_con1 Scope scope_bound in
+  let bind2 = typ_arg scope_con2 Scope scope_bound in
+  let ret_typ = T.Obj(Object,[{lab = "size"; typ = T.nat64; depr = None}]) in
+  let caller = fresh_var "caller" caller in
+  ([ letD (var v typ) (
+       funcE v (Shared Query) Promises [bind1] [] [ret_typ] (
+           (asyncE T.Fut bind2
+              (blockE [
+                   letD caller (primE I.ICCallerPrim []);
+                   expD (assertE (orE (primE (I.RelPrim (principal, Operator.EqOp))
+                                         [varE caller; selfRefE principal])
+                                    (primE (I.OtherPrim "is_controller") [varE caller])));
+                   letD size (primE (I.ICStableSize expr.note.Note.typ) [expr])
+                 ]
+                 (newObjE T.Object
+                   [{ it = Ir.{name = "size"; var = id_of_var size};
+                      at = no_region;
+                      note = T.nat64 }]
+                   ret_typ))
+              (Con (scope_con1, []))))
+  )],
+  [{ it = I.{ name = lab; var = v }; at = no_region; note = typ }])
+
+and build_actor at ts self_id es obj_typ =
+  let candid = build_candid ts obj_typ in
+  let fs = build_fields obj_typ in
+  let es = List.filter (fun ef -> is_not_typD ef.it.S.dec) es in
+  let ds = decs (List.map (fun ef -> ef.it.S.dec) es) in
+  let stabs = List.map (fun ef -> ef.it.S.stab) es in
+  let pairs = List.map2 stabilize stabs ds in
+  let idss = List.map fst pairs in
+  let ids = List.concat idss in
+  let sig_ = List.sort T.compare_field
+    (List.map (fun (i,t) -> T.{lab = i; typ = t; depr = None}) ids)
+  in
+  let fields = List.map (fun (i,t) -> T.{lab = i; typ = T.Opt (T.as_immut t); depr = None}) ids in
+  let mk_ds = List.map snd pairs in
+  let ty = T.Obj (T.Memory, List.sort T.compare_field fields) in
+  let state = fresh_var "state" (T.Mut (T.Opt ty)) in
+  let get_state = fresh_var "getState" (T.Func(T.Local, T.Returns, [], [], [ty])) in
+  let ds = List.map (fun mk_d -> mk_d get_state) mk_ds in
+  let ds =
+    varD state (optE (primE (I.ICStableRead ty) []))
+    ::
+    nary_funcD get_state []
+      (let v = fresh_var "v" ty in
+       switch_optE (immuteE (varE state))
+         (unreachableE ())
+         (varP v) (varE v)
+         ty)
+    ::
+    ds
+    @
+    [expD (assignE state (nullE()))]
+  in
+  let ds' = match self_id with
+    | Some n -> with_self n.it obj_typ ds
+    | None -> ds in
+  let meta =
+    I.{ candid = candid;
+        sig_ = T.string_of_stab_sig sig_} in
+  let interface_d, interface_f = export_interface candid.I.service in
+  let with_stable_vars wrap =
+    let vs = fresh_vars "v" (List.map (fun f -> f.T.typ) fields) in
+    blockE
+      ((match call_system_func_opt "preupgrade" es obj_typ with
+        | Some call -> [ expD (primE (I.ICPerformGC) []); expD call]
+        | None -> []) @
+         [letP (seqP (List.map varP vs)) (* dereference any mutable vars, option 'em all *)
+            (seqE (List.map (fun (i,t) -> optE (varE (var i t))) ids))])
+      (wrap
+         (newObjE T.Memory
+            (List.map2 (fun f v ->
+                 { it = I.{name = f.T.lab; var = id_of_var v};
+                   at = no_region;
+                   note = f.T.typ }
+               ) fields vs)
+            ty)) in
+  let footprint_d, footprint_f = export_footprint self_id (with_stable_vars (fun e -> e)) in
+  I.(ActorE (interface_d @ footprint_d @ ds', interface_f @ footprint_f @ fs,
+     { meta;
+       preupgrade = with_stable_vars (fun e -> primE (I.ICStableWrite ty) [e]);
+       postupgrade =
+         (match call_system_func_opt "postupgrade" es obj_typ with
+          | Some call -> call
+          | None -> tupE []);
+       heartbeat =
+         (match call_system_func_opt "heartbeat" es obj_typ with
+          | Some call -> call
+          | None -> tupE []);
+       timer =
+         (match call_system_func_opt "timer" es obj_typ with
+          | Some call -> call
+          | None when !Mo_config.Flags.global_timer ->
+            blockE
+              [ expD T.(callE (varE (var "@timer_helper" Mo_frontend.Typing.heartbeat_type)) [unit] (unitE())) ]
+              (unitE ())
+          | None -> tupE []);
+       inspect =
+         (match call_system_func_opt "inspect" es obj_typ with
+          | Some call -> call
+          | None -> tupE [])
+     },
+     obj_typ))
+
+
+and stabilize stab_opt d =
+  let s = match stab_opt with None -> S.Flexible | Some s -> s.it  in
+  match s, d.it with
+  | (S.Flexible, _) ->
+    ([], fun _ -> d)
+  | (S.Stable, I.VarD(i, t, e)) ->
+    ([(i, T.Mut t)],
+     fun get_state ->
+     let v = fresh_var i t in
+     varD (var i (T.Mut t))
+       (switch_optE (dotE (callE (varE get_state) [] (unitE ())) i (T.Opt t))
+         e
+         (varP v) (varE v)
+         t))
+  | (S.Stable, I.RefD _) -> assert false (* RefD cannot come from user code *)
+  | (S.Stable, I.LetD({it = I.VarP i; _} as p, e)) ->
+    let t = p.note in
+    ([(i, t)],
+     fun get_state ->
+     let v = fresh_var i t in
+     letP p
+       (switch_optE (dotE (callE (varE get_state) [] (unitE ())) i (T.Opt t))
+         e
+         (varP v) (varE v)
+         t))
+  | (S.Stable, I.LetD _) ->
+    assert false
+
+and build_obj at s self_id dfs obj_typ =
+  let fs = build_fields obj_typ in
+  let obj_e = newObjE s fs obj_typ in
+  let ds = decs (List.map (fun df -> df.it.S.dec) dfs) in
+  let e = blockE ds obj_e in
+  match self_id with
+    | None -> e.it
+    | Some self_id ->
+      let self = var self_id.it obj_typ in
+      (letE self e (varE self)).it
+
+and exp_field obj_typ ef =
+  let _, fts = T.as_obj_sub [] obj_typ in
+  let S.{mut; id; exp = e} = ef.it in
+  match mut.it with
+  | S.Var ->
+    let typ = match T.lookup_val_field_opt id.it fts with
+      | Some typ -> typ
+      | None -> T.Mut e.note.S.note_typ
+    in
+    assert (T.is_mut typ);
+    let id' = fresh_var id.it typ in
+    let d = varD id' (exp e) in
+    let f = { it = I.{ name = id.it; var = id_of_var id' }; at = no_region; note = typ } in
+    (d, f)
+  | S.Const ->
+    let typ = match T.lookup_val_field_opt id.it fts with
+      | Some typ -> typ
+      | None -> e.note.S.note_typ
+    in
+    assert (not (T.is_mut typ));
+    let id' = fresh_var id.it typ in
+    let d = letD id' (exp e) in
+    let f = { it = I.{ name = id.it; var = id_of_var id' }; at = no_region; note = typ } in
+    (d, f)
+
+and obj obj_typ efs bases =
+  let open List in
+  let base_info base =
+    let base_exp, base_t = exp base, (typ_note base.note).Note.typ in
+    let base_var = fresh_var "base" base_t in
+    let base_dec = letD base_var base_exp in
+    let pick l =
+      if exists (fun { T.lab; _ } -> lab = l) T.(promote base_t |> as_obj |> snd)
+      then [base_var] else [] in
+    base_dec, pick in
+
+  let base_decs, pickers = map base_info bases |> split in
+  let gap T.{ lab; typ; _ } = match typ with
+    | T.Typ _ -> []
+    | _ ->
+      if exists (fun (ef : S.exp_field) -> ef.it.id.it = lab) efs then []
+      else
+        let id = fresh_var lab typ in
+        let [@warning "-8"] [base_var] = concat_map ((|>) lab) pickers in
+        let d =
+          if T.is_mut typ then
+            refD id { it = I.DotLE(varE base_var, lab); note = typ; at = no_region }
+          else
+            letD id (dotE (varE base_var) lab typ) in
+        let f = { it = I.{ name = lab; var = id_of_var id }; at = no_region; note = typ } in
+        [d, f] in
+
+  let ds, fs = map (exp_field obj_typ) efs |> split in
+  let ds', fs' = concat_map gap (T.as_obj obj_typ |> snd) |> split in
+  let obj_e = newObjE T.Object (append fs fs') obj_typ in
+  I.BlockE(append base_decs (append ds ds'), obj_e)
+
+and typ_binds tbs = List.map typ_bind tbs
+
+and typ_bind tb =
+  let c = match tb.note with
+    | Some c -> c
+    | _ -> assert false
+  in
+  { it = { Ir.con = c; Ir.sort = tb.it.S.sort.it; Ir.bound = tb.it.S.bound.note}
+  ; at = tb.at
+  ; note = ()
+  }
+
+and array_dotE array_ty proj e =
+  let fun_ty bs t1 t2 = T.Func (T.Local, T.Returns, bs, t1, t2) in
+  let varA = T.Var ("A", 0) in
+  let element_ty = T.as_immut (T.as_array array_ty) in
+  let call name t1 t2 =
+    let poly_array_ty =
+      if T.is_mut (T.as_array array_ty)
+      then T.Array (T.Mut varA)
+      else T.Array varA in
+    let ty_param = {T.var = "A"; sort = T.Type; T.bound = T.Any} in
+    let f = var name (fun_ty [ty_param] [poly_array_ty] [fun_ty [] t1 t2]) in
+    callE (varE f) [element_ty] e in
+  match T.is_mut (T.as_array array_ty), proj with
+    | true,  "size" -> call "@mut_array_size"   [] [T.nat]
+    | false, "size" -> call "@immut_array_size" [] [T.nat]
+    | true,  "get"  -> call "@mut_array_get"    [T.nat] [varA]
+    | false, "get"  -> call "@immut_array_get"  [T.nat] [varA]
+    | true,  "put"  -> call "@mut_array_put"    [T.nat; varA] []
+    | true,  "keys" -> call "@mut_array_keys"   [] [T.iter_obj T.nat]
+    | false, "keys" -> call "@immut_array_keys" [] [T.iter_obj T.nat]
+    | true,  "vals" -> call "@mut_array_vals"   [] [T.iter_obj varA]
+    | false, "vals" -> call "@immut_array_vals" [] [T.iter_obj varA]
+    | _, _ -> assert false
+
+and blob_dotE proj e =
+  let fun_ty t1 t2 = T.Func (T.Local, T.Returns, [], t1, t2) in
+  let call name t1 t2 =
+    let f = var name (fun_ty [T.blob] [fun_ty t1 t2]) in
+    callE (varE f) [] e in
+  match proj with
+    | "size"   -> call "@blob_size"   [] [T.nat]
+    | "vals" -> call "@blob_vals" [] [T.iter_obj T.(Prim Nat8)]
+    |  _ -> assert false
+
+and text_dotE proj e =
+  let fun_ty t1 t2 = T.Func (T.Local, T.Returns, [], t1, t2) in
+  let call name t1 t2 =
+    let f = var name (fun_ty [T.text] [fun_ty t1 t2]) in
+    callE (varE f) [] e in
+  match proj with
+    | "size"   -> call "@text_size"   [] [T.nat]
+    | "chars" -> call "@text_chars" [] [T.iter_obj T.char]
+    |  _ -> assert false
+
+and block force_unit ds =
+  match ds with
+  | [] -> ([], tupE [])
+  | [{it = S.ExpD ({it = S.BlockE ds; _}); _}] -> block force_unit ds
+  | _ ->
+  let prefix, last = Lib.List.split_last ds in
+  match force_unit, last.it with
+  | _, S.ExpD e ->
+    (decs prefix, exp e)
+  | false, S.LetD ({it = S.VarP x; _}, e, _) -> (* Fail block dead, pattern match irrefutable *)
+    (decs ds, varE (var x.it e.note.S.note_typ))
+  | false, S.LetD (p, e, None) ->
+    let x = fresh_var "x" (e.note.S.note_typ) in
+    (decs prefix @ [letD x (exp e); letP (pat p) (varE x)], varE x)
+  | false, S.LetD (p, e, Some f) ->
+    (decs prefix, let_else_switch (pat p) (exp e) (exp f))
+  | _, _ ->
+    (decs ds, tupE [])
+
+and is_not_typD d = match d.it with | S.TypD _ -> false | _ -> true
+
+and decs ds =
+  List.map dec (List.filter is_not_typD ds)
+
+and dec d = { (phrase' dec' d) with note = () }
+
+and dec' at n = function
+  | S.ExpD e -> (expD (exp e)).it
+  | S.LetD (p, e, f) ->
+    let p' = pat p in
+    let e' = exp e in
+    (* HACK: remove this once backend supports recursive actors *)
+    begin match p'.it, e'.it, f with
+    | I.VarP i, I.ActorE (ds, fs, u, t), _ ->
+      I.LetD (p', {e' with it = I.ActorE (with_self i t ds, fs, u, t)})
+    | _, _, None -> I.LetD (p', e')
+    | _, _, Some f -> I.LetD (p', let_else_switch (pat p) (exp e) (exp f))
+    end
+  | S.VarD (i, e) -> I.VarD (i.it, e.note.S.note_typ, exp e)
+  | S.TypD _ -> assert false
+  | S.ClassD (sp, id, tbs, p, _t_opt, s, self_id, dfs) ->
+    let id' = {id with note = ()} in
+    let sort, _, _, _, _ = Type.as_func n.S.note_typ in
+    let op = match sp.it with
+      | T.Local -> None
+      | T.Shared (_, p) -> Some p in
+    let inst = List.map
+                 (fun tb ->
+                   match tb.note with
+                   | None -> assert false
+                   | Some c -> T.Con (c, []))
+                 tbs in
+    let fun_typ = n.S.note_typ in
+    let rng_typ =
+      match fun_typ with
+      | T.Func(_, _, bds, dom, [rng]) ->
+        assert(List.length inst = List.length bds);
+        T.promote (T.open_ inst rng)
+      | _ -> assert false
+    in
+    let varPat = {it = I.VarP id'.it; at = at; note = fun_typ } in
+    let args, wrap, control, _n_res = to_args n.S.note_typ op p in
+    let body = if s.it = T.Actor
+      then
+        let (_, _, obj_typ) = T.as_async rng_typ in
+        let c = Cons.fresh T.default_scope_var (T.Abs ([], T.scope_bound)) in
+        asyncE T.Fut (typ_arg c T.Scope T.scope_bound) (* TBR *)
+          (wrap { it = obj_block at s (Some self_id) dfs (T.promote obj_typ);
+            at = at;
+            note = Note.{def with typ = obj_typ } })
+          (List.hd inst)
+      else
+       wrap
+        { it = obj_block at s (Some self_id) dfs rng_typ;
+          at = at;
+          note = Note.{ def with typ = rng_typ } }
+    in
+    let fn = {
+      it = I.FuncE (id.it, sort, control, typ_binds tbs, args, [rng_typ], body);
+      at = at;
+      note = Note.{ def with typ = fun_typ }
+    } in
+    I.LetD (varPat, fn)
+
+and cases cs = List.map case cs
+
+and case c = phrase case' c
+
+and case' c = S.{ I.pat = pat c.pat; I.exp = exp c.exp }
+
+and pats ps = List.map pat ps
+
+and pat p = phrase pat' p
+
+and pat' = function
+  | S.VarP v -> I.VarP v.it
+  | S.WildP -> I.WildP
+  | S.LitP l -> I.LitP (lit !l)
+  | S.SignP (o, l) -> I.LitP (lit (apply_sign o (!l)))
+  | S.TupP ps -> I.TupP (pats ps)
+  | S.ObjP pfs ->
+    I.ObjP (pat_fields pfs)
+  | S.OptP p -> I.OptP (pat p)
+  | S.TagP (i, p) -> I.TagP (i.it, pat p)
+  | S.AltP (p1, p2) -> I.AltP (pat p1, pat p2)
+  | S.AnnotP (p, _)
+  | S.ParP p -> pat' p.it
+
+and lit = function
+  | S.NullLit -> I.NullLit
+  | S.BoolLit x -> I.BoolLit x
+  | S.NatLit x -> I.NatLit x
+  | S.Nat8Lit x -> I.Nat8Lit x
+  | S.Nat16Lit x -> I.Nat16Lit x
+  | S.Nat32Lit x -> I.Nat32Lit x
+  | S.Nat64Lit x -> I.Nat64Lit x
+  | S.IntLit x -> I.IntLit x
+  | S.Int8Lit x -> I.Int8Lit x
+  | S.Int16Lit x -> I.Int16Lit x
+  | S.Int32Lit x -> I.Int32Lit x
+  | S.Int64Lit x -> I.Int64Lit x
+  | S.FloatLit x -> I.FloatLit x
+  | S.CharLit x -> I.CharLit x
+  | S.TextLit x -> I.TextLit x
+  | S.BlobLit x -> I.BlobLit x
+  | S.PreLit _ -> assert false
+
+and pat_fields pfs = List.map pat_field pfs
+
+and pat_field pf = phrase (fun S.{id; pat=p} -> I.{name=id.it; pat=pat p}) pf
+
+and to_args typ po p : Ir.arg list * (Ir.exp -> Ir.exp) * T.control * T.typ list =
+
+  let mergeE ds e =
+    match e.it with
+    | Ir.ActorE _ ->
+      (match Rename.exp' Rename.Renaming.empty e.it with
+       |  Ir.ActorE (ds', fs, up, ot) ->
+         { e with it = Ir.ActorE (ds @ ds', fs, up, ot) }
+       | _ -> assert false)
+    | _ -> blockE ds e
+  in
+
+  let sort, control, n_args, res_tys =
+    match typ with
+    | Type.Func (sort, control, tbds, dom, res) ->
+      sort, control, List.length dom, res
+    | Type.Non ->
+      Type.Local, Type.Returns, 1, []
+    | _ -> raise (Invalid_argument ("to_args " ^ Type.string_of_typ typ))
+  in
+
+  let tys = if n_args = 1 then [p.note] else T.seq_of_tup p.note in
+
+  let rec pat_unannot p = match p.it with
+    | S.AnnotP (p, _) -> pat_unannot p
+    | S.ParP p -> pat_unannot p
+    | _ -> p
+  in
+
+  (* In source, the context pattern is outside the argument pattern,
+  but in the IR, parameters are bound first. So if there is a context pattern,
+  we _must_ create fresh names for the parameters and bind the actual parameters
+  inside the wrapper. *)
+  let must_wrap = po <> None in
+
+  let to_arg p : (Ir.arg * (Ir.exp -> Ir.exp)) =
+    match (pat_unannot p).it with
+    | S.AnnotP _ | S.ParP _ -> assert false
+    | S.VarP i when not must_wrap ->
+      { i with note = p.note },
+      (fun e -> e)
+    | S.WildP ->
+      let v = fresh_var "param" p.note in
+      arg_of_var v,
+      (fun e -> e)
+    |  _ ->
+      let v = fresh_var "param" p.note in
+      arg_of_var v,
+      (fun e -> mergeE [letP (pat p) (varE v)] e)
+  in
+
+  let args, wrap =
+    match n_args, (pat_unannot p).it with
+    | _, (S.AnnotP _ | S.ParP _) -> assert false
+    | _, S.WildP ->
+      let vs = fresh_vars "ignored" tys in
+      List.map arg_of_var vs,
+      (fun e -> e)
+    | 1, _ ->
+      let a, wrap = to_arg p in
+      [a], wrap
+    | 0, S.TupP [] ->
+      [] , (fun e -> e)
+    | _, S.TupP ps ->
+      assert (List.length ps = n_args);
+      List.fold_right (fun p (args, wrap) ->
+        let (a, wrap1) = to_arg p in
+        (a::args, fun e -> wrap1 (wrap e))
+      ) ps ([], fun e -> e)
+    | _, _ ->
+      let vs = fresh_vars "param" tys in
+      List.map arg_of_var vs,
+      (fun e -> mergeE [letP (pat p) (tupE (List.map varE vs))] e)
+  in
+
+  let wrap_po e =
+    match po with
+    | None -> wrap e
+    | Some p ->
+      let v = fresh_var "caller" T.caller in
+      mergeE
+        [letD v (primE I.ICCallerPrim []);
+         letP (pat p)
+           (newObjE T.Object
+              [{ it = Ir.{name = "caller"; var = id_of_var v};
+                 at = no_region;
+                 note = T.caller }]
+              T.ctxt)]
+        (wrap e)
+  in
+
+  let wrap_under_async e =
+    if T.is_shared_sort sort
+    then match control, e.it with
+      | (T.Promises, Ir.AsyncE (s, tb, e', t)) ->
+        { e with it = Ir.AsyncE (s, tb, wrap_po e', t) }
+      | T.Returns, Ir.BlockE (
+          [{ it = Ir.LetD ({ it = Ir.WildP; _} as pat, ({ it = Ir.AsyncE (T.Fut, tb,e',t); _} as exp)); _ }],
+          ({ it = Ir.PrimE (Ir.TupPrim, []); _} as unit)) ->
+        blockE [letP pat {exp with it = Ir.AsyncE (T.Fut, tb,wrap_po e',t)} ] unit
+      | _, Ir.ActorE _ -> wrap_po e
+      | _ -> assert false
+    else
+      wrap_po e
+  in
+  args, wrap_under_async, control, res_tys
+
+type import_declaration = Ir.dec list
+
+let actor_class_mod_exp id class_typ default system =
+  let class_con = Cons.fresh id (T.Def([], class_typ)) in
+  (objE T.Module
+     [(id, class_con)]
+     [(id, default);
+      ("system", objE T.Module [] [(id, system)])])
+
+let import_compiled_class (lib : S.comp_unit) wasm : import_declaration =
+  let f = lib.note.filename in
+  let { body; _ } = lib.it in
+  let id = match body.it with
+    | S.ActorClassU (_, id, _, _, _, _, _) -> id.it
+    | _ -> assert false
+  in
+  let fun_typ = T.normalize body.note.S.note_typ in
+  let s, cntrl, tbs, ts1, ts2 = T.as_func fun_typ in
+  let cs = T.open_binds tbs in
+  let c, _ = T.as_con (List.hd cs) in
+  let ts1' = List.map (T.open_ cs) ts1 in
+  let ts2' = List.map (T.open_ cs) ts2 in
+  let class_typ = match List.map T.normalize ts2' with
+    | [T.Async (_, _, class_typ)] -> class_typ
+    | _ -> assert false
+  in
+  let t_async = T.codom cntrl (fun () -> assert false) ts2' in
+  let _, _, t_actor = T.as_async (T.normalize t_async) in
+  let cs' = T.open_binds tbs in
+  let c', _ = T.as_con (List.hd cs') in
+  let install_actor_helper = var "@install_actor_helper"
+    T.(Func (Local, Returns, [scope_bind],
+      [install_arg_typ; blob; blob],
+      [Async(Cmp, Var (default_scope_var, 0), principal)]))
+  in
+  let wasm_blob = fresh_var "wasm_blob" T.blob in
+  let install_arg =
+    fresh_var "install_arg" T.install_arg_typ  in
+  let system_body install_arg =
+    let vs = fresh_vars "param" ts1' in
+    let principal = fresh_var "principal" T.principal in
+    funcE id T.Local T.Returns
+    [typ_arg c T.Scope T.scope_bound]
+    (List.map arg_of_var vs)
+    ts2'
+    (asyncE T.Fut
+      (typ_arg c' T.Scope T.scope_bound)
+      (letE principal
+        (awaitE T.Cmp
+          (callE (varE install_actor_helper) cs'
+            (tupE [
+              install_arg;
+              varE wasm_blob;
+              primE (Ir.SerializePrim ts1') [seqE (List.map varE vs)]])))
+        (primE (Ir.CastPrim (T.principal, t_actor)) [varE principal]))
+      (List.hd cs))
+  in
+  let system = install_arg --> (system_body (varE install_arg)) in
+  let default =
+    system_body (tagE "new" (recordE ["settings", nullE()]))
+  in
+  let mod_exp = actor_class_mod_exp id class_typ default system in
+  let mod_typ = mod_exp.note.Note.typ in
+  [ letD wasm_blob (blobE wasm);
+    letD (var (id_of_full_path f) mod_typ) mod_exp ]
+
+let import_prelude prelude : import_declaration =
+  decs prelude.it
+
+let inject_decs extra_ds u =
+  let open Ir in
+  match u with
+  | LibU (ds, exp) -> LibU (extra_ds @ ds, exp)
+  | ProgU ds -> ProgU (extra_ds @ ds)
+  | ActorU (None, ds, fs, up, t) ->
+    Ir.ActorU (None, extra_ds @ ds, fs, up, t)
+  | ActorU (Some _, _, _, _, _) ->
+    let u'= Rename.comp_unit Rename.Renaming.empty u in
+    match u' with
+    | ActorU (as_opt, ds, fs, up, t) ->
+      Ir.ActorU (as_opt, extra_ds @ ds, fs, up, t)
+    | _ -> assert false
+
+let link_declarations imports (cu, flavor) =
+  inject_decs imports cu, flavor
+
+let transform_import (i : S.import) : import_declaration =
+  let (p, f, ir) = i.it in
+  let t = i.note in
+  assert (t <> T.Pre);
+  let rhs = match !ir with
+    | S.Unresolved -> raise (Invalid_argument ("Unresolved import " ^ f))
+    | S.LibPath fp ->
+      varE (var (id_of_full_path fp) t)
+    | S.PrimPath ->
+      varE (var (id_of_full_path "@prim") t)
+    | S.IDLPath (fp, canister_id) ->
+      primE (I.ActorOfIdBlob t) [blobE canister_id]
+  in [ letP (pat p) rhs ]
+
+let transform_unit_body (u : S.comp_unit_body) : Ir.comp_unit =
+  match u.it with
+  | S.ProgU ds -> I.ProgU (decs ds)
+  | S.ModuleU (self_id, fields) -> (* compiling a module as a library *)
+    I.LibU ([], {
+      it = build_obj u.at T.Module self_id fields u.note.S.note_typ;
+      at = u.at; note = typ_note u.note})
+  | S.ActorClassU (sp, typ_id, _tbs, p, _, self_id, fields) ->
+    let fun_typ = u.note.S.note_typ in
+    let op = match sp.it with
+      | T.Local -> None
+      | T.Shared (_, p) -> Some p in
+    let args, wrap, control, _n_res = to_args fun_typ op p in
+    let (ts, obj_typ) =
+      match fun_typ with
+      | T.Func(_s, _c, bds, ts1, [async_rng]) ->
+        assert(1 = List.length bds);
+        let cs  = T.open_binds bds in
+        let (_, _, rng) = T.as_async (T.normalize (T.open_ cs async_rng)) in
+        List.map (T.open_ cs) ts1,
+        T.promote rng
+      | _ -> assert false
+    in
+    let e = wrap {
+       it = build_actor u.at ts (Some self_id) fields obj_typ;
+       at = no_region;
+       note = Note.{ def with typ = obj_typ } }
+    in
+    begin match e.it with
+    | I.ActorE(ds, fs, u, t) -> I.ActorU (Some args, ds, fs, u, t)
+    | _ -> assert false
+    end
+  | S.ActorU (self_id, fields) ->
+    begin match build_actor u.at [] self_id fields u.note.S.note_typ with
+    | I.ActorE (ds, fs, u, t) -> I.ActorU (None, ds, fs, u, t)
+    | _ -> assert false
+    end
+
+let transform_unit (u : S.comp_unit) : Ir.prog  =
+  let { imports; body; _ } = u.it in
+  let imports' = List.concat_map transform_import imports in
+  let body' = transform_unit_body body in
+  inject_decs imports' body', Ir.full_flavor()
+
+
+(* Import a unit by composing IR.
+
+   When used for IR interpretation only, this includes
+   any class that would have been separately handled by
+   import_compiled_class (above) for compilation.
+*)
+let import_unit (u : S.comp_unit) : import_declaration =
+  let { imports; body; _ } = u.it in
+  let f = u.note.filename in
+  let t = body.note.S.note_typ in
+  assert (t <> T.Pre);
+  let imports' = List.concat_map transform_import imports in
+  let body' = transform_unit_body body in
+  let prog = inject_decs imports' body' in
+  match prog with
+  | I.LibU (ds, e) ->
+    let exp = blockE ds e in
+    [ letD (var (id_of_full_path f) exp.note.Note.typ) exp ]
+  | I.ActorU (None, ds, fs, up, t) ->
+    raise (Invalid_argument "Desugar: Cannot import actor")
+  | I.ActorU (Some as_, ds, fs, up, actor_t) ->
+    let id = match body.it with
+      | S.ActorClassU (_, id, _, _, _, _, _) -> id.it
+      | _ -> assert false
+    in
+    let s, cntrl, tbs, ts1, ts2 = T.as_func t in
+    let cs = T.open_binds [T.scope_bind] in
+    let c, _ = T.as_con (List.hd cs) in
+    let cs' = T.open_binds [T.scope_bind] in
+    let c', _ = T.as_con (List.hd cs') in
+    let class_typ = match List.map T.normalize ts2 with
+      | [ T.Async(_, _, t2) ] -> t2
+      | _ -> assert false in
+    let install_arg =
+      fresh_var "install_arg" T.install_arg_typ
+    in
+    let system_body install_arg =
+      funcE id T.Local T.Returns
+        [typ_arg c T.Scope T.scope_bound]
+        as_
+        [T.Async (T.Fut, List.hd cs, actor_t)]
+        (asyncE
+          T.Fut
+          (typ_arg c' T.Scope T.scope_bound)
+          (ifE
+            (primE (Ir.RelPrim (T.install_arg_typ, Operator.EqOp))
+              [ install_arg;
+                tagE "new" (recordE ["settings", nullE()]) ])
+             { it = I.ActorE (ds, fs, up, actor_t); at = u.at; note = Note.{ def with typ = actor_t } }
+             (primE (Ir.OtherPrim "trap")
+               [textE "actor class configuration not supported in interpreter"]))
+          (List.hd cs))
+    in
+    let system = install_arg --> (system_body (varE install_arg)) in
+    let system_var = fresh_var "system" system.note.Note.typ in
+    let default = (varE system_var) -*- (tagE "new" (recordE ["settings", nullE()])) in
+    let mod_exp = actor_class_mod_exp id class_typ default (varE system_var) in
+    let mod_typ = mod_exp.note.Note.typ in
+    [ letD system_var system;
+      letD (var (id_of_full_path f) mod_typ) mod_exp ]
+  | I.ProgU ds ->
+    raise (Invalid_argument "Desugar: Cannot import program")
+
+
+
+ + + diff --git a/coverage/mo_config/args.ml.html b/coverage/mo_config/args.ml.html new file mode 100644 index 00000000000..57a6a9d1204 --- /dev/null +++ b/coverage/mo_config/args.ml.html @@ -0,0 +1,150 @@ + + + + + args.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
+
(* This module contains some argument parsing that is common between
+multiple executables *)
+
+let string_map flag r desc =
+  let key_ref = ref "DEADBEEF" in
+  flag,
+  Arg.Tuple [
+    Arg.Set_string key_ref ;
+    Arg.String (fun value ->
+      let key = !key_ref in
+      if Flags.M.mem key !r
+      then (Printf.eprintf "duplicate %s %s" flag key ; exit 1)
+      else r := Flags.M.add key value !r
+    )
+  ],
+  desc
+
+(* Everything related to imports, packages, aliases *)
+let package_args = [
+  string_map "--package" Flags.package_urls "<package-name> <package-path> specify a <package-name> <package-path> pair, separated by a space";
+  "--actor-idl", Arg.String (fun fp -> Flags.actor_idl_path := Some fp), "<idl-path>   path to actor IDL (Candid) files";
+  string_map "--actor-alias" Flags.actor_aliases "<alias> <principal>  actor import alias"
+  ]
+
+let error_args = [
+  "--error-detail", Arg.Set_int Flags.error_detail, "<n>  set error message detail for syntax errors, n in [0..3] (default 2)"
+  (* TODO move --hide-warnings here? *)
+  ]
+
+let inclusion_args = [
+    (* generic arg inclusion from file *)
+  "--args", Arg.Expand Arg.read_arg,
+    "<file>  read additional newline separated command line arguments \n\
+    \      from <file>";
+  "--args0", Arg.Expand Arg.read_arg0,
+    "<file>  read additional NUL separated command line arguments from \n\
+    \      <file>"
+  ]
+
+
+
+ + + diff --git a/coverage/mo_config/flags.ml.html b/coverage/mo_config/flags.ml.html new file mode 100644 index 00000000000..77260a20475 --- /dev/null +++ b/coverage/mo_config/flags.ml.html @@ -0,0 +1,182 @@ + + + + + flags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+
+
(* common flags for the moc compiler *)
+
+module M = Map.Make(String)
+
+type compile_mode = WasmMode | ICMode | RefMode | WASIMode
+
+type gc_strategy = MarkCompact | Copying | Generational | Incremental
+
+let trace = ref false
+let verbose = ref false
+let print_warnings = ref true
+let warnings_are_errors = ref false
+let print_depth = ref 2
+let release_mode = ref false
+let compile_mode = ref ICMode
+let debug_info = ref false
+let multi_value = ref false
+let await_lowering = ref true
+let async_lowering = ref true
+let dump_parse = ref false
+let dump_tc = ref false
+let dump_lowering = ref false
+let check_ir = ref true
+let package_urls : string M.t ref = ref M.empty
+let actor_aliases : string M.t ref = ref M.empty
+let actor_idl_path : string option ref = ref None
+let max_stable_pages_default = 65536
+let max_stable_pages : int ref = ref max_stable_pages_default
+let measure_rts_stack = ref false
+let pre_ref : string option ref = ref None
+let post_ref : string option ref = ref None
+let profile = ref false
+let profile_verbose = ref false
+let profile_file = ref "profiling-counters.csv"
+let profile_line_prefix = ref ""
+let profile_field_names : string list ref = ref []
+let public_metadata_names : string list ref = ref []
+let omit_metadata_names : string list ref = ref []
+let compiled = ref false
+let error_detail = ref 2
+let sanity = ref false
+let gc_strategy = ref Copying
+let force_gc = ref false
+let global_timer = ref true
+let experimental_field_aliasing = ref false
+let ocaml_js = ref false
+let rts_stack_pages_default = 32 (* 2MB *)
+let rts_stack_pages : int ref = ref rts_stack_pages_default
+let trap_on_call_error = ref false
+
+
+
+ + + diff --git a/coverage/mo_config/internal_error.ml.html b/coverage/mo_config/internal_error.ml.html new file mode 100644 index 00000000000..968c25fdf6c --- /dev/null +++ b/coverage/mo_config/internal_error.ml.html @@ -0,0 +1,65 @@ + + + + + internal_error.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+
+

+let setup_handler () =
+  let open Printexc in
+  record_backtrace true;
+  set_uncaught_exception_handler (fun exn rb ->
+    Printf.eprintf "OOPS! You've triggered a compiler bug.\n";
+    Printf.eprintf "Please report this at https://github.com/dfinity/motoko/issues/new with the following details:\n\nMotoko %s\n\n" Source_id.banner;
+    default_uncaught_exception_handler exn rb
+  );
+
+
+
+ + + diff --git a/coverage/mo_def/arrange.ml.html b/coverage/mo_def/arrange.ml.html new file mode 100644 index 00000000000..035744e57b3 --- /dev/null +++ b/coverage/mo_def/arrange.ml.html @@ -0,0 +1,1050 @@ + + + + + arrange.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+
+
open Mo_types
+open Mo_values
+
+open Source
+open Syntax
+open Wasm.Sexpr
+
+module type Config = sig
+  val include_sources : bool
+  val include_types : bool
+  val include_docs : Trivia.trivia_info Trivia.PosHashtbl.t option
+  val main_file : string option
+end
+
+module Default = struct
+  let include_sources = false
+  let include_types = false
+  let include_docs = None
+  let main_file = None
+end
+
+module Type_pretty = Mo_types.Type.MakePretty (Mo_types.Type.ElideStamps)
+
+
+module Make (Cfg : Config) = struct
+  let ($$) head inner = Node (head, inner)
+
+  let pos p =
+    let file = match Cfg.main_file with
+    | Some f when f <> p.file -> p.file
+    | _ -> ""
+    in "Pos" $$ [Atom file; Atom (string_of_int p.line); Atom (string_of_int p.column)]
+  let source at it = if Cfg.include_sources && at <> Source.no_region then "@" $$ [pos at.left; pos at.right; it] else it
+
+  let typ t = Atom (Type_pretty.string_of_typ t)
+
+  let trivia at it =
+    match Cfg.include_docs with
+    | Some table ->
+      let rec lookup_trivia (line, column) =
+        Trivia.PosHashtbl.find_opt table Trivia.{ line; column }
+      and find_trivia (parser_pos : Source.region) : Trivia.trivia_info =
+        lookup_trivia Source.(parser_pos.left.line, parser_pos.left.column) |> Option.get
+      in
+      (match Trivia.doc_comment_of_trivia_info (find_trivia at) with
+      | Some s -> "*" $$ [Atom s; it]
+      | None -> it)
+    | None -> it
+
+  let eff (eff : Mo_types.Type.eff) = match eff with
+  | Mo_types.Type.Triv -> Atom "Triv"
+  | Mo_types.Type.Await -> Atom "Await"
+
+  let annot_typ t it = if Cfg.include_types then ":" $$ [it; typ t] else it
+  let annot note = annot_typ note.note_typ
+
+  let id i = Atom i.it
+  let tag i = Atom ("#" ^ i.it)
+
+  let rec exp e = source e.at (annot e.note (match e.it with
+    | VarE x              -> "VarE"      $$ [id x]
+    | LitE l              -> "LitE"      $$ [lit !l]
+    | ActorUrlE e         -> "ActorUrlE" $$ [exp e]
+    | UnE (ot, uo, e)     -> "UnE"       $$ [operator_type !ot; Arrange_ops.unop uo; exp e]
+    | BinE (ot, e1, bo, e2) -> "BinE"    $$ [operator_type !ot; exp e1; Arrange_ops.binop bo; exp e2]
+    | RelE (ot, e1, ro, e2) -> "RelE"    $$ [operator_type !ot; exp e1; Arrange_ops.relop ro; exp e2]
+    | ShowE (ot, e)       -> "ShowE"     $$ [operator_type !ot; exp e]
+    | ToCandidE es        -> "ToCandidE"   $$ exps es
+    | FromCandidE e       -> "FromCandidE" $$ [exp e]
+    | TupE es             -> "TupE"      $$ exps es
+    | ProjE (e, i)        -> "ProjE"     $$ [exp e; Atom (string_of_int i)]
+    | ObjBlockE (s, dfs)  -> "ObjBlockE" $$ [obj_sort s] @ List.map dec_field dfs
+    | ObjE ([], efs)      -> "ObjE"      $$ List.map exp_field efs
+    | ObjE (bases, efs)   -> "ObjE"      $$ exps bases @ [Atom "with"] @ List.map exp_field efs
+    | DotE (e, x)         -> "DotE"      $$ [exp e; id x]
+    | AssignE (e1, e2)    -> "AssignE"   $$ [exp e1; exp e2]
+    | ArrayE (m, es)      -> "ArrayE"    $$ [mut m] @ exps es
+    | IdxE (e1, e2)       -> "IdxE"      $$ [exp e1; exp e2]
+    | FuncE (x, sp, tp, p, t, sugar, e') ->
+      "FuncE" $$ [
+        Atom (Type.string_of_typ e.note.note_typ);
+        shared_pat sp;
+        Atom x] @
+        List.map typ_bind tp @ [
+        pat p;
+        (match t with None -> Atom "_" | Some t -> typ t);
+        Atom (if sugar then "" else "=");
+        exp e'
+      ]
+    | CallE (e1, ts, e2)  -> "CallE"   $$ [exp e1] @ inst ts @ [exp e2]
+    | BlockE ds           -> "BlockE"  $$ List.map dec ds
+    | NotE e              -> "NotE"    $$ [exp e]
+    | AndE (e1, e2)       -> "AndE"    $$ [exp e1; exp e2]
+    | OrE (e1, e2)        -> "OrE"     $$ [exp e1; exp e2]
+    | ImpliesE (e1, e2)   -> "ImpliesE"$$ [exp e1; exp e2]
+    | OldE e              -> "OldE"    $$ [exp e]
+    | IfE (e1, e2, e3)    -> "IfE"     $$ [exp e1; exp e2; exp e3]
+    | SwitchE (e, cs)     -> "SwitchE" $$ [exp e] @ List.map case cs
+    | WhileE (e1, e2)     -> "WhileE"  $$ [exp e1; exp e2]
+    | LoopE (e1, None)    -> "LoopE"   $$ [exp e1]
+    | LoopE (e1, Some e2) -> "LoopE"   $$ [exp e1; exp e2]
+    | ForE (p, e1, e2)    -> "ForE"    $$ [pat p; exp e1; exp e2]
+    | LabelE (i, t, e)    -> "LabelE"  $$ [id i; typ t; exp e]
+    | DebugE e            -> "DebugE"  $$ [exp e]
+    | BreakE (i, e)       -> "BreakE"  $$ [id i; exp e]
+    | RetE e              -> "RetE"    $$ [exp e]
+    | AsyncE (Type.Fut, tb, e) -> "AsyncE"  $$ [typ_bind tb; exp e]
+    | AsyncE (Type.Cmp, tb, e) -> "AsyncE*" $$ [typ_bind tb; exp e]
+    | AwaitE (Type.Fut, e)     -> "AwaitE"  $$ [exp e]
+    | AwaitE (Type.Cmp, e)     -> "AwaitE*" $$ [exp e]
+    | AssertE (Runtime, e)       -> "AssertE" $$ [exp e]
+    | AssertE (Static, e)        -> "Static_AssertE" $$ [exp e]
+    | AssertE (Invariant, e)     -> "Invariant" $$ [exp e]
+    | AssertE (Precondition, e)  -> "Precondition" $$ [exp e]
+    | AssertE (Postcondition, e) -> "Postcondition" $$ [exp e]
+    | AssertE (Loop_entry, e)    -> "Loop_entry" $$ [exp e]
+    | AssertE (Loop_continue, e) -> "Loop_continue" $$ [exp e]
+    | AssertE (Loop_exit, e)     -> "Loop_exit" $$ [exp e]
+    | AssertE (Concurrency s, e) -> "Concurrency"^s $$ [exp e]
+    | AnnotE (e, t)       -> "AnnotE"  $$ [exp e; typ t]
+    | OptE e              -> "OptE"    $$ [exp e]
+    | DoOptE e            -> "DoOptE"  $$ [exp e]
+    | BangE e             -> "BangE"   $$ [exp e]
+    | TagE (i, e)         -> "TagE"    $$ [id i; exp e]
+    | PrimE p             -> "PrimE"   $$ [Atom p]
+    | ImportE (f, _fp)    -> "ImportE" $$ [Atom f]
+    | ThrowE e            -> "ThrowE"  $$ [exp e]
+    | TryE (e, cs)        -> "TryE"    $$ [exp e] @ List.map catch cs
+    | IgnoreE e           -> "IgnoreE" $$ [exp e]))
+
+  and exps es = List.map exp es
+
+  and inst inst = match inst.it with
+    | None -> []
+    | Some ts -> List.map typ ts
+
+  and pat p = source p.at (annot_typ p.note (match p.it with
+    | WildP           -> Atom "WildP"
+    | VarP x          -> "VarP"       $$ [id x]
+    | TupP ps         -> "TupP"       $$ List.map pat ps
+    | ObjP ps         -> "ObjP"       $$ List.map pat_field ps
+    | AnnotP (p, t)   -> "AnnotP"     $$ [pat p; typ t]
+    | LitP l          -> "LitP"       $$ [lit !l]
+    | SignP (uo, l)   -> "SignP"      $$ [Arrange_ops.unop uo ; lit !l]
+    | OptP p          -> "OptP"       $$ [pat p]
+    | TagP (i, p)     -> "TagP"       $$ [tag i; pat p]
+    | AltP (p1, p2)    -> "AltP"       $$ [pat p1; pat p2]
+    | ParP p          -> "ParP"       $$ [pat p]))
+
+  and lit = function
+    | NullLit       -> Atom "NullLit"
+    | BoolLit true  -> "BoolLit"   $$ [ Atom "true" ]
+    | BoolLit false -> "BoolLit"   $$ [ Atom "false" ]
+    | NatLit n      -> "NatLit"    $$ [ Atom (Numerics.Nat.to_pretty_string n) ]
+    | Nat8Lit n     -> "Nat8Lit"   $$ [ Atom (Numerics.Nat8.to_pretty_string n) ]
+    | Nat16Lit n    -> "Nat16Lit"  $$ [ Atom (Numerics.Nat16.to_pretty_string n) ]
+    | Nat32Lit n    -> "Nat32Lit"  $$ [ Atom (Numerics.Nat32.to_pretty_string n) ]
+    | Nat64Lit n    -> "Nat64Lit"  $$ [ Atom (Numerics.Nat64.to_pretty_string n) ]
+    | IntLit i      -> "IntLit"    $$ [ Atom (Numerics.Int.to_pretty_string i) ]
+    | Int8Lit i     -> "Int8Lit"   $$ [ Atom (Numerics.Int_8.to_pretty_string i) ]
+    | Int16Lit i    -> "Int16Lit"  $$ [ Atom (Numerics.Int_16.to_pretty_string i) ]
+    | Int32Lit i    -> "Int32Lit"  $$ [ Atom (Numerics.Int_32.to_pretty_string i) ]
+    | Int64Lit i    -> "Int64Lit"  $$ [ Atom (Numerics.Int_64.to_pretty_string i) ]
+    | FloatLit f    -> "FloatLit"  $$ [ Atom (Numerics.Float.to_pretty_string f) ]
+    | CharLit c     -> "CharLit"   $$ [ Atom (string_of_int c) ]
+    | TextLit t     -> "TextLit"   $$ [ Atom t ]
+    | BlobLit b     -> "BlobLit"   $$ [ Atom b ]
+    | PreLit (s, p)  -> "PreLit"    $$ [ Atom s; Arrange_type.prim p ]
+
+  and case c = source c.at ("case" $$ [pat c.it.pat; exp c.it.exp])
+
+  and catch c = "catch" $$ [pat c.it.pat; exp c.it.exp]
+
+  and pat_field pf = source pf.at (pf.it.id.it $$ [pat pf.it.pat])
+
+  and obj_sort s = match s.it with
+    | Type.Object -> Atom "Object"
+    | Type.Actor -> Atom "Actor"
+    | Type.Module -> Atom "Module"
+    | Type.Memory -> Atom "Memory"
+
+  and shared_pat sp = match sp.it with
+    | Type.Local -> Atom "Local"
+    | Type.Shared (Type.Write, p) -> "Shared" $$ [pat p]
+    | Type.Shared (Type.Query, p) -> "Query" $$ [pat p]
+    | Type.Shared (Type.Composite, p) -> "Composite" $$ [pat p]
+
+  and func_sort s = match s.it with
+    | Type.Local -> Atom "Local"
+    | Type.Shared Type.Write -> Atom "Shared"
+    | Type.Shared Type.Query -> Atom "Query"
+    | Type.Shared Type.Composite -> Atom "Composite"
+
+  and mut m = match m.it with
+    | Const -> Atom "Const"
+    | Var   -> Atom "Var"
+
+  and vis v = match v.it with
+    | Public None -> Atom "Public"
+    | Public (Some m) -> "Public" $$ [Atom m]
+    | Private -> Atom "Private"
+    | System -> Atom "System"
+
+  and stab s_opt = match s_opt with
+    | None -> Atom "(Flexible)"
+    | Some s ->
+      (match s.it with
+      | Flexible -> Atom "Flexible"
+      | Stable -> Atom "Stable")
+
+  and typ_field (tf : typ_field) = match tf.it with
+    | ValF (id, t, m) -> id.it $$ [typ t; mut m]
+    | TypF (id', tbs, t) ->
+        "TypF" $$ [id id'] @ List.map typ_bind tbs @ [typ t]
+  and typ_item ((id, ty) : typ_item) =
+    match id with
+    | None -> [typ ty]
+    | Some { it;_ } -> [Atom it; typ ty]
+
+  and typ_tag (tt : typ_tag)
+    = source tt.at (tt.it.tag.it $$ [typ tt.it.typ])
+
+  and typ_bind (tb : typ_bind)
+    = source tb.at (tb.it.var.it $$ [typ tb.it.bound])
+
+  and dec_field (df : dec_field)
+    = trivia df.at (source df.at ("DecField" $$ [dec df.it.dec; vis df.it.vis; stab df.it.stab]))
+
+  and exp_field (ef : exp_field)
+    = source ef.at ("ExpField" $$ [mut ef.it.mut; id ef.it.id; exp ef.it.exp])
+
+  and operator_type t = Atom (Type.string_of_typ t)
+
+  and path p = match p.it with
+    | IdH i -> "IdH" $$ [id i]
+    | DotH (p, i) -> "DotH" $$ [path p; id i]
+
+  and typ t = source t.at (annot_typ t.note (match t.it with
+  | PathT (p, ts) -> "PathT" $$ [path p] @ List.map typ ts
+  | PrimT p -> "PrimT" $$ [Atom p]
+  | ObjT (s, ts) -> "ObjT" $$ [obj_sort s] @ List.map typ_field ts
+  | ArrayT (m, t) -> "ArrayT" $$ [mut m; typ t]
+  | OptT t -> "OptT" $$ [typ t]
+  | VariantT cts -> "VariantT" $$ List.map typ_tag cts
+  | TupT ts -> "TupT" $$ List.concat_map typ_item ts
+  | FuncT (s, tbs, at, rt) -> "FuncT" $$ [func_sort s] @ List.map typ_bind tbs @ [ typ at; typ rt]
+  | AsyncT (Type.Fut, t1, t2) -> "AsyncT" $$ [typ t1; typ t2]
+  | AsyncT (Type.Cmp, t1, t2) -> "AsyncT*" $$ [typ t1; typ t2]
+  | AndT (t1, t2) -> "AndT" $$ [typ t1; typ t2]
+  | OrT (t1, t2) -> "OrT" $$ [typ t1; typ t2]
+  | ParT t -> "ParT" $$ [typ t]
+  | NamedT (id, t) -> "NamedT" $$ [Atom id.it; typ t]))
+
+  and dec d = trivia d.at (source d.at (match d.it with
+    | ExpD e -> "ExpD" $$ [exp e]
+    | LetD (p, e, Some f) -> "LetD" $$ [pat p; exp e; exp f]
+    | LetD (p, e, None) -> "LetD" $$ [pat p; exp e]
+    | VarD (x, e) -> "VarD" $$ [id x; exp e]
+    | TypD (x, tp, t) ->
+      "TypD" $$ [id x] @ List.map typ_bind tp @ [typ t]
+    | ClassD (sp, x, tp, p, rt, s, i', dfs) ->
+      "ClassD" $$ shared_pat sp :: id x :: List.map typ_bind tp @ [
+        pat p;
+        (match rt with None -> Atom "_" | Some t -> typ t);
+        obj_sort s; id i'
+      ] @ List.map dec_field dfs))
+
+  and prog p = "Prog" $$ List.map dec p.it
+end
+
+(* Defaults *)
+include Make (Default)
+
+
+
+ + + diff --git a/coverage/mo_def/compUnit.ml.html b/coverage/mo_def/compUnit.ml.html new file mode 100644 index 00000000000..5969efe1480 --- /dev/null +++ b/coverage/mo_def/compUnit.ml.html @@ -0,0 +1,420 @@ + + + + + compUnit.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+
+
open Mo_types
+
+open Syntax
+
+
+(* Compilation unit detection *)
+
+let is_actor_def e =
+  let open Source in
+  match e.it with
+  | AwaitE (Type.Fut, { it = AsyncE (Type.Fut, _, {it = ObjBlockE ({ it = Type.Actor; _}, _fields); _ }) ; _  }) -> true
+  | _ -> false
+
+let as_actor_def e =
+  let open Source in
+  match e.it with
+  | AwaitE (Type.Fut, { it = AsyncE (Type.Fut, _, {it = ObjBlockE ({ it = Type.Actor; _}, fields); note; at }) ; _  }) ->
+    fields, note, at
+  | _ -> assert false
+
+(* Happens after parsing, before type checking *)
+let comp_unit_of_prog as_lib (prog : prog) : comp_unit =
+  let open Source in
+  let f = prog.note in
+
+  let finish imports u =
+    { it = { imports = List.rev imports; body = u }; note = f; at = no_region } in
+  let prog_typ_note = { empty_typ_note with note_typ = Type.unit } in
+
+  let rec go imports ds : comp_unit =
+    match ds with
+    (* imports *)
+    | {it = LetD (p, ({it = ImportE (url, ri); _} as e), None); _} :: ds' ->
+      let i : import = { it = (p, url, ri); note = e.note.note_typ; at = e.at } in
+      go (i :: imports) ds'
+
+    (* terminal expressions *)
+    | [{it = ExpD ({it = ObjBlockE ({it = Type.Module; _}, fields); _} as e); _}] when as_lib ->
+      finish imports { it = ModuleU (None, fields); note = e.note; at = e.at }
+    | [{it = ExpD e; _} ] when is_actor_def e ->
+      let fields, note, at = as_actor_def e in
+      finish imports { it = ActorU (None, fields); note; at }
+    | [{it = ClassD (sp, tid, tbs, p, typ_ann, {it = Type.Actor;_}, self_id, fields); _} as d] ->
+      assert (List.length tbs > 0);
+      finish imports { it = ActorClassU (sp, tid, tbs, p, typ_ann, self_id, fields); note = d.note; at = d.at }
+    (* let-bound terminal expressions *)
+    | [{it = LetD ({it = VarP i1; _}, ({it = ObjBlockE ({it = Type.Module; _}, fields); _} as e), _); _}] when as_lib ->
+      finish imports { it = ModuleU (Some i1, fields); note = e.note; at = e.at }
+    | [{it = LetD ({it = VarP i1; _}, e, _); _}] when is_actor_def e ->
+      let fields, note, at = as_actor_def e in
+      finish imports { it = ActorU (Some i1, fields); note; at }
+
+    (* Everything else is a program *)
+    | ds' ->
+      if as_lib
+      then
+        (* Deprecated syntax, see Typing.check_lib *)
+        let fs = List.map (fun d -> {vis = Public None @@ no_region; dec = d; stab = None} @@ d.at) ds' in
+        finish imports {it = ModuleU (None, fs); at = no_region; note = empty_typ_note}
+      else finish imports { it = ProgU ds; note = prog_typ_note; at = no_region }
+  in
+  go [] prog.it
+
+
+(* Lib as decs *)
+let obj_decs obj_sort at note id_opt fields =
+  let open Source in
+  match id_opt with
+  | None -> [
+    { it = ExpD {
+        it = ObjBlockE ( { it = obj_sort; at; note = () }, fields);
+        at;
+        note };
+      at; note }]
+  | Some id -> [
+    { it = LetD (
+        { it = VarP id; at; note = note.note_typ },
+        { it = ObjBlockE ({ it = obj_sort; at; note = () }, fields);
+          at; note; },
+        None);
+      at; note
+    };
+    { it = ExpD { it = VarE id; at; note };
+      at; note }
+    ]
+
+(* To enable uniform definedness checking, typechecking and interpretation,
+   present the unit as a list of declarations.
+*)
+let decs_of_lib (cu : comp_unit) =
+  let open Source in
+  let { imports; body = cub; _ } = cu.it in
+  let import_decs = List.map (fun { it = (pat, fp, ri); at; note} ->
+    { it = LetD (
+      pat,
+      { it = ImportE (fp, ri);
+        at;
+        note = { note_typ = note; note_eff = Type.Triv} },
+      None);
+      at;
+      note = { note_typ = note; note_eff = Type.Triv } }) imports
+  in
+  import_decs,
+  match cub.it with
+  | ModuleU (id_opt, fields) ->
+    obj_decs Type.Module cub.at cub.note id_opt fields
+  | ActorClassU (csp, i, tbs, p, t, i', efs) ->
+    [{ it = ClassD (csp, i, tbs, p, t, { it = Type.Actor; at = no_region; note = ()}, i', efs);
+       at = cub.at;
+       note = cub.note;}];
+  | ProgU _
+  | ActorU _ ->
+    assert false
+
+(* a hack to support compiling multiple files *)
+let combine_progs (progs : prog list) : prog =
+  let open Source in
+  if progs = []
+  then
+    { it = [];
+      at = no_region;
+      note = { filename = "empty"; trivia = Trivia.empty_triv_table }
+    }
+  else
+    { it = List.concat_map (fun p -> p.it) progs;
+      at = (Lib.List.last progs).at;
+      note = (Lib.List.last progs).note
+    }
+
+
+
+ + + diff --git a/coverage/mo_def/syntax.ml.html b/coverage/mo_def/syntax.ml.html new file mode 100644 index 00000000000..8a64218f52a --- /dev/null +++ b/coverage/mo_def/syntax.ml.html @@ -0,0 +1,1075 @@ + + + + + syntax.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+
+
open Mo_types
+open Mo_values
+
+open Operator
+
+
+(* Notes *)
+
+type typ_note = {note_typ : Type.typ; note_eff : Type.eff}
+
+let empty_typ_note = {note_typ = Type.Pre; note_eff = Type.Triv}
+
+(* Resolved imports (filled in separately after parsing) *)
+
+type resolved_import =
+  | Unresolved
+  | LibPath of string
+  | IDLPath of (string * string) (* filepath * bytes *)
+  | PrimPath (* the built-in prim module *)
+
+(* Identifiers *)
+
+type id = string Source.phrase
+type typ_id = (string, Type.con option) Source.annotated_phrase
+
+
+(* Types *)
+
+type obj_sort = Type.obj_sort Source.phrase
+type func_sort = Type.func_sort Source.phrase
+
+type mut = mut' Source.phrase
+and mut' = Const | Var
+
+and path = (path', Type.typ) Source.annotated_phrase
+and path' =
+  | IdH  of id
+  | DotH of path * id
+
+and async_sort = Type.async_sort
+
+type typ = (typ', Type.typ) Source.annotated_phrase
+and typ' =
+  | PathT of path * typ list                       (* type path *)
+  | PrimT of string                                (* primitive *)
+  | ObjT of obj_sort * typ_field list              (* object *)
+  | ArrayT of mut * typ                            (* array *)
+  | OptT of typ                                    (* option *)
+  | VariantT of typ_tag list                       (* variant *)
+  | TupT of typ_item list                          (* tuple *)
+  | FuncT of func_sort * typ_bind list * typ * typ (* function *)
+  | AsyncT of async_sort * scope * typ             (* future / computation *)
+  | AndT of typ * typ                              (* intersection *)
+  | OrT of typ * typ                               (* union *)
+  | ParT of typ                                    (* parentheses, used to control function arity only *)
+  | NamedT of id * typ                             (* parenthesized single element named "tuple" *)
+
+and scope = typ
+and typ_field = typ_field' Source.phrase
+and typ_field' =
+  | ValF of id * typ * mut
+  | TypF of typ_id * typ_bind list * typ
+
+and typ_tag = typ_tag' Source.phrase
+and typ_tag' = {tag : id; typ : typ}
+
+and bind_sort = Type.bind_sort Source.phrase
+and typ_bind = (typ_bind', Type.con option) Source.annotated_phrase
+and typ_bind' = {var : id; sort : bind_sort; bound : typ;}
+
+and typ_item = id option * typ
+
+
+(* Literals *)
+
+type lit =
+  | NullLit
+  | BoolLit of bool
+  | NatLit of Numerics.Nat.t
+  | Nat8Lit of Numerics.Nat8.t
+  | Nat16Lit of Numerics.Nat16.t
+  | Nat32Lit of Numerics.Nat32.t
+  | Nat64Lit of Numerics.Nat64.t
+  | IntLit of Numerics.Int.t
+  | Int8Lit of Numerics.Int_8.t
+  | Int16Lit of Numerics.Int_16.t
+  | Int32Lit of Numerics.Int_32.t
+  | Int64Lit of Numerics.Int_64.t
+  | FloatLit of Numerics.Float.t
+  | CharLit of Value.unicode
+  | TextLit of string
+  | BlobLit of string
+  | PreLit of string * Type.prim
+
+
+(* Patterns *)
+
+type pat = (pat', Type.typ) Source.annotated_phrase
+and pat' =
+  | WildP                                      (* wildcard *)
+  | VarP of id                                 (* variable *)
+  | LitP of lit ref                            (* literal *)
+  | SignP of unop * lit ref                    (* signed literal *)
+  | TupP of pat list                           (* tuple *)
+  | ObjP of pat_field list                     (* object *)
+  | OptP of pat                                (* option *)
+  | TagP of id * pat                           (* tagged variant *)
+  | AltP of pat * pat                          (* disjunctive *)
+  | AnnotP of pat * typ                        (* type annotation *)
+  | ParP of pat                                (* parenthesis *)
+(*
+  | AsP of pat * pat                           (* conjunctive *)
+*)
+
+and pat_field = pat_field' Source.phrase
+and pat_field' = {id : id; pat : pat}
+
+
+(* Expressions *)
+
+type vis = vis' Source.phrase
+and vis' =
+  | Public of string option
+  | Private
+  | System
+
+let is_public vis = match vis.Source.it with Public _ -> true | _ -> false
+
+type stab = stab' Source.phrase
+and stab' = Stable | Flexible
+
+type op_typ = Type.typ ref (* For overloaded resolution; initially Type.Pre. *)
+
+
+type inst = (typ list option, Type.typ list) Source.annotated_phrase (* For implicit scope instantiation *)
+
+type sort_pat = (Type.shared_sort * pat) Type.shared Source.phrase
+
+type sugar = bool (* Is the source of a function body a block `<block>`,
+                     subject to further desugaring during parse,
+                     or the invariant form `= <exp>`.
+                     In the final output of the parser, the exp in FuncE is
+                     always in its fully desugared form and the
+                     value of the sugar field is irrelevant.
+                     This flag is used to correctly desugar an actor's
+                     public functions as oneway, shared functions *)
+
+type exp = (exp', typ_note) Source.annotated_phrase
+and exp' =
+  | PrimE of string                            (* primitive *)
+  | VarE of id                                 (* variable *)
+  | LitE of lit ref                            (* literal *)
+  | ActorUrlE of exp                           (* actor reference *)
+  | UnE of op_typ * unop * exp                 (* unary operator *)
+  | BinE of op_typ * exp * binop * exp         (* binary operator *)
+  | RelE of op_typ * exp * relop * exp         (* relational operator *)
+  | ShowE of (op_typ * exp)                    (* debug show operator *)
+  | ToCandidE of exp list                      (* to_candid operator *)
+  | FromCandidE of exp                         (* from_candid operator *)
+  | TupE of exp list                           (* tuple *)
+  | ProjE of exp * int                         (* tuple projection *)
+  | OptE of exp                                (* option injection *)
+  | DoOptE of exp                              (* option monad *)
+  | BangE of exp                               (* scoped option projection *)
+  | ObjBlockE of obj_sort * dec_field list     (* object block *)
+  | ObjE of exp list * exp_field list          (* record literal/extension *)
+  | TagE of id * exp                           (* variant *)
+  | DotE of exp * id                           (* object projection *)
+  | AssignE of exp * exp                       (* assignment *)
+  | ArrayE of mut * exp list                   (* array *)
+  | IdxE of exp * exp                          (* array indexing *)
+  | FuncE of string * sort_pat * typ_bind list * pat * typ option * sugar * exp  (* function *)
+  | CallE of exp * inst * exp                  (* function call *)
+  | BlockE of dec list                         (* block (with type after avoidance)*)
+  | NotE of exp                                (* negation *)
+  | AndE of exp * exp                          (* conjunction *)
+  | OrE of exp * exp                           (* disjunction *)
+  | ImpliesE of exp * exp                      (* implication *)
+  | OldE of exp                                (* old-expression *)
+  | IfE of exp * exp * exp                     (* conditional *)
+  | SwitchE of exp * case list                 (* switch *)
+  | WhileE of exp * exp                        (* while-do loop *)
+  | LoopE of exp * exp option                  (* do-while loop *)
+  | ForE of pat * exp * exp                    (* iteration *)
+  | LabelE of id * typ * exp                   (* label *)
+  | BreakE of id * exp                         (* break *)
+  | RetE of exp                                (* return *)
+  | DebugE of exp                              (* debugging *)
+  | AsyncE of async_sort * typ_bind * exp      (* future / computation *)
+  | AwaitE of async_sort * exp                 (* await *)
+  | AssertE of assert_kind * exp               (* assertion *)
+  | AnnotE of exp * typ                        (* type annotation *)
+  | ImportE of (string * resolved_import ref)  (* import statement *)
+  | ThrowE of exp                              (* throw exception *)
+  | TryE of exp * case list                    (* catch exception *)
+  | IgnoreE of exp                             (* ignore *)
+(*
+  | FinalE of exp * exp                        (* finally *)
+  | AtomE of string                            (* atom *)
+*)
+
+and assert_kind =
+  | Runtime | Static | Invariant | Precondition | Postcondition | Concurrency of string | Loop_entry | Loop_continue | Loop_exit
+
+and dec_field = dec_field' Source.phrase
+and dec_field' = {dec : dec; vis : vis; stab: stab option}
+
+and exp_field = exp_field' Source.phrase
+and exp_field' = {mut : mut; id : id; exp : exp}
+
+and case = case' Source.phrase
+and case' = {pat : pat; exp : exp}
+
+
+(* Declarations *)
+
+and dec = (dec', typ_note) Source.annotated_phrase
+and dec' =
+  | ExpD of exp                                (* plain unit expression *)
+  | LetD of pat * exp * exp option             (* immutable, with an optional fail block *)
+  | VarD of id * exp                           (* mutable *)
+  | TypD of typ_id * typ_bind list * typ       (* type *)
+  | ClassD of                                  (* class *)
+      sort_pat * typ_id * typ_bind list * pat * typ option * obj_sort * id * dec_field list
+
+
+(* Program (pre unit detection) *)
+
+type prog_note = { filename : string; trivia : Trivia.triv_table }
+type prog = (prog', prog_note) Source.annotated_phrase
+and prog' = dec list
+
+(* Signatures (stable variables) *)
+
+type stab_sig = (stab_sig', prog_note) Source.annotated_phrase
+and stab_sig' = (dec list * typ_field list)      (* type declarations & stable actor fields *)
+
+(* Compilation units *)
+
+type import = (import', Type.typ) Source.annotated_phrase
+and import' = pat * string * resolved_import ref
+
+type comp_unit_body = (comp_unit_body', typ_note) Source.annotated_phrase
+and comp_unit_body' =
+ | ProgU of dec list                         (* main programs *)
+ | ActorU of id option * dec_field list      (* main IC actor *)
+ | ModuleU of id option * dec_field list     (* module library *)
+ | ActorClassU of                            (* IC actor class, main or library *)
+     sort_pat * typ_id * typ_bind list * pat * typ option * id * dec_field list
+
+type comp_unit = (comp_unit', prog_note) Source.annotated_phrase
+and comp_unit' = {
+  imports : import list;
+  body : comp_unit_body;
+  }
+
+type lib = comp_unit
+
+
+(* Helpers *)
+
+let (@@) = Source.(@@)
+let (@?) it at = Source.({it; at; note = empty_typ_note})
+let (@!) it at = Source.({it; at; note = Type.Pre})
+let (@=) it at = Source.({it; at; note = None})
+
+
+(* NB: This function is currently unused *)
+let string_of_lit = function
+  | BoolLit false -> "false"
+  | BoolLit true  ->  "true"
+  | IntLit n
+  | NatLit n      -> Numerics.Int.to_pretty_string n
+  | Int8Lit n     -> Numerics.Int_8.to_pretty_string n
+  | Int16Lit n    -> Numerics.Int_16.to_pretty_string n
+  | Int32Lit n    -> Numerics.Int_32.to_pretty_string n
+  | Int64Lit n    -> Numerics.Int_64.to_pretty_string n
+  | Nat8Lit n     -> Numerics.Nat8.to_pretty_string n
+  | Nat16Lit n    -> Numerics.Nat16.to_pretty_string n
+  | Nat32Lit n    -> Numerics.Nat32.to_pretty_string n
+  | Nat64Lit n    -> Numerics.Nat64.to_pretty_string n
+  | CharLit c     -> string_of_int c
+  | NullLit       -> "null"
+  | TextLit t     -> t
+  | BlobLit b     -> b
+  | FloatLit f    -> Numerics.Float.to_pretty_string f
+  | PreLit _      -> assert false
+
+
+
+(* Miscellaneous *)
+(* TODO: none of what follows should probably be in this file *)
+
+open Source
+
+
+(* Identifiers *)
+
+let anon_id sort at = "anon-" ^ sort ^ "-" ^ string_of_pos at.left
+let is_anon_id id = Lib.String.chop_prefix "anon-" id.it <> None
+
+(* Types & Scopes *)
+
+let arity t =
+  match t.Source.it with
+  | TupT ts -> List.length ts
+  | _ -> 1
+
+let is_any t =
+  match t.it with
+  | PrimT "Any" -> true
+  | _ -> false
+
+let scopeT at =
+  PathT (IdH {it = Type.default_scope_var; at; note = ()} @! at, []) @! at
+
+
+(* Expressions *)
+
+let asyncE sort tbs e =
+  AsyncE (sort, tbs, e) @? e.at
+
+let ignore_asyncE tbs e =
+  IgnoreE (
+    AnnotE (AsyncE (Type.Fut, tbs, e) @? e.at,
+      AsyncT (Type.Fut, scopeT e.at, TupT [] @! e.at) @! e.at) @? e.at ) @? e.at
+
+let is_asyncE e =
+  match e.it with
+  | AsyncE _ -> true
+  | _ -> false
+
+let is_ignore_asyncE e =
+  match e.it with
+  | IgnoreE
+      {it = AnnotE ({it = AsyncE (Type.Fut, _, _); _},
+        {it = AsyncT (Type.Fut, _, {it = TupT []; _}); _}); _} ->
+    true
+  | _ -> false
+
+
+
+ + + diff --git a/coverage/mo_def/trivia.ml.html b/coverage/mo_def/trivia.ml.html new file mode 100644 index 00000000000..a45a1f5d633 --- /dev/null +++ b/coverage/mo_def/trivia.ml.html @@ -0,0 +1,350 @@ + + + + + trivia.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+
+
open Source
+
+type line_feed = LF | CRLF
+
+type 'l trivia = Comment of string | Space of int | Tab of int | Line of 'l
+
+type void = |
+
+let absurd : void -> 'a = function _ -> .
+
+let map_trivia : ('a -> 'b) -> 'a trivia -> 'b trivia =
+ fun f -> function
+  | Comment str -> Comment str
+  | Space n -> Space n
+  | Tab n -> Tab n
+  | Line l -> Line (f l)
+
+let string_of_line_feed = function LF -> "LF" | CRLF -> "CRLF"
+
+let string_of_trivia : ('a -> string) -> 'a trivia -> string =
+ fun f t ->
+  match t with
+  | Comment str -> str
+  | Space n -> Printf.sprintf "Space(%d)" n
+  | Tab n -> Printf.sprintf "Tab(%d)" n
+  | Line l -> Printf.sprintf "Line(%s)" (f l)
+
+let string_of_trivia_lf : line_feed trivia -> string =
+  string_of_trivia string_of_line_feed
+
+type trivia_info = {
+  leading_trivia : line_feed trivia list;
+  trailing_trivia : void trivia list;
+}
+
+type pos = { line : int; column : int }
+
+let pos_of_lexpos : Lexing.position -> pos =
+ fun lexpos ->
+  Lexing.{ line = lexpos.pos_lnum; column = lexpos.pos_cnum - lexpos.pos_bol }
+
+module PosHash = struct
+  type t = pos
+
+  let equal i j = i = j
+
+  let hash ({ line; column } : pos) = column lor 20 land line
+end
+
+module PosHashtbl = Hashtbl.Make (PosHash)
+
+(* type triv_table = trivia_info IntHashtbl.t *)
+type triv_table = trivia_info PosHashtbl.t
+
+let empty_triv_table = PosHashtbl.create 0
+
+let find_trivia triv_table (parser_pos : Source.region) : trivia_info =
+  PosHashtbl.find triv_table
+    { line = parser_pos.left.line; column = parser_pos.left.column }
+
+let deprecated_of_trivia_info : trivia_info -> string option =
+ fun info ->
+  let lines =
+    List.filter_map
+      (function
+        | Comment s -> (
+            match Lib.String.chop_prefix "/// @deprecated" s with
+            | Some "" -> Some ""
+            | Some line_comment ->
+                (* We expect a documentation line comment to start with a space
+                 *  (which we remove here) *)
+                Lib.String.chop_prefix " " line_comment
+            | None -> None )
+        | _ -> None)
+      info.leading_trivia
+  in
+  if lines = [] then None else Some (String.concat "\n" lines)
+
+let doc_comment_of_trivia_info : trivia_info -> string option =
+ fun info ->
+  let lines =
+    List.filter_map
+      (function
+        | Comment s -> (
+            match Lib.String.chop_prefix "///" s with
+            | Some "" -> Some ""
+            | Some line_comment ->
+                (* We expect a documentation line comment to start with a space
+                 *  (which we remove here) *)
+                Lib.String.chop_prefix " " line_comment
+            | None ->
+                Option.bind
+                  (Lib.String.chop_prefix "/**" s)
+                  (Lib.String.chop_suffix "*/")
+                |> Option.map String.trim )
+        | _ -> None)
+      info.leading_trivia
+  in
+  if lines = [] then None else Some (String.concat "\n" lines)
+
+
+
+ + + diff --git a/coverage/mo_frontend/bi_match.ml.html b/coverage/mo_frontend/bi_match.ml.html new file mode 100644 index 00000000000..f381a7f0803 --- /dev/null +++ b/coverage/mo_frontend/bi_match.ml.html @@ -0,0 +1,1073 @@ + + + + + bi_match.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+
+
open Mo_types
+open Type
+
+(* TODO: consider turning off show_stamps (but then do it elsewhere too)
+open MakePretty(struct let show_stamps = false end)
+*)
+
+let pp_rel ppf (t1, rel, t2) =
+  Format.fprintf ppf "@[<hv 2>%a  %s @ %a@]"
+    pp_typ t1
+    rel
+    pp_typ t2
+
+let pp_constraint ppf (lb, c, ub) =
+  Format.fprintf ppf "@[<hv 2>%a  <: @ @[<hv 2>%s  <: @ %a@]@]"
+    pp_typ lb
+    (Cons.name c)
+    pp_typ ub
+
+let display_constraint = Lib.Format.display pp_constraint
+let display_rel = Lib.Format.display pp_rel
+
+(* Bi-Matching *)
+
+exception Bimatch of string
+
+module SS = Set.Make (OrdPair)
+
+(* Types that are denotable (ranged over) by type variables *)
+let denotable t =
+  let t' = normalize t in
+  not (is_mut t' || is_typ t')
+
+let bound c = match Cons.kind c with
+  | Abs ([], t) -> t
+  | _ -> assert false
+
+(* Check instantiation `ts` satisfies bounds `tbs` and all the pairwise sub-typing relations in `subs`;
+   used to sanity check inferred instantiations *)
+let verify_inst tbs subs ts =
+  List.length tbs = List.length ts &&
+  List.for_all2 (fun t tb -> sub t (open_ ts tb.bound)) ts tbs &&
+  List.for_all (fun (t1, t2) -> sub (open_ ts t1) (open_ ts t2)) subs
+
+let bi_match_subs scope_opt tbs subs typ_opt =
+  let ts = open_binds tbs in
+
+  let ts1 = List.map (fun (t1, _) -> open_ ts t1) subs in
+  let ts2 = List.map (fun (_, t2) -> open_ ts t2) subs in
+
+  let cs = List.map (fun t -> fst (as_con t)) ts in
+
+  let cons = ConSet.of_list cs in
+
+  let flexible c = ConSet.mem c cons in
+
+  let variances =
+    match typ_opt with
+    | Some t ->
+      Variance.variances cons (open_ ts t)
+    | None ->
+      ConSet.fold (fun c ce -> ConEnv.add c Variance.Bivariant ce) cons ConEnv.empty
+  in
+
+  let variance c = ConEnv.find c variances in
+
+  let mentions typ ce = not (ConSet.is_empty (ConSet.inter (Type.cons typ) ce)) in
+
+  let rec bi_match_list p rel eq inst any xs1 xs2 =
+    match (xs1, xs2) with
+    | x1::xs1, x2::xs2 ->
+      (match p rel eq inst any x1 x2 with
+      | Some inst -> bi_match_list p rel eq inst any xs1 xs2
+      | None -> None)
+    | [], [] -> Some inst
+    | _, _ -> None
+  in
+
+  let update binop c t ce =
+    ConEnv.add c (binop t (ConEnv.find c ce)) ce
+  in
+
+  let rec bi_match_typ rel eq ((l, u) as inst) any t1 t2 =
+    if t1 == t2 || SS.mem (t1, t2) !rel
+    then Some inst
+    else begin
+    rel := SS.add (t1, t2) !rel;
+    match t1, t2 with
+    | Pre, _ | _, Pre ->
+      Some inst
+    | Any, Any ->
+      Some inst
+    | _, Any when rel != eq ->
+      Some inst
+    | Non, Non ->
+      Some inst
+    | Non, _ when rel != eq ->
+      Some inst
+    | _, Con (con2, ts2) when flexible con2 ->
+      assert (ts2 = []);
+      if mentions t1 any || not (denotable t1) then
+        None
+      else Some
+       (update lub con2 t1 l,
+        if rel != eq then u else update glb con2 t1 u)
+    | Con (con1, ts1), _ when flexible con1 ->
+      assert (ts1 = []);
+      if mentions t2 any || not (denotable t2) then
+        None
+      else Some
+        ((if rel != eq then l else update lub con1 t2 l),
+         update glb con1 t2 u)
+    | Con (con1, _), Con (con2, _) when flexible con1 && flexible con2 ->
+      (* Because we do matching, not unification, we never relate two flexible variables *)
+      assert false
+    | Con (con1, ts1), Con (con2, ts2) ->
+      (match Cons.kind con1, Cons.kind con2 with
+      | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _, Def (tbs, t) -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any t1 (open_ ts2 t)
+      | _ when Cons.eq con1 con2 ->
+        assert (ts1 = []);
+        assert (ts2 = []);
+        Some inst
+      | Abs (tbs, t), _ when rel != eq ->
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _ -> None
+      )
+    | Con (con1, ts1), t2 ->
+      (match Cons.kind con1, t2 with
+      | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | Abs (tbs, t), _ when rel != eq ->
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _ -> None
+      )
+    | t1, Con (con2, ts2) ->
+      (match Cons.kind con2 with
+      | Def (tbs, t) -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any t1 (open_ ts2 t)
+      | _ -> None
+      )
+    | Prim p1, Prim p2 when p1 = p2 ->
+      Some inst
+    | Prim p1, Prim p2 when rel != eq ->
+      if p1 = Nat && p2 = Int then Some inst else None
+    | Obj (s1, tfs1), Obj (s2, tfs2) ->
+      if s1 = s2 then
+        bi_match_fields rel eq inst any tfs1 tfs2
+      else None
+    | Array t1', Array t2' ->
+      bi_match_typ rel eq inst any t1' t2'
+    | Opt t1', Opt t2' ->
+      bi_match_typ rel eq inst any t1' t2'
+    | Prim Null, Opt t2' when rel != eq ->
+      Some inst
+    | Variant fs1, Variant fs2 ->
+      bi_match_tags rel eq inst any fs1 fs2
+    | Tup ts1, Tup ts2 ->
+      bi_match_list bi_match_typ rel eq inst any ts1 ts2
+    | Func (s1, c1, tbs1, t11, t12), Func (s2, c2, tbs2, t21, t22) ->
+      if s1 = s2 && c1 = c2 then
+      (match bi_match_binds rel eq inst any tbs1 tbs2 with
+       | Some (inst, ts) ->
+         let any' = List.fold_right
+           (fun t -> ConSet.add (fst (as_con t))) ts any
+         in
+         (match
+           bi_match_list bi_match_typ rel eq inst any' (List.map (open_ ts) t21) (List.map (open_ ts) t11)
+          with
+         | Some inst ->
+           bi_match_list bi_match_typ rel eq inst any' (List.map (open_ ts) t12) (List.map (open_ ts) t22)
+         | None -> None)
+       | None -> None
+      )
+      else None
+    | Async (s1, t11, t12), Async (s2, t21, t22) ->
+      if s1 = s2 then
+        (match bi_equate_typ rel eq inst any t11 t21  with
+         | Some inst ->
+           bi_match_typ rel eq inst any t12 t22
+         | None -> None)
+      else None
+    | Mut t1', Mut t2' ->
+      bi_equate_typ rel eq inst any t1' t2'
+    | Typ c1, Typ c2 ->
+      (* NB: we assume c1, c2 closed *)
+      if Type.eq t1 t2 then Some inst else None
+    | _, _ -> None
+    end
+
+  and bi_equate_typ rel eq inst any t1 t2 =
+    bi_match_typ eq eq inst any t1 t2
+
+  and bi_match_fields rel eq inst any tfs1 tfs2 =
+    (* Assume that tfs1 and tfs2 are sorted. *)
+    match tfs1, tfs2 with
+    | [], [] ->
+      Some inst
+    | _, [] when rel != eq ->
+      Some inst
+    | tf1::tfs1', tf2::tfs2' ->
+      (match compare_field tf1 tf2 with
+      | 0 ->
+        (match bi_match_typ rel eq inst any tf1.typ tf2.typ with
+         | Some inst -> bi_match_fields rel eq inst any tfs1' tfs2'
+         | None -> None)
+      | -1 when rel != eq ->
+        bi_match_fields rel eq inst any tfs1' tfs2
+      | _ -> None
+      )
+    | _, _ -> None
+
+  and bi_match_tags rel eq inst any tfs1 tfs2 =
+    (* Assume that tfs1 and tfs2 are sorted. *)
+    match tfs1, tfs2 with
+    | [], [] ->
+      Some inst
+    | [], _  ->
+      Some inst
+    | tf1::tfs1', tf2::tfs2' ->
+      (match compare_field tf1 tf2 with
+      | 0 ->
+        (match bi_match_typ rel eq inst any tf1.typ tf2.typ with
+         | Some inst -> bi_match_tags rel eq inst any tfs1' tfs2'
+         | None -> None)
+      | +1  when rel != eq->
+        bi_match_tags rel eq inst any tfs1 tfs2'
+      | _ -> None
+      )
+    | _, _ -> None
+
+  and bi_match_binds rel eq inst any tbs1 tbs2 =
+    let ts = open_binds tbs2 in
+    match bi_match_list (bi_match_bind ts) rel eq inst any tbs2 tbs1 with
+    | Some inst -> Some (inst,ts)
+    | None -> None
+
+  and bi_match_bind ts rel eq inst any tb1 tb2 =
+    bi_match_typ rel eq inst any (open_ ts tb1.bound) (open_ ts tb2.bound)
+
+  and choose_under_constrained lb c ub =
+    match variance c with
+    | Variance.Covariant -> lb
+    | Variance.Contravariant -> ub
+    | Variance.Bivariant -> lb
+    | Variance.Invariant ->
+      raise (Bimatch (Format.asprintf
+        "implicit instantiation of type parameter %s is under-constrained with%a\nwhere%a\nso that explicit type instantiation is required"
+        (Cons.name c)
+        display_constraint (lb, c, ub)
+        display_rel (lb,"=/=",ub)))
+
+  and fail_over_constrained lb c ub =
+    raise (Bimatch (Format.asprintf
+      "implicit instantiation of type parameter %s is over-constrained with%a\nwhere%a\nso that no valid instantiation exists"
+      (Cons.name c)
+      display_constraint (lb, c, ub)
+      display_rel (lb, "</:", ub)))
+
+  and fail_open_bound c bd =
+    let c = Cons.name c in
+    raise (Bimatch (Format.asprintf
+      "type parameter %s has an open bound%a\nmentioning another type parameter, so that explicit type instantiation is required due to limitation of inference"
+      c (Lib.Format.display pp_typ) bd))
+
+  in
+    let bds = List.map (fun tb -> open_ ts tb.bound) tbs in
+    List.iter2 (fun c bd -> if mentions bd cons then fail_open_bound c bd) cs bds;
+
+    let l = ConSet.fold (fun c l -> ConEnv.add c Non l) cons ConEnv.empty in
+    let u = ConSet.fold (fun c u -> ConEnv.add c (bound c) u) cons ConEnv.empty in
+
+    let l, u = match scope_opt, tbs with
+      | Some c, {sort = Scope; _}::tbs ->
+        let c0 = List.hd cs in
+        ConEnv.add c0 c l,
+        ConEnv.add c0 c u
+      | None, {sort = Scope; _}::tbs ->
+        raise (Bimatch "scope instantiation required but no scope available")
+      | _, _ ->
+        l,
+        u
+    in
+    match
+      bi_match_list bi_match_typ
+        (ref SS.empty) (ref SS.empty) (l, u) ConSet.empty ts1 ts2
+    with
+    | Some (l, u) ->
+      let us = List.map
+        (fun c ->
+          match ConEnv.find c l, ConEnv.find c u with
+          | lb, ub ->
+            if eq lb ub then
+              ub
+            else if sub lb ub then
+              choose_under_constrained lb c ub
+            else
+              fail_over_constrained lb c ub)
+        cs
+      in
+      if verify_inst tbs subs us then
+        us
+      else
+        raise (Bimatch
+          (Printf.sprintf
+             "bug: inferred bad instantiation\n  <%s>\nplease report this error message and, for now, supply an explicit instantiation instead"
+            (String.concat ", " (List.map string_of_typ us))))
+    | None ->
+      let tts =
+        List.filter (fun (t1, t2) -> not (sub t1 t2)) (List.combine ts1 ts2)
+      in
+      raise (Bimatch (Format.asprintf
+        "no instantiation of %s makes%s"
+        (String.concat ", " (List.map string_of_con cs))
+        (String.concat "\nand"
+          (List.map (fun (t1, t2) ->
+            Format.asprintf "%a" display_rel (t1, "<:", t2))
+            tts))))
+
+let bi_match_call scope_opt (tbs, dom_typ, rng_typ) arg_typ ret_typ_opt =
+  match ret_typ_opt with
+  | None ->
+    (* no ret_typ: use polarities of tbs in rng_typ to
+       choose principal instantiation, if any *)
+    bi_match_subs scope_opt tbs
+      [(arg_typ, dom_typ) (*; (rng_typ, Any) *)]
+      (Some rng_typ)
+  | Some ret_typ ->
+    bi_match_subs scope_opt tbs
+      [(arg_typ, dom_typ); (rng_typ, ret_typ)]
+      None
+
+
+
+ + + diff --git a/coverage/mo_frontend/coverage.ml.html b/coverage/mo_frontend/coverage.ml.html new file mode 100644 index 00000000000..2f24496c35f --- /dev/null +++ b/coverage/mo_frontend/coverage.ml.html @@ -0,0 +1,1193 @@ + + + + + coverage.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+
+
open Mo_def
+open Mo_types
+open Mo_values
+
+open Syntax
+open Source
+
+module T = Type
+module V = Value
+
+module ValSet = Set.Make(struct type t = V.value let compare = V.compare end)
+module TagSet = Set.Make(struct type t = string let compare = String.compare end)
+module LabMap = Map.Make(struct type t = string let compare = String.compare end)
+module AtSet = Set.Make(struct type t = Source.region let compare = compare end)
+
+type desc =
+  | Any
+  | Val of V.value
+  | NotVal of ValSet.t
+  | Tup of desc list
+  | Obj of desc LabMap.t
+  | Opt of desc
+  | Tag of desc * string
+  | NotTag of TagSet.t
+
+type ctxt =
+  | InOpt of ctxt
+  | InTag of ctxt * string
+  | InTup of ctxt * desc list * desc list * pat list * T.typ list
+  | InObj of ctxt * desc LabMap.t * string * pat_field list * T.field list
+  | InAlt1 of ctxt * Source.region * pat * T.typ
+  | InAlt2 of ctxt * Source.region
+  | InCase of Source.region * case list * T.typ
+
+type sets =
+  { mutable cases : AtSet.t;
+    mutable alts : AtSet.t;
+    mutable reached_cases : AtSet.t;
+    mutable reached_alts : AtSet.t;
+    mutable missing : desc list;
+  }
+
+
+let make_sets () =
+  { cases = AtSet.empty;
+    alts = AtSet.empty;
+    reached_cases = AtSet.empty;
+    reached_alts = AtSet.empty;
+    missing = [];
+  }
+
+
+(* Generating counter examples *)
+
+let max_expand = 2
+
+let pick_nat (type t) (module Num : Numerics.NumType with type t = t) to_val vs =
+  let x = ref Num.zero in
+  while ValSet.mem (to_val !x) vs do
+    x := Num.add (Num.of_int 1) !x
+  done;
+  Val (to_val !x)
+
+let pick_int (type t) (module Num : Numerics.NumType with type t = t) to_val vs =
+  let x = ref Num.zero in
+  while ValSet.mem (to_val !x) vs do
+    x := Num.neg !x;
+    if Num.ge !x Num.zero then x := Num.add (Num.of_int 1) !x
+  done;
+  Val (to_val !x)
+
+let pick_char vs =
+  let x = ref 0 in
+  while ValSet.mem (V.Char !x) vs do
+    x := !x + 1
+  done;
+  Val (V.Char !x)
+
+let pick_val vs = function
+  | T.Null -> Val V.Null
+  | T.Bool -> Val (V.Bool (ValSet.mem (V.Bool false) vs))
+  | T.Nat -> pick_nat (module Numerics.Nat) (fun x -> V.Int x) vs
+  | T.Nat8 -> pick_nat (module Numerics.Nat8) (fun x -> V.Nat8 x) vs
+  | T.Nat16 -> pick_nat (module Numerics.Nat16) (fun x -> V.Nat16 x) vs
+  | T.Nat32 -> pick_nat (module Numerics.Nat32) (fun x -> V.Nat32 x) vs
+  | T.Nat64 -> pick_nat (module Numerics.Nat64) (fun x -> V.Nat64 x) vs
+  | T.Int -> pick_int (module Numerics.Int) (fun x -> V.Int x) vs
+  | T.Int8 -> pick_int (module Numerics.Int_8) (fun x -> V.Int8 x) vs
+  | T.Int16 -> pick_int (module Numerics.Int_16) (fun x -> V.Int16 x) vs
+  | T.Int32 -> pick_int (module Numerics.Int_32) (fun x -> V.Int32 x) vs
+  | T.Int64 -> pick_int (module Numerics.Int_64) (fun x -> V.Int64 x) vs
+  | T.Char -> pick_char vs
+  | T.Text
+  | T.Blob
+  | T.Error
+  | T.Principal
+  | T.Float -> Any
+
+let rec expand_notval t n vs : desc list =
+  let missing = Lib.Option.get (T.span t) max_int - ValSet.cardinal vs in
+  if missing = 0 then [] else
+  if n = max_expand && missing > 1 then [Any] else
+  match t with
+  | T.Prim t' ->
+    (match pick_val vs t' with
+    | Val v -> Val v :: expand_notval t (n + 1) (ValSet.add v vs)
+    | _ -> [Any]
+    )
+  | T.Opt _ -> [Opt Any]
+  | _ -> [Any]
+
+
+let rec pick_tag ls = function
+  | [] -> assert false
+  | tf::tfs when TagSet.mem tf.T.lab ls -> pick_tag ls tfs
+  | tf::_ -> tf.T.lab
+
+let rec expand_nottag tfs n ls : desc list =
+  let missing = List.length tfs - TagSet.cardinal ls in
+  if missing = 0 then [] else
+  if n = max_expand && missing > 1 then [Any] else
+  let l = pick_tag ls tfs in
+  Tag (Any, l) :: expand_nottag tfs (n + 1) (TagSet.add l ls)
+
+(* TODO: pretty print *)
+let rec string_of_desc t = function
+  | Any -> "_"
+  | Val v -> V.string_of_val 100 v
+  | NotVal vs -> string_of_descs t (expand_notval (T.promote t) 0 vs)
+  | Tup descs ->
+    let ts = T.as_tup_sub (List.length descs) t in
+    "(" ^ String.concat ", " (List.map2 string_of_desc ts descs) ^ ")"
+  | Obj ldescs ->
+    let fields = LabMap.bindings ldescs in
+    let _, tfs = T.as_obj_sub (List.map fst fields) t in
+    "{" ^ String.concat "; " (List.map (string_of_ldesc tfs) fields) ^ "}"
+  | Opt desc ->
+    let t' = T.as_opt_sub t in
+    "?(" ^ string_of_desc t' desc ^ ")"
+  | Tag (desc, l) ->
+    let t' = T.lookup_val_field l (T.as_variant_sub l t) in
+    if T.sub t' T.unit then "#" ^ l
+    else if T.is_tup t' then "#" ^ l ^ string_of_desc t' desc
+    else "#" ^ l ^ "(" ^ string_of_desc t' desc ^ ")"
+  | NotTag ls ->
+    let tfs = T.as_variant (T.promote t) in
+    string_of_descs t (expand_nottag tfs 0 ls)
+
+and string_of_ldesc tfs (l, desc) =
+  l ^ " = " ^ string_of_desc (T.lookup_val_field l tfs) desc
+
+and string_of_descs t descs =
+  assert (descs <> []);
+  String.concat " or " (List.map (string_of_desc t) descs)
+
+
+(* Abstract interpretation *)
+
+let is_neg_int = function
+  | V.Int i -> Numerics.Int.(lt i zero)
+  | _ -> false
+
+let value_of_lit = function
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit w -> V.Nat8 w
+  | Nat16Lit w -> V.Nat16 w
+  | Nat32Lit w -> V.Nat32 w
+  | Nat64Lit w -> V.Nat64 w
+  | IntLit i -> V.Int i
+  | Int8Lit w -> V.Int8 w
+  | Int16Lit w -> V.Int16 w
+  | Int32Lit w -> V.Int32 w
+  | Int64Lit w -> V.Int64 w
+  | FloatLit z -> V.Float z
+  | CharLit c -> V.Char c
+  | TextLit t -> V.Text t
+  | BlobLit b -> V.Blob b
+  | PreLit _ -> assert false
+
+
+let (&&&) = (&&) (* No short-cutting *)
+
+let skip_pat at sets =
+  sets.alts <- AtSet.add at sets.alts;
+  true
+
+let rec match_pat ctxt desc pat t sets =
+  T.span t = Some 0 && skip_pat pat.at sets ||
+  match pat.it with
+  | WildP | VarP _ ->
+    if T.inhabited t then
+      succeed ctxt desc sets
+    else
+      skip_pat pat.at sets
+  | LitP lit ->
+    match_lit ctxt desc pat.at (value_of_lit !lit) t sets
+  | SignP (op, lit) ->
+    let f = Operator.unop op (Operator.type_unop op pat.note) in
+    match_lit ctxt desc pat.at (f (value_of_lit !lit)) t sets
+  | TupP pats ->
+    let ts = T.as_tup (T.promote t) in
+    let descs =
+      match desc with
+      | Tup descs -> descs
+      | Any -> List.map (fun _ -> Any) pats
+      | _ -> assert false
+    in match_tup ctxt [] descs pats ts sets
+  | ObjP pat_fields ->
+    let _, tfs = T.as_obj (T.promote t) in
+    let ldescs =
+      match desc with
+      | Obj ldescs -> ldescs
+      | Any ->
+        LabMap.(List.fold_left
+          (fun m (tf : T.field) -> add tf.T.lab Any m) empty tfs)
+      | _ -> assert false
+    in match_obj ctxt ldescs pat_fields tfs sets
+  | OptP pat1 ->
+    if T.is_prim T.Null (T.promote t) then  (* may occur through subtyping *)
+      skip_pat pat.at sets && fail ctxt (Val V.Null) sets
+    else
+      let t' = T.as_opt (T.promote t) in
+      (match desc with
+      | Opt desc' ->
+        match_pat (InOpt ctxt) desc' pat1 t' sets
+      | Val V.Null ->
+        fail ctxt desc sets
+      | NotVal vs when ValSet.mem V.Null vs ->
+        match_pat (InOpt ctxt) Any pat1 t' sets
+      | Any ->
+        fail ctxt (Val V.Null) sets &&&
+        match_pat (InOpt ctxt) Any pat1 t' sets
+      | _ -> assert false
+      )
+  | TagP (id, pat1) ->
+    let t', found =
+      match T.lookup_val_field_opt id.it (T.as_variant (T.promote t)) with
+      | None -> T.Non, false  (* may occur through subtyping *)
+      | Some t' -> t', true
+    in
+    (match desc with
+    | Tag (desc', l) ->
+      if id.it = l then
+        match_pat (InTag (ctxt, l)) desc' pat1 t' sets
+      else
+        fail ctxt desc sets
+    | NotTag ls ->
+      if TagSet.mem id.it ls then
+        fail ctxt desc sets
+      else if not found then
+        skip_pat pat.at sets && fail ctxt desc sets
+      else if T.span t = Some (TagSet.cardinal ls + 1) then
+        match_pat (InTag (ctxt, id.it)) Any pat1 t' sets
+      else
+        fail ctxt (NotTag (TagSet.add id.it ls)) sets &&&
+        match_pat (InTag (ctxt, id.it)) Any pat1 t' sets
+    | Any ->
+      match_pat ctxt (NotTag TagSet.empty) pat t sets
+    | _ -> assert false
+    )
+  | AltP (pat1, pat2) ->
+    sets.alts <- AtSet.add pat1.at (AtSet.add pat2.at sets.alts);
+    match_pat (InAlt1 (ctxt, pat1.at, pat2, t)) desc pat1 t sets
+  | AnnotP (pat1, _)
+  | ParP pat1 ->
+    match_pat ctxt desc pat1 t sets
+
+and match_lit ctxt desc at v t sets =
+  match desc with
+  | Val v' ->
+    if V.equal v v' then
+      succeed ctxt desc sets
+    else
+      fail ctxt desc sets
+  | NotVal vs ->
+    if ValSet.mem v vs then
+      fail ctxt desc sets
+    else if T.eq t T.nat && is_neg_int v then  (* may occur through subtyping *)
+      skip_pat at sets && fail ctxt desc sets
+    else if T.span t = Some (ValSet.cardinal vs + 1) then
+      succeed ctxt (Val v) sets
+    else
+      fail ctxt (NotVal (ValSet.add v vs)) sets &&&
+      succeed ctxt (Val v) sets
+  | Opt _ ->
+    fail ctxt desc sets
+  | Any ->
+    match_lit ctxt (NotVal ValSet.empty) at v t sets
+  | _ ->
+    assert false
+
+and match_tup ctxt descs_r descs pats ts sets =
+  match descs, pats, ts with
+  | [], [], [] ->
+    succeed ctxt (Tup (List.rev descs_r)) sets
+  | desc::descs', pat::pats', t::ts' ->
+    match_pat (InTup (ctxt, descs_r, descs', pats', ts')) desc pat t sets
+  | _ ->
+    assert false
+    
+and match_obj ctxt ldescs (pat_fields : pat_field list) tfs sets =
+  match pat_fields with
+  | [] -> succeed ctxt (Obj ldescs) sets
+  | pat_field::pat_fields' ->
+    let l = pat_field.it.id.it in
+    let tf = List.find (fun tf -> tf.T.lab = l) tfs in
+    let desc = LabMap.find l ldescs in
+    match_pat (InObj (ctxt, ldescs, l, pat_fields', tfs))
+      desc pat_field.it.pat tf.T.typ sets
+
+and succeed ctxt desc sets : bool =
+  match ctxt with
+  | InOpt ctxt' ->
+    succeed ctxt' (Opt desc) sets
+  | InTag (ctxt', l) ->
+    succeed ctxt' (Tag (desc, l)) sets
+  | InTup (ctxt', descs_r, descs, pats, ts) ->
+    match_tup ctxt' (desc::descs_r) descs pats ts sets
+  | InObj (ctxt', ldescs, l, pfs, tfs) ->
+    match_obj ctxt' (LabMap.add l desc ldescs) pfs tfs sets
+  | InAlt1 (ctxt', at1, _pat2, _t) ->
+    sets.reached_alts <- AtSet.add at1 sets.reached_alts;
+    succeed ctxt' desc sets
+  | InAlt2 (ctxt', at2) ->
+    sets.reached_alts <- AtSet.add at2 sets.reached_alts;
+    succeed ctxt' desc sets
+  | InCase (at, cases, _t) ->
+    sets.reached_cases <- AtSet.add at sets.reached_cases;
+    skip cases sets
+
+and skip cases sets : bool =
+  match cases with
+  | [] ->
+    true
+  | case::cases' ->
+    sets.cases <- AtSet.add case.it.pat.at sets.cases;
+    skip cases' sets
+
+and fail ctxt desc sets : bool =
+  match ctxt with
+  | InOpt ctxt' ->
+    fail ctxt' (Opt desc) sets
+  | InTag (ctxt', l) ->
+    fail ctxt' (Tag (desc, l)) sets
+  | InTup (ctxt', descs', descs, pats, _ts) ->
+    fail ctxt' (Tup (List.rev descs' @ [desc] @ descs)) sets
+  | InObj (ctxt', ldescs, l, pats, _tfs) ->
+    fail ctxt' (Obj (LabMap.add l desc ldescs)) sets
+  | InAlt1 (ctxt', at1, pat2, t) ->
+    match_pat (InAlt2 (ctxt', pat2.at)) desc pat2 t sets
+  | InAlt2 (ctxt', at2) ->
+    fail ctxt' desc sets
+  | InCase (at, [], t) ->
+    T.span t = Some 0 || not (T.inhabited t) ||
+    (sets.missing <- desc::sets.missing; false)
+  | InCase (at, case::cases, t) ->
+    T.span t = Some 0 && skip (case::cases) sets ||
+    match_pat (InCase (case.it.pat.at, cases, t)) desc case.it.pat t sets
+
+
+type uncovered = string
+type unreached = Source.region
+
+let check_cases cases t =
+  let sets = make_sets () in
+  let _exhaustive = fail (InCase (Source.no_region, cases, t)) Any sets in
+  let uncovered = List.map (string_of_desc t) (List.rev sets.missing) in
+  let unreached_cases = AtSet.diff sets.cases sets.reached_cases in
+  let unreached_alts = AtSet.diff sets.alts sets.reached_alts in
+  uncovered, AtSet.elements (AtSet.union unreached_cases unreached_alts)
+
+let (@?) it at = {it; at; note = empty_typ_note}
+
+let check_pat pat t =
+  let uncovered, unreached =
+    check_cases [{pat; exp = TupE [] @? Source.no_region} @@ Source.no_region] t
+  in uncovered, List.filter ((<>) pat.at) unreached
+
+
+
+ + + diff --git a/coverage/mo_frontend/definedness.ml.html b/coverage/mo_frontend/definedness.ml.html new file mode 100644 index 00000000000..4876c4d5415 --- /dev/null +++ b/coverage/mo_frontend/definedness.ml.html @@ -0,0 +1,769 @@ + + + + + definedness.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+
+
(*
+This module implements a check that rules out use-before define.
+It is a compositional algorithm that returns, for each subexpression,
+ * Which variables are used eagerly and
+ * which are delayed
+these sets are disjoint and their union makes up the set of free variables, so
+the structure of this module is very similar to that of freevars.ml.
+
+We keep it still separate, because we are doing much more interesting things
+here in for blocks (function decs).
+*)
+
+open Mo_def
+open Mo_types
+open Source
+open Syntax
+
+(* We collect a few things along the way *)
+type usage_info = Eager | Delayed
+
+let join u1 u2 = match u1, u2 with
+  | Eager, _ -> Eager
+  | _, Eager -> Eager
+  | Delayed, Delayed -> Delayed
+
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+let map_of_set x s = S.fold (fun v m -> M.add v x m) s M.empty
+let set_unions = List.fold_left S.union S.empty
+
+(* A set of free variables *)
+type f = usage_info M.t
+
+(* The analysis result of a recursive group, before tying the knot *)
+type group = (Source.region * S.t * S.t * S.t) list
+
+(* Operations: Union and removal *)
+let (++) : f -> f -> f = M.union (fun _ u1 u2 -> Some (join u1 u2))
+let unions f xs = List.fold_left (++) M.empty (List.map f xs)
+
+(* A combined set of free variables and defined variables,
+   e.g. in patterns and declaration *)
+type defs = S.t
+type fd = f * defs
+
+
+(* Operations: *)
+
+(* This adds a set of free variables to a combined set *)
+let (+++) ((f, d) : fd) x = ((++) f x, d)
+(* This takes the union of two combined sets *)
+let (++++) (f1, d1) (f2, d2) = ((++) f1 f2, S.union d1 d2)
+let union_binders f xs = List.fold_left (++++) (M.empty, S.empty) (List.map f xs)
+
+let diff f d = M.filter (fun k _ -> not (S.mem k d)) f
+
+(* The bound variables from the second argument scope over the first *)
+let (///) (x : f) ((f, d) : fd) = f ++ diff x d
+
+(* Usage tracking. We distinguish between eager and delayed variable use.
+   Eager variables become delayed
+   - inside lambda
+   Delayed variables may stay delayed
+   - when storing variables in data structures (tuples, objects, arrays)
+   Delayed variables become eager
+   - when occurs in an application
+   - when a block uses some of its own variables eagerly
+*)
+let delayify : f -> f = M.map (fun _ -> Delayed)
+let eagerify : f -> f = M.map (fun _ -> Eager)
+
+let eager_vars : f -> S.t =
+  fun f -> S.of_list (M.keys (M.filter (fun _ u -> u = Eager) f))
+let delayed_vars : f -> S.t =
+  fun f -> S.of_list (M.keys (M.filter (fun _ u -> u = Delayed) f))
+
+(* One traversal for each syntactic category, named by that category *)
+
+let rec exp msgs e : f = match e.it with
+  (* Eager uses are either first-class uses of a variable: *)
+  | VarE i              -> M.singleton i.it Eager
+  (* Or anything that is occurring in a call (as this may call a closure): *)
+  | CallE (e1, ts, e2)  -> eagerify (exps msgs [e1; e2])
+  (* And break, return, throw can be thought of as calling a continuation: *)
+  | BreakE (i, e)       -> eagerify (exp msgs e)
+  | RetE e              -> eagerify (exp msgs e)
+  | ThrowE e            -> eagerify (exp msgs e)
+  (* Uses are delayed by function expressions *)
+  | FuncE (_, sp, tp, p, t, _, e) ->
+      delayify ((exp msgs e /// pat msgs p) /// shared_pat msgs sp)
+  (* The rest remaining cases just collect the uses of subexpressions: *)
+  | LitE _ | ActorUrlE _
+  | PrimE _ | ImportE _ -> M.empty
+  | UnE (_, uo, e)      -> exp msgs e
+  | BinE (_, e1, bo, e2)-> exps msgs [e1; e2]
+  | RelE (_, e1, ro, e2)-> exps msgs [e1; e2]
+  | ShowE (_, e)        -> exp msgs e
+  | ToCandidE es        -> exps msgs es
+  | FromCandidE e       -> exp msgs e
+  | TupE es             -> exps msgs es
+  | ProjE (e, i)        -> exp msgs e
+  | ObjBlockE (s, dfs)       ->
+    (* For actors, this may be too permissive; to be revised when we work on actors again *)
+    group msgs (dec_fields msgs dfs)
+  | ObjE (bases, efs)   -> exps msgs bases ++ exp_fields msgs efs
+  | DotE (e, i)         -> exp msgs e
+  | AssignE (e1, e2)    -> exps msgs [e1; e2]
+  | ArrayE (m, es)      -> exps msgs es
+  | IdxE (e1, e2)       -> exps msgs [e1; e2]
+  | BlockE ds           -> group msgs (decs msgs ds)
+  | NotE e              -> exp msgs e
+  | AndE (e1, e2)       -> exps msgs [e1; e2]
+  | OrE (e1, e2)        -> exps msgs [e1; e2]
+  | ImpliesE (e1, e2)   -> exps msgs [e1; e2]
+  | OldE e              -> exp msgs e
+  | IfE (e1, e2, e3)    -> exps msgs [e1; e2; e3]
+  | SwitchE (e, cs)     -> exp msgs e ++ cases msgs cs
+  | TryE (e, cs)        -> exp msgs e ++ cases msgs cs
+  | WhileE (e1, e2)     -> exps msgs [e1; e2]
+  | LoopE (e1, None)    -> exp msgs e1
+  | LoopE (e1, Some e2) -> exps msgs [e1; e2]
+  | ForE (p, e1, e2)    -> exp msgs e1 ++ (exp msgs e2 /// pat msgs p)
+  | LabelE (i, t, e)    -> exp msgs e
+  | DebugE e            -> exp msgs e
+  | AsyncE (_, _, e)    -> exp msgs e
+  | AwaitE (_, e)       -> exp msgs e
+  | AssertE (_, e)      -> exp msgs e
+  | AnnotE (e, t)       -> exp msgs e
+  | OptE e              -> exp msgs e
+  | DoOptE e            -> exp msgs e
+  | BangE e             -> exp msgs e
+  | TagE (_, e)         -> exp msgs e
+  | IgnoreE e           -> exp msgs e
+
+and exps msgs es : f = unions (exp msgs) es
+
+and exp_fields msgs efs : f = unions (exp_field msgs) efs
+and exp_field msgs ef : f = exp msgs ef.it.exp
+
+and pat msgs p : fd = match p.it with
+  | WildP         -> (M.empty, S.empty)
+  | VarP i        -> (M.empty, S.singleton i.it)
+  | TupP ps       -> pats msgs ps
+  | ObjP pfs      -> pat_fields msgs pfs
+  | AnnotP (p, _)
+  | ParP p        -> pat msgs p
+  | LitP l        -> (M.empty, S.empty)
+  | SignP (uo, l) -> (M.empty, S.empty)
+  | OptP p
+  | TagP (_, p)   -> pat msgs p
+  | AltP (p1, p2) -> pat msgs p1 ++++ pat msgs p2
+
+and pats msgs ps : fd = union_binders (pat msgs) ps
+
+and pat_fields msgs pfs = union_binders (fun (pf : pat_field) -> pat msgs pf.it.pat) pfs
+
+and shared_pat msgs shared_pat =
+  match shared_pat.it with
+  | Type.Local ->
+    (M.empty, S.empty)
+  | Type.Shared (_, p1) ->
+    pat msgs p1
+
+and case msgs (c : case) = exp msgs c.it.exp /// pat msgs c.it.pat
+
+and cases msgs cs : f = unions (case msgs) cs
+
+and dec_fields msgs dfs =
+  decs msgs (List.map (fun df -> df.it.dec) dfs)
+
+and dec msgs d = match d.it with
+  | ExpD e -> (exp msgs e, S.empty)
+  | LetD (p, e, None) -> pat msgs p +++ exp msgs e
+  | LetD (p, e, Some f) -> pat msgs p +++ exp msgs e +++ exp msgs f
+  | VarD (i, e) -> (M.empty, S.singleton i.it) +++ exp msgs e
+  | TypD (i, tp, t) -> (M.empty, S.empty)
+  | ClassD (csp, i, tp, p, t, s, i', dfs) ->
+    (M.empty, S.singleton i.it) +++ delayify (
+      group msgs (dec_fields msgs dfs @ class_self d.at i') /// pat msgs p /// shared_pat msgs csp
+    )
+
+(* The class self binding is treated as defined at the very end of the group *)
+and class_self at i : group = [(at, S.singleton i.it, S.empty, S.empty)]
+
+and decs msgs decs : group =
+  (* Annotate the declarations with the analysis results *)
+  List.map (fun d ->
+    let (f, defs) = dec msgs d in
+    (d.at, defs, eager_vars f, delayed_vars f)
+  ) decs
+
+and group msgs (grp : group) : f =
+  (* Create a map from declared variable to their definition point *)
+  let defWhen = M.disjoint_unions (List.mapi (fun i (_, defs, _, _) -> map_of_set i defs) grp) in
+  (* Calculate the relation R *)
+  let r = NameRel.unions (List.map (fun (_, defs, _, delayed) -> NameRel.cross defs delayed) grp) in
+  (* Check for errors *)
+  List.iteri (fun i (at, _, eager, _) ->
+    NameRel.iter (fun x y ->
+      match M.find_opt y defWhen with
+      | Some j ->
+        (* At position i, we are evaluating something that requires y, which is
+           defined after j *)
+        if j < i
+        then () (* all izz well *)
+        else
+          Diag.add_msg
+            msgs
+            (Diag.error_message
+               at
+               "M0016"
+               "definedness"
+               (Printf.sprintf "cannot use %s before %s has been defined" x y))
+      | None ->
+        (* External variable, ok for now *)
+        ()
+    ) (NameRel.restricted_rtcl eager r)
+  ) grp;
+  (* Now calculate the analysis result: Eager is everything that is eager, or
+     used by eager things *)
+  let e = set_unions (List.map (fun (_,_,eager,_) ->
+    NameRel.range (NameRel.restricted_rtcl eager r)
+  ) grp) in
+  (* Everything else is lazy *)
+  let d = S.diff (set_unions (List.map (fun (_,_,_,delayed) -> delayed) grp)) e in
+  (* And remove whats defined here  *)
+  M.disjoint_union (map_of_set Eager e) (map_of_set Delayed d) |>
+    M.filter (fun v _ -> M.mem v defWhen = false)
+
+let check_prog prog =
+  Diag.with_message_store (fun msgs ->
+    ignore (group msgs (decs msgs prog.it));
+    Some ()
+  )
+
+let check_lib lib =
+  Diag.with_message_store (fun msgs ->
+    let (imp_ds, ds) = CompUnit.decs_of_lib lib in
+    ignore (group msgs (decs msgs (imp_ds @ ds)));
+    Some ()
+  )
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/effect.ml.html b/coverage/mo_frontend/effect.ml.html new file mode 100644 index 00000000000..f794317d732 --- /dev/null +++ b/coverage/mo_frontend/effect.ml.html @@ -0,0 +1,487 @@ + + + + + effect.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+
+
open Mo_def
+open Mo_types
+
+open Syntax
+open Source
+
+module T = Type
+
+(* a simple effect analysis to annote expressions as Triv(ial) (await-free) or Await (containing unprotected awaits) *)
+
+(* in future we could merge this with the type-checker
+   but I prefer to keep it mostly separate for now *)
+
+let max_eff e1 e2 =
+  match e1,e2 with
+  | T.Triv,T.Triv -> T.Triv
+  | _ , T.Await -> T.Await
+  | T.Await,_ -> T.Await
+
+let max_effs = List.fold_left max_eff T.Triv
+let map_max_effs f l = max_effs (List.map f l)
+
+let typ phrase = phrase.note.note_typ
+
+let eff phrase = phrase.note.note_eff
+
+let is_triv phrase  =
+  eff phrase = T.Triv
+
+let is_shared_func exp =
+  T.(match typ exp with
+    | Func (Shared _, _, _, _, _) -> true
+    | _ -> false)
+
+let is_local_async_func exp =
+ T.(match typ exp with
+   | Func (Local, Returns,
+      { sort = Scope; _ }::_,
+       _,
+      [Async (Fut, Var (_ ,0), _)]) -> true
+   | _ -> false)
+
+let is_async_call exp1 inst exp2 =
+   is_shared_func exp1 ||
+   is_local_async_func exp1
+
+let effect_exp (exp:Syntax.exp) : T.eff = eff exp
+
+(* infer the effect of an expression, assuming all sub-expressions are correctly effect-annotated es *)
+let rec infer_effect_exp (exp:Syntax.exp) : T.eff =
+  match exp.it with
+  | CallE (exp1, inst, exp2) when is_async_call exp1 inst exp2 ->
+    T.Await
+  | PrimE _
+  | VarE _
+  | LitE _
+  | ActorUrlE _
+  | ImportE _
+  | FuncE _ ->
+    T.Triv
+  | UnE (_, _, exp1)
+  | ShowE (_, exp1)
+  | FromCandidE exp1
+  | ProjE (exp1, _)
+  | OptE exp1
+  | DoOptE exp1
+  | BangE exp1
+  | TagE (_, exp1)
+  | DotE (exp1, _)
+  | NotE exp1
+  | OldE (exp1)
+  | AssertE (_, exp1)
+  | LabelE (_, _, exp1)
+  | BreakE (_, exp1)
+  | RetE exp1
+  | AnnotE (exp1, _)
+  | IgnoreE exp1
+  | LoopE (exp1, None) ->
+    effect_exp exp1
+  | BinE (_, exp1, _, exp2)
+  | IdxE (exp1, exp2)
+  | RelE (_, exp1, _, exp2)
+  | AssignE (exp1, exp2)
+  | CallE (exp1, _, exp2)
+  | AndE (exp1, exp2)
+  | OrE (exp1, exp2)
+  | ImpliesE (exp1, exp2)
+  | WhileE (exp1, exp2)
+  | LoopE (exp1, Some exp2)
+  | ForE (_, exp1, exp2) ->
+    let t1 = effect_exp exp1 in
+    let t2 = effect_exp exp2 in
+    max_eff t1 t2
+  | DebugE exp1 ->
+    effect_exp exp1
+  | ToCandidE exps
+  | TupE exps
+  | ArrayE (_, exps) ->
+    map_max_effs effect_exp exps
+  | BlockE decs ->
+    map_max_effs effect_dec decs
+  | ObjBlockE (sort, dfs) ->
+    infer_effect_dec_fields dfs
+  | ObjE (bases, efs) ->
+    let bases = map_max_effs effect_exp bases in
+    let fields = infer_effect_exp_fields efs in
+    max_eff fields bases
+  | IfE (exp1, exp2, exp3) ->
+    map_max_effs effect_exp [exp1; exp2; exp3]
+  | SwitchE (exp1, cases) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_cases cases in
+    max_eff e1 e2
+  | AsyncE (T.Fut, _, _) ->
+    T.Await
+  | AsyncE (T.Cmp, _, _) ->
+    T.Triv
+  | ThrowE _
+  | TryE _
+  | AwaitE _ ->
+    T.Await (* TBR: perhaps we should rename the effect *)
+
+and effect_cases cases =
+  match cases with
+  | [] ->
+    T.Triv
+  | {it = {pat; exp}; _}::cases' ->
+    let e = effect_exp exp in
+    max_eff e (effect_cases cases')
+
+and infer_effect_dec_fields dfs =
+  List.fold_left (fun e (df : dec_field) -> max_eff e (effect_dec df.it.dec)) T.Triv dfs
+
+and infer_effect_exp_fields efs =
+  List.fold_left (fun e (ef : exp_field) -> max_eff e (effect_exp ef.it.exp)) T.Triv efs
+
+and effect_dec dec =
+  dec.note.note_eff
+
+and infer_effect_dec dec =
+  match dec.it with
+  | LetD (_, e, Some f) ->
+    max_eff (effect_exp e) (effect_exp f)
+  | ExpD e
+  | LetD (_, e, None)
+  | VarD (_, e) ->
+    effect_exp e
+  | TypD _
+  | ClassD _ ->
+    T.Triv
+
+
+
+ + + diff --git a/coverage/mo_frontend/error_reporting.ml.html b/coverage/mo_frontend/error_reporting.ml.html new file mode 100644 index 00000000000..d33af088b4d --- /dev/null +++ b/coverage/mo_frontend/error_reporting.ml.html @@ -0,0 +1,440 @@ + + + + + error_reporting.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+
+
open Parser
+open Parser.MenhirInterpreter
+
+(* In order to submit artificial tokens to the parser, we need a function that
+   converts a terminal symbol to a (dummy) token. Unfortunately, we cannot (in
+   general) auto-generate this code, because it requires making up semantic
+   values of arbitrary OCaml types. *)
+
+let terminal2token (type a) (symbol : a terminal) : token =
+  match symbol with
+      | T_error -> assert false
+      | T_XOROP -> XOROP
+      | T_XORASSIGN -> XORASSIGN
+      | T_WHILE -> WHILE
+      | T_VAR -> VAR
+      | T_SHROP -> SHROP
+      | T_SHRASSIGN -> SHRASSIGN
+      | T_UNDERSCORE -> UNDERSCORE
+      | T_COMPOSITE -> COMPOSITE
+      | T_TYPE -> TYPE
+      | T_TRY -> TRY
+      | T_THROW -> THROW
+      | T_TEXT -> TEXT "..."
+      | T_SWITCH -> SWITCH
+      | T_SUBOP -> SUBOP
+      | T_SUB -> SUB
+      | T_SHLOP -> SHLOP
+      | T_SHLASSIGN -> SHLASSIGN
+      | T_SHARED -> SHARED
+      | T_SEMICOLON_EOL -> SEMICOLON_EOL
+      | T_SEMICOLON -> SEMICOLON
+      | T_STABLE -> STABLE
+      | T_SYSTEM -> SYSTEM
+      | T_WITH -> WITH
+      | T_RPAR -> RPAR
+      | T_ROTROP -> ROTROP
+      | T_ROTRASSIGN -> ROTRASSIGN
+      | T_ROTLOP -> ROTLOP
+      | T_ROTLASSIGN -> ROTLASSIGN
+      | T_RETURN -> RETURN
+      | T_RCURLY -> RCURLY
+      | T_RBRACKET -> RBRACKET
+      | T_QUEST -> QUEST
+      | T_BANG -> BANG
+      | T_QUERY -> QUERY
+      | T_PUBLIC -> PUBLIC
+      | T_PRIVATE -> PRIVATE
+      | T_PRIM -> PRIM
+      | T_POWOP -> POWOP
+      | T_POWASSIGN -> POWASSIGN
+      | T_PLUSASSIGN -> PLUSASSIGN
+      | T_OROP -> OROP
+      | T_ORASSIGN -> ORASSIGN
+      | T_OR -> OR
+      | T_OBJECT -> OBJECT
+      | T_NULL -> NULL
+      | T_NOT -> NOT
+      | T_NEQOP -> NEQOP
+      | T_NAT -> NAT "<nat>"
+      | T_MULOP -> MULOP
+      | T_MULASSIGN -> MULASSIGN
+      | T_MODULE -> MODULE
+      | T_MODOP -> MODOP
+      | T_MODASSIGN -> MODASSIGN
+      | T_MINUSASSIGN -> MINUSASSIGN
+      | T_LTOP -> LTOP
+      | T_LT -> LT
+      | T_LPAR -> LPAR
+      | T_LOOP -> LOOP
+      | T_LET -> LET
+      | T_LEOP -> LEOP
+      | T_LCURLY -> LCURLY
+      | T_LBRACKET -> LBRACKET
+      | T_LABEL -> LABEL
+      | T_IN -> IN
+      | T_IMPORT -> IMPORT
+      | T_IGNORE -> IGNORE
+      | T_IF -> IF
+      | T_ID -> ID "<id>"
+      | T_HASH -> HASH
+      | T_GTOP -> GTOP
+      | T_GT -> GT
+      | T_GEOP -> GEOP
+      | T_FUNC -> FUNC
+      | T_FOR -> FOR
+      | T_FLEXIBLE -> FLEXIBLE
+      | T_FLOAT -> FLOAT "<float>"
+      | T_EQOP -> EQOP
+      | T_EQ -> EQ
+      | T_EOF -> EOF
+      | T_ELSE -> ELSE
+      | T_DOT_NUM -> DOT_NUM "<num>"
+      | T_DOT -> DOT
+      | T_DO -> DO
+      | T_DIVOP -> DIVOP
+      | T_DIVASSIGN -> DIVASSIGN
+      | T_DISALLOWED -> DISALLOWED
+      | T_DEBUG_SHOW -> DEBUG_SHOW
+      | T_TO_CANDID -> TO_CANDID
+      | T_FROM_CANDID -> FROM_CANDID
+      | T_DEBUG -> DEBUG
+      | T_CONTINUE -> CONTINUE
+      | T_COMMA -> COMMA
+      | T_COLON -> COLON
+      | T_CLASS -> CLASS
+      | T_CHAR -> CHAR 0
+      | T_CATCH -> CATCH
+      | T_CATASSIGN -> CATASSIGN
+      | T_CASE -> CASE
+      | T_BREAK -> BREAK
+      | T_BOOL -> BOOL false
+      | T_AWAIT -> AWAIT
+      | T_AWAITSTAR -> AWAITSTAR
+      | T_ASYNC -> ASYNC
+      | T_ASYNCSTAR -> ASYNCSTAR
+      | T_ASSIGN -> ASSIGN
+      | T_ASSERT -> ASSERT
+      | T_ARROW -> ARROW
+      | T_ANDOP -> ANDOP
+      | T_ANDASSIGN -> ANDASSIGN
+      | T_AND -> AND
+      | T_IMPLIES -> IMPLIES
+      | T_OLD -> OLD
+      | T_ADDOP -> ADDOP
+      | T_ACTOR -> ACTOR
+      | T_INVARIANT -> INVARIANT
+      | T_WRAPADDOP -> WRAPADDOP
+      | T_WRAPSUBOP -> WRAPSUBOP
+      | T_WRAPMULOP -> WRAPMULOP
+      | T_WRAPPOWOP -> WRAPPOWOP
+      | T_WRAPADDASSIGN -> WRAPADDASSIGN
+      | T_WRAPSUBASSIGN -> WRAPSUBASSIGN
+      | T_WRAPMULASSIGN -> WRAPMULASSIGN
+      | T_WRAPPOWASSIGN -> WRAPPOWASSIGN
+      | T_PIPE -> PIPE
+
+
+
+ + + diff --git a/coverage/mo_frontend/lexer.ml.html b/coverage/mo_frontend/lexer.ml.html new file mode 100644 index 00000000000..cf29ded5451 --- /dev/null +++ b/coverage/mo_frontend/lexer.ml.html @@ -0,0 +1,290 @@ + + + + + lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+
+
module ST = Source_token
+open Mo_def.Trivia
+include Lexer_lib
+
+type source_token = ST.token * Lexing.position * Lexing.position
+
+type parser_token = Parser.token * Lexing.position * Lexing.position
+
+let first (t, _, _) = t
+
+let opt_is_whitespace : 'a trivia option -> bool =
+ fun x -> Option.fold ~none:false ~some:ST.is_whitespace x
+
+let tokenizer (mode : Lexer_lib.mode) (lexbuf : Lexing.lexbuf) :
+    (unit -> parser_token) * triv_table =
+  let trivia_table : triv_table = PosHashtbl.create 1013 in
+  let lookahead : source_token option ref = ref None in
+  (* We keep the trailing whitespace of the previous token
+     around so we can disambiguate operators *)
+  let last_trailing : line_feed trivia list ref = ref [] in
+  let next () : source_token =
+    match !lookahead with
+    | Some t ->
+        lookahead := None;
+        t
+    | None ->
+        let token = Source_lexer.token mode lexbuf in
+        let start = Lexing.lexeme_start_p lexbuf in
+        let end_ = Lexing.lexeme_end_p lexbuf in
+        (token, start, end_)
+  in
+  let peek () : source_token =
+    match !lookahead with
+    | None ->
+        let token = next () in
+        lookahead := Some token;
+        token
+    | Some t -> t
+  in
+  let next_parser_token () : parser_token =
+    let rec eat_leading acc =
+      let token, start, end_ = next () in
+      match ST.to_parser_token token with
+      (* A semicolon immediately followed by a newline gets a special token for the REPL *)
+      | Ok Parser.SEMICOLON when ST.is_line_feed (first (peek ())) ->
+          (List.rev acc, (Parser.SEMICOLON_EOL, start, end_))
+      (* >> can either close two nested type applications, or be a shift
+         operator depending on whether it's prefixed with whitespace *)
+      | Ok Parser.GT
+        when opt_is_whitespace (Lib.List.hd_opt (acc @ List.rev !last_trailing))
+             && first (peek ()) = ST.GT ->
+          let _, _, end_ = next () in
+          (acc, (Parser.SHROP, start, end_))
+      | Ok t -> (List.rev acc, (t, start, end_))
+      | Error t -> eat_leading (t :: acc)
+    in
+    let rec eat_trailing acc =
+      match ST.is_lineless_trivia (first (peek ())) with
+      | Some t ->
+          ignore (next ());
+          eat_trailing (t :: acc)
+      | None -> List.rev acc
+    in
+    let leading_trivia, (token, start, end_) = eat_leading [] in
+    let trailing_trivia = eat_trailing [] in
+    let leading_ws () =
+      opt_is_whitespace (Lib.List.last_opt (!last_trailing @ leading_trivia))
+    in
+    let trailing_ws () =
+      opt_is_whitespace (Lib.List.hd_opt trailing_trivia)
+      || (trailing_trivia = [] && ST.is_line_feed (first (peek ())))
+    in
+    (* Disambiguating operators based on whitespace *)
+    let token =
+      match token with
+      | Parser.GT when leading_ws () && trailing_ws () -> Parser.GTOP
+      | Parser.LT when leading_ws () && trailing_ws () -> Parser.LTOP
+      | _ -> token
+    in
+    last_trailing := List.map (map_trivia absurd) trailing_trivia;
+    PosHashtbl.add trivia_table (pos_of_lexpos start)
+      { leading_trivia; trailing_trivia };
+    (token, start, end_)
+  in
+  (next_parser_token, trivia_table)
+
+
+
+ + + diff --git a/coverage/mo_frontend/lexer_lib.ml.html b/coverage/mo_frontend/lexer_lib.ml.html new file mode 100644 index 00000000000..84cdb69a5b2 --- /dev/null +++ b/coverage/mo_frontend/lexer_lib.ml.html @@ -0,0 +1,116 @@ + + + + + lexer_lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
+
(**
+  This module exists so it can be included by lexer.ml. This way
+  source_lexer.ml can use these definitions but stay internal to
+  lexer.ml.
+*)
+type mode = {
+  privileged : bool;
+  verification : bool;
+}
+
+let mode : mode = {
+  privileged = Option.is_some (Sys.getenv_opt "MOC_UNLOCK_PRIM");
+  verification = Option.is_some (Sys.getenv_opt "MOC_UNLOCK_VERIFICATION");
+}
+
+let mode_priv : mode = { mode with privileged = true }
+let mode_verification : mode = { mode with verification = true }
+
+
+exception Error of Source.region * string
+
+let convert_pos pos =
+  { Source.file = pos.Lexing.pos_fname;
+    Source.line = pos.Lexing.pos_lnum;
+    Source.column = pos.Lexing.pos_cnum - pos.Lexing.pos_bol
+  }
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/menhir_error_reporting.ml.html b/coverage/mo_frontend/menhir_error_reporting.ml.html new file mode 100644 index 00000000000..90e8c671356 --- /dev/null +++ b/coverage/mo_frontend/menhir_error_reporting.ml.html @@ -0,0 +1,567 @@ + + + + + menhir_error_reporting.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+
+
module Make
+  (I : MenhirLib.IncrementalEngine.EVERYTHING)
+  (User : sig
+
+    (* In order to submit artificial tokens to the parser, we need a function
+       that converts a terminal symbol to a token. Unfortunately, we cannot
+       (in general) auto-generate this code, because it requires making up
+       semantic values of arbitrary OCaml types. *)
+
+    val terminal2token: _ I.terminal -> I.token
+
+  end)
+= struct
+
+  open MenhirLib.General
+  open I
+  open User
+
+  (* ------------------------------------------------------------------------ *)
+
+  (* Explanations. *)
+
+  type explanation = {
+    item: item;
+    past: (xsymbol * Lexing.position * Lexing.position) list
+  }
+
+  let item explanation =
+    explanation.item
+
+  let past explanation =
+    explanation.past
+
+  let future explanation =
+    let prod, index = explanation.item in
+    let rhs = rhs prod in
+    drop index rhs
+
+  let goal explanation =
+    let prod, _ = explanation.item in
+    lhs prod
+
+  (* ------------------------------------------------------------------------ *)
+
+  (* [items_current env] assumes that [env] is not an initial state (which
+     implies that the stack is non-empty). Under this assumption, it extracts
+     the automaton's current state, i.e., the LR(1) state found in the top
+     stack cell. It then goes through [items] so as to obtain the LR(0) items
+     associated with this state. *)
+
+  let items_current env : item list =
+    (* Get the current state. *)
+    match Lazy.force (stack env) with
+    | Nil ->
+        (* If we get here, then the stack is empty, which means the parser
+           is in an initial state. This should not happen. *)
+        invalid_arg "items_current" (* TEMPORARY it DOES happen! *)
+    | Cons (Element (current, _, _, _), _) ->
+        (* Extract the current state out of the top stack element, and
+           convert it to a set of LR(0) items. Returning a set of items
+           instead of an ['a lr1state] is convenient; returning [current]
+           would require wrapping it in an existential type. *)
+        items current
+
+  (* [is_shift_item t item] determines whether [item] justifies a shift
+     transition along the terminal symbol [t]. *)
+
+  let is_shift_item (t : _ terminal) (prod, index) : bool =
+    let rhs = rhs prod in
+    let length = List.length rhs in
+    assert (0 < index && index <= length);
+    (* We test that there is one symbol after the bullet and this symbol
+       is [t] or can generate a word that begins with [t]. (Note that we
+       don't need to worry about the case where this symbol is nullable
+       and [t] is generated by the following symbol. In that situation,
+       we would have to reduce before we can shift [t].) *)
+    index < length && xfirst (List.nth rhs index) t
+
+  let compare_explanations x1 x2 =
+    let c = compare_items x1.item x2.item in
+    (* TEMPORARY checking that if [c] is 0 then the positions are the same *)
+    assert (
+      c <> 0 || List.for_all2 (fun (_, start1, end1) (_, start2, end2) ->
+        start1.Lexing.pos_cnum = start2.Lexing.pos_cnum &&
+        end1.Lexing.pos_cnum = end2.Lexing.pos_cnum
+      ) x1.past x2.past
+    );
+    c
+
+  (* [marry past stack] TEMPORARY comment *)
+
+  let rec marry past stack =
+    match past, stack with
+    | [], _ ->
+        []
+    | symbol :: past, lazy (Cons (Element (s, _, startp, endp), stack)) ->
+        assert (compare_symbols symbol (X (incoming_symbol s)) = 0);
+        (symbol, startp, endp) :: marry past stack
+    | _ :: _, lazy Nil ->
+        assert false
+
+  (* [accumulate t env explanations] is called if the parser decides to shift
+     the test token [t]. The parameter [env] describes the parser configuration
+     before it shifts this token. (Some reductions have taken place.) We use the
+     shift items found in [env] to produce new explanations. *)
+
+  let accumulate (t : _ terminal) env explanations =
+    (* The parser is about to shift, which means it is willing to
+       consume the terminal symbol [t]. In the state before the
+       transition, look at the items that justify shifting [t].
+       We view these items as explanations: they explain what
+       we have read and what we expect to read. *)
+    let stack = stack env in
+    List.fold_left (fun explanations item ->
+      if is_shift_item t item then
+        let prod, index = item in
+        let rhs = rhs prod in
+        {
+          item = item;
+          past = List.rev (marry (List.rev (take index rhs)) stack)
+        } :: explanations
+      else
+        explanations
+    ) explanations (items_current env)
+      (* TEMPORARY [env] may be an initial state!
+         violating [item_current]'s precondition *)
+
+  (* [investigate pos checkpoint] assumes that [checkpoint] is of the form
+     [InputNeeded _].  For every terminal symbol [t], it investigates
+     how the parser reacts when fed the symbol [t], and returns a list
+     of explanations. The position [pos] is where a syntax error was
+     detected; it is used when manufacturing dummy tokens. This is
+     important because the position of the dummy token may end up in
+     the explanations that we produce. *)
+
+  let investigate pos (checkpoint : _ checkpoint) : explanation list =
+    weed compare_explanations (
+      foreach_terminal_but_error (fun symbol explanations ->
+        match symbol with
+        | X (N _) -> assert false
+        | X (T t) ->
+            (* Build a dummy token for the terminal symbol [t]. *)
+            let token = (terminal2token t, pos, pos) in
+            (* Submit it to the parser. Accumulate explanations. *)
+            match shifts (offer checkpoint token) with
+            | None ->
+                explanations
+            | Some env ->
+                accumulate t env explanations
+      ) []
+    )
+
+  (* We drive the parser in the usual way, but records the last [InputNeeded]
+     checkpoint. If a syntax error is detected, we go back to this checkpoint
+     and analyze it in order to produce a meaningful diagnostic. *)
+
+  exception Error of (Lexing.position * Lexing.position) * explanation list
+
+  let entry (start : 'a I.checkpoint) lexer =
+    let fail (inputneeded : 'a I.checkpoint) (checkpoint : 'a I.checkpoint) =
+      (* The parser signals a syntax error. Note the position of the
+         problematic token, which is useful. Then, go back to the
+         last [InputNeeded] checkpoint and investigate. *)
+      match checkpoint with
+      | HandlingError env ->
+          let (startp, _) as positions = positions env in
+          raise (Error (positions, investigate startp inputneeded))
+      | _ ->
+          assert false
+    in
+    I.loop_handle_undo Fun.id fail lexer start
+
+  (* TEMPORARY could also publish a list of the terminal symbols that
+     do not cause an error *)
+
+end
+
+
+
+ + + diff --git a/coverage/mo_frontend/parser.ml.html b/coverage/mo_frontend/parser.ml.html new file mode 100644 index 00000000000..4501527acea --- /dev/null +++ b/coverage/mo_frontend/parser.ml.html @@ -0,0 +1,97187 @@ + + + + + parser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+   10
+   11
+   12
+   13
+   14
+   15
+   16
+   17
+   18
+   19
+   20
+   21
+   22
+   23
+   24
+   25
+   26
+   27
+   28
+   29
+   30
+   31
+   32
+   33
+   34
+   35
+   36
+   37
+   38
+   39
+   40
+   41
+   42
+   43
+   44
+   45
+   46
+   47
+   48
+   49
+   50
+   51
+   52
+   53
+   54
+   55
+   56
+   57
+   58
+   59
+   60
+   61
+   62
+   63
+   64
+   65
+   66
+   67
+   68
+   69
+   70
+   71
+   72
+   73
+   74
+   75
+   76
+   77
+   78
+   79
+   80
+   81
+   82
+   83
+   84
+   85
+   86
+   87
+   88
+   89
+   90
+   91
+   92
+   93
+   94
+   95
+   96
+   97
+   98
+   99
+  100
+  101
+  102
+  103
+  104
+  105
+  106
+  107
+  108
+  109
+  110
+  111
+  112
+  113
+  114
+  115
+  116
+  117
+  118
+  119
+  120
+  121
+  122
+  123
+  124
+  125
+  126
+  127
+  128
+  129
+  130
+  131
+  132
+  133
+  134
+  135
+  136
+  137
+  138
+  139
+  140
+  141
+  142
+  143
+  144
+  145
+  146
+  147
+  148
+  149
+  150
+  151
+  152
+  153
+  154
+  155
+  156
+  157
+  158
+  159
+  160
+  161
+  162
+  163
+  164
+  165
+  166
+  167
+  168
+  169
+  170
+  171
+  172
+  173
+  174
+  175
+  176
+  177
+  178
+  179
+  180
+  181
+  182
+  183
+  184
+  185
+  186
+  187
+  188
+  189
+  190
+  191
+  192
+  193
+  194
+  195
+  196
+  197
+  198
+  199
+  200
+  201
+  202
+  203
+  204
+  205
+  206
+  207
+  208
+  209
+  210
+  211
+  212
+  213
+  214
+  215
+  216
+  217
+  218
+  219
+  220
+  221
+  222
+  223
+  224
+  225
+  226
+  227
+  228
+  229
+  230
+  231
+  232
+  233
+  234
+  235
+  236
+  237
+  238
+  239
+  240
+  241
+  242
+  243
+  244
+  245
+  246
+  247
+  248
+  249
+  250
+  251
+  252
+  253
+  254
+  255
+  256
+  257
+  258
+  259
+  260
+  261
+  262
+  263
+  264
+  265
+  266
+  267
+  268
+  269
+  270
+  271
+  272
+  273
+  274
+  275
+  276
+  277
+  278
+  279
+  280
+  281
+  282
+  283
+  284
+  285
+  286
+  287
+  288
+  289
+  290
+  291
+  292
+  293
+  294
+  295
+  296
+  297
+  298
+  299
+  300
+  301
+  302
+  303
+  304
+  305
+  306
+  307
+  308
+  309
+  310
+  311
+  312
+  313
+  314
+  315
+  316
+  317
+  318
+  319
+  320
+  321
+  322
+  323
+  324
+  325
+  326
+  327
+  328
+  329
+  330
+  331
+  332
+  333
+  334
+  335
+  336
+  337
+  338
+  339
+  340
+  341
+  342
+  343
+  344
+  345
+  346
+  347
+  348
+  349
+  350
+  351
+  352
+  353
+  354
+  355
+  356
+  357
+  358
+  359
+  360
+  361
+  362
+  363
+  364
+  365
+  366
+  367
+  368
+  369
+  370
+  371
+  372
+  373
+  374
+  375
+  376
+  377
+  378
+  379
+  380
+  381
+  382
+  383
+  384
+  385
+  386
+  387
+  388
+  389
+  390
+  391
+  392
+  393
+  394
+  395
+  396
+  397
+  398
+  399
+  400
+  401
+  402
+  403
+  404
+  405
+  406
+  407
+  408
+  409
+  410
+  411
+  412
+  413
+  414
+  415
+  416
+  417
+  418
+  419
+  420
+  421
+  422
+  423
+  424
+  425
+  426
+  427
+  428
+  429
+  430
+  431
+  432
+  433
+  434
+  435
+  436
+  437
+  438
+  439
+  440
+  441
+  442
+  443
+  444
+  445
+  446
+  447
+  448
+  449
+  450
+  451
+  452
+  453
+  454
+  455
+  456
+  457
+  458
+  459
+  460
+  461
+  462
+  463
+  464
+  465
+  466
+  467
+  468
+  469
+  470
+  471
+  472
+  473
+  474
+  475
+  476
+  477
+  478
+  479
+  480
+  481
+  482
+  483
+  484
+  485
+  486
+  487
+  488
+  489
+  490
+  491
+  492
+  493
+  494
+  495
+  496
+  497
+  498
+  499
+  500
+  501
+  502
+  503
+  504
+  505
+  506
+  507
+  508
+  509
+  510
+  511
+  512
+  513
+  514
+  515
+  516
+  517
+  518
+  519
+  520
+  521
+  522
+  523
+  524
+  525
+  526
+  527
+  528
+  529
+  530
+  531
+  532
+  533
+  534
+  535
+  536
+  537
+  538
+  539
+  540
+  541
+  542
+  543
+  544
+  545
+  546
+  547
+  548
+  549
+  550
+  551
+  552
+  553
+  554
+  555
+  556
+  557
+  558
+  559
+  560
+  561
+  562
+  563
+  564
+  565
+  566
+  567
+  568
+  569
+  570
+  571
+  572
+  573
+  574
+  575
+  576
+  577
+  578
+  579
+  580
+  581
+  582
+  583
+  584
+  585
+  586
+  587
+  588
+  589
+  590
+  591
+  592
+  593
+  594
+  595
+  596
+  597
+  598
+  599
+  600
+  601
+  602
+  603
+  604
+  605
+  606
+  607
+  608
+  609
+  610
+  611
+  612
+  613
+  614
+  615
+  616
+  617
+  618
+  619
+  620
+  621
+  622
+  623
+  624
+  625
+  626
+  627
+  628
+  629
+  630
+  631
+  632
+  633
+  634
+  635
+  636
+  637
+  638
+  639
+  640
+  641
+  642
+  643
+  644
+  645
+  646
+  647
+  648
+  649
+  650
+  651
+  652
+  653
+  654
+  655
+  656
+  657
+  658
+  659
+  660
+  661
+  662
+  663
+  664
+  665
+  666
+  667
+  668
+  669
+  670
+  671
+  672
+  673
+  674
+  675
+  676
+  677
+  678
+  679
+  680
+  681
+  682
+  683
+  684
+  685
+  686
+  687
+  688
+  689
+  690
+  691
+  692
+  693
+  694
+  695
+  696
+  697
+  698
+  699
+  700
+  701
+  702
+  703
+  704
+  705
+  706
+  707
+  708
+  709
+  710
+  711
+  712
+  713
+  714
+  715
+  716
+  717
+  718
+  719
+  720
+  721
+  722
+  723
+  724
+  725
+  726
+  727
+  728
+  729
+  730
+  731
+  732
+  733
+  734
+  735
+  736
+  737
+  738
+  739
+  740
+  741
+  742
+  743
+  744
+  745
+  746
+  747
+  748
+  749
+  750
+  751
+  752
+  753
+  754
+  755
+  756
+  757
+  758
+  759
+  760
+  761
+  762
+  763
+  764
+  765
+  766
+  767
+  768
+  769
+  770
+  771
+  772
+  773
+  774
+  775
+  776
+  777
+  778
+  779
+  780
+  781
+  782
+  783
+  784
+  785
+  786
+  787
+  788
+  789
+  790
+  791
+  792
+  793
+  794
+  795
+  796
+  797
+  798
+  799
+  800
+  801
+  802
+  803
+  804
+  805
+  806
+  807
+  808
+  809
+  810
+  811
+  812
+  813
+  814
+  815
+  816
+  817
+  818
+  819
+  820
+  821
+  822
+  823
+  824
+  825
+  826
+  827
+  828
+  829
+  830
+  831
+  832
+  833
+  834
+  835
+  836
+  837
+  838
+  839
+  840
+  841
+  842
+  843
+  844
+  845
+  846
+  847
+  848
+  849
+  850
+  851
+  852
+  853
+  854
+  855
+  856
+  857
+  858
+  859
+  860
+  861
+  862
+  863
+  864
+  865
+  866
+  867
+  868
+  869
+  870
+  871
+  872
+  873
+  874
+  875
+  876
+  877
+  878
+  879
+  880
+  881
+  882
+  883
+  884
+  885
+  886
+  887
+  888
+  889
+  890
+  891
+  892
+  893
+  894
+  895
+  896
+  897
+  898
+  899
+  900
+  901
+  902
+  903
+  904
+  905
+  906
+  907
+  908
+  909
+  910
+  911
+  912
+  913
+  914
+  915
+  916
+  917
+  918
+  919
+  920
+  921
+  922
+  923
+  924
+  925
+  926
+  927
+  928
+  929
+  930
+  931
+  932
+  933
+  934
+  935
+  936
+  937
+  938
+  939
+  940
+  941
+  942
+  943
+  944
+  945
+  946
+  947
+  948
+  949
+  950
+  951
+  952
+  953
+  954
+  955
+  956
+  957
+  958
+  959
+  960
+  961
+  962
+  963
+  964
+  965
+  966
+  967
+  968
+  969
+  970
+  971
+  972
+  973
+  974
+  975
+  976
+  977
+  978
+  979
+  980
+  981
+  982
+  983
+  984
+  985
+  986
+  987
+  988
+  989
+  990
+  991
+  992
+  993
+  994
+  995
+  996
+  997
+  998
+  999
+ 1000
+ 1001
+ 1002
+ 1003
+ 1004
+ 1005
+ 1006
+ 1007
+ 1008
+ 1009
+ 1010
+ 1011
+ 1012
+ 1013
+ 1014
+ 1015
+ 1016
+ 1017
+ 1018
+ 1019
+ 1020
+ 1021
+ 1022
+ 1023
+ 1024
+ 1025
+ 1026
+ 1027
+ 1028
+ 1029
+ 1030
+ 1031
+ 1032
+ 1033
+ 1034
+ 1035
+ 1036
+ 1037
+ 1038
+ 1039
+ 1040
+ 1041
+ 1042
+ 1043
+ 1044
+ 1045
+ 1046
+ 1047
+ 1048
+ 1049
+ 1050
+ 1051
+ 1052
+ 1053
+ 1054
+ 1055
+ 1056
+ 1057
+ 1058
+ 1059
+ 1060
+ 1061
+ 1062
+ 1063
+ 1064
+ 1065
+ 1066
+ 1067
+ 1068
+ 1069
+ 1070
+ 1071
+ 1072
+ 1073
+ 1074
+ 1075
+ 1076
+ 1077
+ 1078
+ 1079
+ 1080
+ 1081
+ 1082
+ 1083
+ 1084
+ 1085
+ 1086
+ 1087
+ 1088
+ 1089
+ 1090
+ 1091
+ 1092
+ 1093
+ 1094
+ 1095
+ 1096
+ 1097
+ 1098
+ 1099
+ 1100
+ 1101
+ 1102
+ 1103
+ 1104
+ 1105
+ 1106
+ 1107
+ 1108
+ 1109
+ 1110
+ 1111
+ 1112
+ 1113
+ 1114
+ 1115
+ 1116
+ 1117
+ 1118
+ 1119
+ 1120
+ 1121
+ 1122
+ 1123
+ 1124
+ 1125
+ 1126
+ 1127
+ 1128
+ 1129
+ 1130
+ 1131
+ 1132
+ 1133
+ 1134
+ 1135
+ 1136
+ 1137
+ 1138
+ 1139
+ 1140
+ 1141
+ 1142
+ 1143
+ 1144
+ 1145
+ 1146
+ 1147
+ 1148
+ 1149
+ 1150
+ 1151
+ 1152
+ 1153
+ 1154
+ 1155
+ 1156
+ 1157
+ 1158
+ 1159
+ 1160
+ 1161
+ 1162
+ 1163
+ 1164
+ 1165
+ 1166
+ 1167
+ 1168
+ 1169
+ 1170
+ 1171
+ 1172
+ 1173
+ 1174
+ 1175
+ 1176
+ 1177
+ 1178
+ 1179
+ 1180
+ 1181
+ 1182
+ 1183
+ 1184
+ 1185
+ 1186
+ 1187
+ 1188
+ 1189
+ 1190
+ 1191
+ 1192
+ 1193
+ 1194
+ 1195
+ 1196
+ 1197
+ 1198
+ 1199
+ 1200
+ 1201
+ 1202
+ 1203
+ 1204
+ 1205
+ 1206
+ 1207
+ 1208
+ 1209
+ 1210
+ 1211
+ 1212
+ 1213
+ 1214
+ 1215
+ 1216
+ 1217
+ 1218
+ 1219
+ 1220
+ 1221
+ 1222
+ 1223
+ 1224
+ 1225
+ 1226
+ 1227
+ 1228
+ 1229
+ 1230
+ 1231
+ 1232
+ 1233
+ 1234
+ 1235
+ 1236
+ 1237
+ 1238
+ 1239
+ 1240
+ 1241
+ 1242
+ 1243
+ 1244
+ 1245
+ 1246
+ 1247
+ 1248
+ 1249
+ 1250
+ 1251
+ 1252
+ 1253
+ 1254
+ 1255
+ 1256
+ 1257
+ 1258
+ 1259
+ 1260
+ 1261
+ 1262
+ 1263
+ 1264
+ 1265
+ 1266
+ 1267
+ 1268
+ 1269
+ 1270
+ 1271
+ 1272
+ 1273
+ 1274
+ 1275
+ 1276
+ 1277
+ 1278
+ 1279
+ 1280
+ 1281
+ 1282
+ 1283
+ 1284
+ 1285
+ 1286
+ 1287
+ 1288
+ 1289
+ 1290
+ 1291
+ 1292
+ 1293
+ 1294
+ 1295
+ 1296
+ 1297
+ 1298
+ 1299
+ 1300
+ 1301
+ 1302
+ 1303
+ 1304
+ 1305
+ 1306
+ 1307
+ 1308
+ 1309
+ 1310
+ 1311
+ 1312
+ 1313
+ 1314
+ 1315
+ 1316
+ 1317
+ 1318
+ 1319
+ 1320
+ 1321
+ 1322
+ 1323
+ 1324
+ 1325
+ 1326
+ 1327
+ 1328
+ 1329
+ 1330
+ 1331
+ 1332
+ 1333
+ 1334
+ 1335
+ 1336
+ 1337
+ 1338
+ 1339
+ 1340
+ 1341
+ 1342
+ 1343
+ 1344
+ 1345
+ 1346
+ 1347
+ 1348
+ 1349
+ 1350
+ 1351
+ 1352
+ 1353
+ 1354
+ 1355
+ 1356
+ 1357
+ 1358
+ 1359
+ 1360
+ 1361
+ 1362
+ 1363
+ 1364
+ 1365
+ 1366
+ 1367
+ 1368
+ 1369
+ 1370
+ 1371
+ 1372
+ 1373
+ 1374
+ 1375
+ 1376
+ 1377
+ 1378
+ 1379
+ 1380
+ 1381
+ 1382
+ 1383
+ 1384
+ 1385
+ 1386
+ 1387
+ 1388
+ 1389
+ 1390
+ 1391
+ 1392
+ 1393
+ 1394
+ 1395
+ 1396
+ 1397
+ 1398
+ 1399
+ 1400
+ 1401
+ 1402
+ 1403
+ 1404
+ 1405
+ 1406
+ 1407
+ 1408
+ 1409
+ 1410
+ 1411
+ 1412
+ 1413
+ 1414
+ 1415
+ 1416
+ 1417
+ 1418
+ 1419
+ 1420
+ 1421
+ 1422
+ 1423
+ 1424
+ 1425
+ 1426
+ 1427
+ 1428
+ 1429
+ 1430
+ 1431
+ 1432
+ 1433
+ 1434
+ 1435
+ 1436
+ 1437
+ 1438
+ 1439
+ 1440
+ 1441
+ 1442
+ 1443
+ 1444
+ 1445
+ 1446
+ 1447
+ 1448
+ 1449
+ 1450
+ 1451
+ 1452
+ 1453
+ 1454
+ 1455
+ 1456
+ 1457
+ 1458
+ 1459
+ 1460
+ 1461
+ 1462
+ 1463
+ 1464
+ 1465
+ 1466
+ 1467
+ 1468
+ 1469
+ 1470
+ 1471
+ 1472
+ 1473
+ 1474
+ 1475
+ 1476
+ 1477
+ 1478
+ 1479
+ 1480
+ 1481
+ 1482
+ 1483
+ 1484
+ 1485
+ 1486
+ 1487
+ 1488
+ 1489
+ 1490
+ 1491
+ 1492
+ 1493
+ 1494
+ 1495
+ 1496
+ 1497
+ 1498
+ 1499
+ 1500
+ 1501
+ 1502
+ 1503
+ 1504
+ 1505
+ 1506
+ 1507
+ 1508
+ 1509
+ 1510
+ 1511
+ 1512
+ 1513
+ 1514
+ 1515
+ 1516
+ 1517
+ 1518
+ 1519
+ 1520
+ 1521
+ 1522
+ 1523
+ 1524
+ 1525
+ 1526
+ 1527
+ 1528
+ 1529
+ 1530
+ 1531
+ 1532
+ 1533
+ 1534
+ 1535
+ 1536
+ 1537
+ 1538
+ 1539
+ 1540
+ 1541
+ 1542
+ 1543
+ 1544
+ 1545
+ 1546
+ 1547
+ 1548
+ 1549
+ 1550
+ 1551
+ 1552
+ 1553
+ 1554
+ 1555
+ 1556
+ 1557
+ 1558
+ 1559
+ 1560
+ 1561
+ 1562
+ 1563
+ 1564
+ 1565
+ 1566
+ 1567
+ 1568
+ 1569
+ 1570
+ 1571
+ 1572
+ 1573
+ 1574
+ 1575
+ 1576
+ 1577
+ 1578
+ 1579
+ 1580
+ 1581
+ 1582
+ 1583
+ 1584
+ 1585
+ 1586
+ 1587
+ 1588
+ 1589
+ 1590
+ 1591
+ 1592
+ 1593
+ 1594
+ 1595
+ 1596
+ 1597
+ 1598
+ 1599
+ 1600
+ 1601
+ 1602
+ 1603
+ 1604
+ 1605
+ 1606
+ 1607
+ 1608
+ 1609
+ 1610
+ 1611
+ 1612
+ 1613
+ 1614
+ 1615
+ 1616
+ 1617
+ 1618
+ 1619
+ 1620
+ 1621
+ 1622
+ 1623
+ 1624
+ 1625
+ 1626
+ 1627
+ 1628
+ 1629
+ 1630
+ 1631
+ 1632
+ 1633
+ 1634
+ 1635
+ 1636
+ 1637
+ 1638
+ 1639
+ 1640
+ 1641
+ 1642
+ 1643
+ 1644
+ 1645
+ 1646
+ 1647
+ 1648
+ 1649
+ 1650
+ 1651
+ 1652
+ 1653
+ 1654
+ 1655
+ 1656
+ 1657
+ 1658
+ 1659
+ 1660
+ 1661
+ 1662
+ 1663
+ 1664
+ 1665
+ 1666
+ 1667
+ 1668
+ 1669
+ 1670
+ 1671
+ 1672
+ 1673
+ 1674
+ 1675
+ 1676
+ 1677
+ 1678
+ 1679
+ 1680
+ 1681
+ 1682
+ 1683
+ 1684
+ 1685
+ 1686
+ 1687
+ 1688
+ 1689
+ 1690
+ 1691
+ 1692
+ 1693
+ 1694
+ 1695
+ 1696
+ 1697
+ 1698
+ 1699
+ 1700
+ 1701
+ 1702
+ 1703
+ 1704
+ 1705
+ 1706
+ 1707
+ 1708
+ 1709
+ 1710
+ 1711
+ 1712
+ 1713
+ 1714
+ 1715
+ 1716
+ 1717
+ 1718
+ 1719
+ 1720
+ 1721
+ 1722
+ 1723
+ 1724
+ 1725
+ 1726
+ 1727
+ 1728
+ 1729
+ 1730
+ 1731
+ 1732
+ 1733
+ 1734
+ 1735
+ 1736
+ 1737
+ 1738
+ 1739
+ 1740
+ 1741
+ 1742
+ 1743
+ 1744
+ 1745
+ 1746
+ 1747
+ 1748
+ 1749
+ 1750
+ 1751
+ 1752
+ 1753
+ 1754
+ 1755
+ 1756
+ 1757
+ 1758
+ 1759
+ 1760
+ 1761
+ 1762
+ 1763
+ 1764
+ 1765
+ 1766
+ 1767
+ 1768
+ 1769
+ 1770
+ 1771
+ 1772
+ 1773
+ 1774
+ 1775
+ 1776
+ 1777
+ 1778
+ 1779
+ 1780
+ 1781
+ 1782
+ 1783
+ 1784
+ 1785
+ 1786
+ 1787
+ 1788
+ 1789
+ 1790
+ 1791
+ 1792
+ 1793
+ 1794
+ 1795
+ 1796
+ 1797
+ 1798
+ 1799
+ 1800
+ 1801
+ 1802
+ 1803
+ 1804
+ 1805
+ 1806
+ 1807
+ 1808
+ 1809
+ 1810
+ 1811
+ 1812
+ 1813
+ 1814
+ 1815
+ 1816
+ 1817
+ 1818
+ 1819
+ 1820
+ 1821
+ 1822
+ 1823
+ 1824
+ 1825
+ 1826
+ 1827
+ 1828
+ 1829
+ 1830
+ 1831
+ 1832
+ 1833
+ 1834
+ 1835
+ 1836
+ 1837
+ 1838
+ 1839
+ 1840
+ 1841
+ 1842
+ 1843
+ 1844
+ 1845
+ 1846
+ 1847
+ 1848
+ 1849
+ 1850
+ 1851
+ 1852
+ 1853
+ 1854
+ 1855
+ 1856
+ 1857
+ 1858
+ 1859
+ 1860
+ 1861
+ 1862
+ 1863
+ 1864
+ 1865
+ 1866
+ 1867
+ 1868
+ 1869
+ 1870
+ 1871
+ 1872
+ 1873
+ 1874
+ 1875
+ 1876
+ 1877
+ 1878
+ 1879
+ 1880
+ 1881
+ 1882
+ 1883
+ 1884
+ 1885
+ 1886
+ 1887
+ 1888
+ 1889
+ 1890
+ 1891
+ 1892
+ 1893
+ 1894
+ 1895
+ 1896
+ 1897
+ 1898
+ 1899
+ 1900
+ 1901
+ 1902
+ 1903
+ 1904
+ 1905
+ 1906
+ 1907
+ 1908
+ 1909
+ 1910
+ 1911
+ 1912
+ 1913
+ 1914
+ 1915
+ 1916
+ 1917
+ 1918
+ 1919
+ 1920
+ 1921
+ 1922
+ 1923
+ 1924
+ 1925
+ 1926
+ 1927
+ 1928
+ 1929
+ 1930
+ 1931
+ 1932
+ 1933
+ 1934
+ 1935
+ 1936
+ 1937
+ 1938
+ 1939
+ 1940
+ 1941
+ 1942
+ 1943
+ 1944
+ 1945
+ 1946
+ 1947
+ 1948
+ 1949
+ 1950
+ 1951
+ 1952
+ 1953
+ 1954
+ 1955
+ 1956
+ 1957
+ 1958
+ 1959
+ 1960
+ 1961
+ 1962
+ 1963
+ 1964
+ 1965
+ 1966
+ 1967
+ 1968
+ 1969
+ 1970
+ 1971
+ 1972
+ 1973
+ 1974
+ 1975
+ 1976
+ 1977
+ 1978
+ 1979
+ 1980
+ 1981
+ 1982
+ 1983
+ 1984
+ 1985
+ 1986
+ 1987
+ 1988
+ 1989
+ 1990
+ 1991
+ 1992
+ 1993
+ 1994
+ 1995
+ 1996
+ 1997
+ 1998
+ 1999
+ 2000
+ 2001
+ 2002
+ 2003
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023
+ 2024
+ 2025
+ 2026
+ 2027
+ 2028
+ 2029
+ 2030
+ 2031
+ 2032
+ 2033
+ 2034
+ 2035
+ 2036
+ 2037
+ 2038
+ 2039
+ 2040
+ 2041
+ 2042
+ 2043
+ 2044
+ 2045
+ 2046
+ 2047
+ 2048
+ 2049
+ 2050
+ 2051
+ 2052
+ 2053
+ 2054
+ 2055
+ 2056
+ 2057
+ 2058
+ 2059
+ 2060
+ 2061
+ 2062
+ 2063
+ 2064
+ 2065
+ 2066
+ 2067
+ 2068
+ 2069
+ 2070
+ 2071
+ 2072
+ 2073
+ 2074
+ 2075
+ 2076
+ 2077
+ 2078
+ 2079
+ 2080
+ 2081
+ 2082
+ 2083
+ 2084
+ 2085
+ 2086
+ 2087
+ 2088
+ 2089
+ 2090
+ 2091
+ 2092
+ 2093
+ 2094
+ 2095
+ 2096
+ 2097
+ 2098
+ 2099
+ 2100
+ 2101
+ 2102
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2109
+ 2110
+ 2111
+ 2112
+ 2113
+ 2114
+ 2115
+ 2116
+ 2117
+ 2118
+ 2119
+ 2120
+ 2121
+ 2122
+ 2123
+ 2124
+ 2125
+ 2126
+ 2127
+ 2128
+ 2129
+ 2130
+ 2131
+ 2132
+ 2133
+ 2134
+ 2135
+ 2136
+ 2137
+ 2138
+ 2139
+ 2140
+ 2141
+ 2142
+ 2143
+ 2144
+ 2145
+ 2146
+ 2147
+ 2148
+ 2149
+ 2150
+ 2151
+ 2152
+ 2153
+ 2154
+ 2155
+ 2156
+ 2157
+ 2158
+ 2159
+ 2160
+ 2161
+ 2162
+ 2163
+ 2164
+ 2165
+ 2166
+ 2167
+ 2168
+ 2169
+ 2170
+ 2171
+ 2172
+ 2173
+ 2174
+ 2175
+ 2176
+ 2177
+ 2178
+ 2179
+ 2180
+ 2181
+ 2182
+ 2183
+ 2184
+ 2185
+ 2186
+ 2187
+ 2188
+ 2189
+ 2190
+ 2191
+ 2192
+ 2193
+ 2194
+ 2195
+ 2196
+ 2197
+ 2198
+ 2199
+ 2200
+ 2201
+ 2202
+ 2203
+ 2204
+ 2205
+ 2206
+ 2207
+ 2208
+ 2209
+ 2210
+ 2211
+ 2212
+ 2213
+ 2214
+ 2215
+ 2216
+ 2217
+ 2218
+ 2219
+ 2220
+ 2221
+ 2222
+ 2223
+ 2224
+ 2225
+ 2226
+ 2227
+ 2228
+ 2229
+ 2230
+ 2231
+ 2232
+ 2233
+ 2234
+ 2235
+ 2236
+ 2237
+ 2238
+ 2239
+ 2240
+ 2241
+ 2242
+ 2243
+ 2244
+ 2245
+ 2246
+ 2247
+ 2248
+ 2249
+ 2250
+ 2251
+ 2252
+ 2253
+ 2254
+ 2255
+ 2256
+ 2257
+ 2258
+ 2259
+ 2260
+ 2261
+ 2262
+ 2263
+ 2264
+ 2265
+ 2266
+ 2267
+ 2268
+ 2269
+ 2270
+ 2271
+ 2272
+ 2273
+ 2274
+ 2275
+ 2276
+ 2277
+ 2278
+ 2279
+ 2280
+ 2281
+ 2282
+ 2283
+ 2284
+ 2285
+ 2286
+ 2287
+ 2288
+ 2289
+ 2290
+ 2291
+ 2292
+ 2293
+ 2294
+ 2295
+ 2296
+ 2297
+ 2298
+ 2299
+ 2300
+ 2301
+ 2302
+ 2303
+ 2304
+ 2305
+ 2306
+ 2307
+ 2308
+ 2309
+ 2310
+ 2311
+ 2312
+ 2313
+ 2314
+ 2315
+ 2316
+ 2317
+ 2318
+ 2319
+ 2320
+ 2321
+ 2322
+ 2323
+ 2324
+ 2325
+ 2326
+ 2327
+ 2328
+ 2329
+ 2330
+ 2331
+ 2332
+ 2333
+ 2334
+ 2335
+ 2336
+ 2337
+ 2338
+ 2339
+ 2340
+ 2341
+ 2342
+ 2343
+ 2344
+ 2345
+ 2346
+ 2347
+ 2348
+ 2349
+ 2350
+ 2351
+ 2352
+ 2353
+ 2354
+ 2355
+ 2356
+ 2357
+ 2358
+ 2359
+ 2360
+ 2361
+ 2362
+ 2363
+ 2364
+ 2365
+ 2366
+ 2367
+ 2368
+ 2369
+ 2370
+ 2371
+ 2372
+ 2373
+ 2374
+ 2375
+ 2376
+ 2377
+ 2378
+ 2379
+ 2380
+ 2381
+ 2382
+ 2383
+ 2384
+ 2385
+ 2386
+ 2387
+ 2388
+ 2389
+ 2390
+ 2391
+ 2392
+ 2393
+ 2394
+ 2395
+ 2396
+ 2397
+ 2398
+ 2399
+ 2400
+ 2401
+ 2402
+ 2403
+ 2404
+ 2405
+ 2406
+ 2407
+ 2408
+ 2409
+ 2410
+ 2411
+ 2412
+ 2413
+ 2414
+ 2415
+ 2416
+ 2417
+ 2418
+ 2419
+ 2420
+ 2421
+ 2422
+ 2423
+ 2424
+ 2425
+ 2426
+ 2427
+ 2428
+ 2429
+ 2430
+ 2431
+ 2432
+ 2433
+ 2434
+ 2435
+ 2436
+ 2437
+ 2438
+ 2439
+ 2440
+ 2441
+ 2442
+ 2443
+ 2444
+ 2445
+ 2446
+ 2447
+ 2448
+ 2449
+ 2450
+ 2451
+ 2452
+ 2453
+ 2454
+ 2455
+ 2456
+ 2457
+ 2458
+ 2459
+ 2460
+ 2461
+ 2462
+ 2463
+ 2464
+ 2465
+ 2466
+ 2467
+ 2468
+ 2469
+ 2470
+ 2471
+ 2472
+ 2473
+ 2474
+ 2475
+ 2476
+ 2477
+ 2478
+ 2479
+ 2480
+ 2481
+ 2482
+ 2483
+ 2484
+ 2485
+ 2486
+ 2487
+ 2488
+ 2489
+ 2490
+ 2491
+ 2492
+ 2493
+ 2494
+ 2495
+ 2496
+ 2497
+ 2498
+ 2499
+ 2500
+ 2501
+ 2502
+ 2503
+ 2504
+ 2505
+ 2506
+ 2507
+ 2508
+ 2509
+ 2510
+ 2511
+ 2512
+ 2513
+ 2514
+ 2515
+ 2516
+ 2517
+ 2518
+ 2519
+ 2520
+ 2521
+ 2522
+ 2523
+ 2524
+ 2525
+ 2526
+ 2527
+ 2528
+ 2529
+ 2530
+ 2531
+ 2532
+ 2533
+ 2534
+ 2535
+ 2536
+ 2537
+ 2538
+ 2539
+ 2540
+ 2541
+ 2542
+ 2543
+ 2544
+ 2545
+ 2546
+ 2547
+ 2548
+ 2549
+ 2550
+ 2551
+ 2552
+ 2553
+ 2554
+ 2555
+ 2556
+ 2557
+ 2558
+ 2559
+ 2560
+ 2561
+ 2562
+ 2563
+ 2564
+ 2565
+ 2566
+ 2567
+ 2568
+ 2569
+ 2570
+ 2571
+ 2572
+ 2573
+ 2574
+ 2575
+ 2576
+ 2577
+ 2578
+ 2579
+ 2580
+ 2581
+ 2582
+ 2583
+ 2584
+ 2585
+ 2586
+ 2587
+ 2588
+ 2589
+ 2590
+ 2591
+ 2592
+ 2593
+ 2594
+ 2595
+ 2596
+ 2597
+ 2598
+ 2599
+ 2600
+ 2601
+ 2602
+ 2603
+ 2604
+ 2605
+ 2606
+ 2607
+ 2608
+ 2609
+ 2610
+ 2611
+ 2612
+ 2613
+ 2614
+ 2615
+ 2616
+ 2617
+ 2618
+ 2619
+ 2620
+ 2621
+ 2622
+ 2623
+ 2624
+ 2625
+ 2626
+ 2627
+ 2628
+ 2629
+ 2630
+ 2631
+ 2632
+ 2633
+ 2634
+ 2635
+ 2636
+ 2637
+ 2638
+ 2639
+ 2640
+ 2641
+ 2642
+ 2643
+ 2644
+ 2645
+ 2646
+ 2647
+ 2648
+ 2649
+ 2650
+ 2651
+ 2652
+ 2653
+ 2654
+ 2655
+ 2656
+ 2657
+ 2658
+ 2659
+ 2660
+ 2661
+ 2662
+ 2663
+ 2664
+ 2665
+ 2666
+ 2667
+ 2668
+ 2669
+ 2670
+ 2671
+ 2672
+ 2673
+ 2674
+ 2675
+ 2676
+ 2677
+ 2678
+ 2679
+ 2680
+ 2681
+ 2682
+ 2683
+ 2684
+ 2685
+ 2686
+ 2687
+ 2688
+ 2689
+ 2690
+ 2691
+ 2692
+ 2693
+ 2694
+ 2695
+ 2696
+ 2697
+ 2698
+ 2699
+ 2700
+ 2701
+ 2702
+ 2703
+ 2704
+ 2705
+ 2706
+ 2707
+ 2708
+ 2709
+ 2710
+ 2711
+ 2712
+ 2713
+ 2714
+ 2715
+ 2716
+ 2717
+ 2718
+ 2719
+ 2720
+ 2721
+ 2722
+ 2723
+ 2724
+ 2725
+ 2726
+ 2727
+ 2728
+ 2729
+ 2730
+ 2731
+ 2732
+ 2733
+ 2734
+ 2735
+ 2736
+ 2737
+ 2738
+ 2739
+ 2740
+ 2741
+ 2742
+ 2743
+ 2744
+ 2745
+ 2746
+ 2747
+ 2748
+ 2749
+ 2750
+ 2751
+ 2752
+ 2753
+ 2754
+ 2755
+ 2756
+ 2757
+ 2758
+ 2759
+ 2760
+ 2761
+ 2762
+ 2763
+ 2764
+ 2765
+ 2766
+ 2767
+ 2768
+ 2769
+ 2770
+ 2771
+ 2772
+ 2773
+ 2774
+ 2775
+ 2776
+ 2777
+ 2778
+ 2779
+ 2780
+ 2781
+ 2782
+ 2783
+ 2784
+ 2785
+ 2786
+ 2787
+ 2788
+ 2789
+ 2790
+ 2791
+ 2792
+ 2793
+ 2794
+ 2795
+ 2796
+ 2797
+ 2798
+ 2799
+ 2800
+ 2801
+ 2802
+ 2803
+ 2804
+ 2805
+ 2806
+ 2807
+ 2808
+ 2809
+ 2810
+ 2811
+ 2812
+ 2813
+ 2814
+ 2815
+ 2816
+ 2817
+ 2818
+ 2819
+ 2820
+ 2821
+ 2822
+ 2823
+ 2824
+ 2825
+ 2826
+ 2827
+ 2828
+ 2829
+ 2830
+ 2831
+ 2832
+ 2833
+ 2834
+ 2835
+ 2836
+ 2837
+ 2838
+ 2839
+ 2840
+ 2841
+ 2842
+ 2843
+ 2844
+ 2845
+ 2846
+ 2847
+ 2848
+ 2849
+ 2850
+ 2851
+ 2852
+ 2853
+ 2854
+ 2855
+ 2856
+ 2857
+ 2858
+ 2859
+ 2860
+ 2861
+ 2862
+ 2863
+ 2864
+ 2865
+ 2866
+ 2867
+ 2868
+ 2869
+ 2870
+ 2871
+ 2872
+ 2873
+ 2874
+ 2875
+ 2876
+ 2877
+ 2878
+ 2879
+ 2880
+ 2881
+ 2882
+ 2883
+ 2884
+ 2885
+ 2886
+ 2887
+ 2888
+ 2889
+ 2890
+ 2891
+ 2892
+ 2893
+ 2894
+ 2895
+ 2896
+ 2897
+ 2898
+ 2899
+ 2900
+ 2901
+ 2902
+ 2903
+ 2904
+ 2905
+ 2906
+ 2907
+ 2908
+ 2909
+ 2910
+ 2911
+ 2912
+ 2913
+ 2914
+ 2915
+ 2916
+ 2917
+ 2918
+ 2919
+ 2920
+ 2921
+ 2922
+ 2923
+ 2924
+ 2925
+ 2926
+ 2927
+ 2928
+ 2929
+ 2930
+ 2931
+ 2932
+ 2933
+ 2934
+ 2935
+ 2936
+ 2937
+ 2938
+ 2939
+ 2940
+ 2941
+ 2942
+ 2943
+ 2944
+ 2945
+ 2946
+ 2947
+ 2948
+ 2949
+ 2950
+ 2951
+ 2952
+ 2953
+ 2954
+ 2955
+ 2956
+ 2957
+ 2958
+ 2959
+ 2960
+ 2961
+ 2962
+ 2963
+ 2964
+ 2965
+ 2966
+ 2967
+ 2968
+ 2969
+ 2970
+ 2971
+ 2972
+ 2973
+ 2974
+ 2975
+ 2976
+ 2977
+ 2978
+ 2979
+ 2980
+ 2981
+ 2982
+ 2983
+ 2984
+ 2985
+ 2986
+ 2987
+ 2988
+ 2989
+ 2990
+ 2991
+ 2992
+ 2993
+ 2994
+ 2995
+ 2996
+ 2997
+ 2998
+ 2999
+ 3000
+ 3001
+ 3002
+ 3003
+ 3004
+ 3005
+ 3006
+ 3007
+ 3008
+ 3009
+ 3010
+ 3011
+ 3012
+ 3013
+ 3014
+ 3015
+ 3016
+ 3017
+ 3018
+ 3019
+ 3020
+ 3021
+ 3022
+ 3023
+ 3024
+ 3025
+ 3026
+ 3027
+ 3028
+ 3029
+ 3030
+ 3031
+ 3032
+ 3033
+ 3034
+ 3035
+ 3036
+ 3037
+ 3038
+ 3039
+ 3040
+ 3041
+ 3042
+ 3043
+ 3044
+ 3045
+ 3046
+ 3047
+ 3048
+ 3049
+ 3050
+ 3051
+ 3052
+ 3053
+ 3054
+ 3055
+ 3056
+ 3057
+ 3058
+ 3059
+ 3060
+ 3061
+ 3062
+ 3063
+ 3064
+ 3065
+ 3066
+ 3067
+ 3068
+ 3069
+ 3070
+ 3071
+ 3072
+ 3073
+ 3074
+ 3075
+ 3076
+ 3077
+ 3078
+ 3079
+ 3080
+ 3081
+ 3082
+ 3083
+ 3084
+ 3085
+ 3086
+ 3087
+ 3088
+ 3089
+ 3090
+ 3091
+ 3092
+ 3093
+ 3094
+ 3095
+ 3096
+ 3097
+ 3098
+ 3099
+ 3100
+ 3101
+ 3102
+ 3103
+ 3104
+ 3105
+ 3106
+ 3107
+ 3108
+ 3109
+ 3110
+ 3111
+ 3112
+ 3113
+ 3114
+ 3115
+ 3116
+ 3117
+ 3118
+ 3119
+ 3120
+ 3121
+ 3122
+ 3123
+ 3124
+ 3125
+ 3126
+ 3127
+ 3128
+ 3129
+ 3130
+ 3131
+ 3132
+ 3133
+ 3134
+ 3135
+ 3136
+ 3137
+ 3138
+ 3139
+ 3140
+ 3141
+ 3142
+ 3143
+ 3144
+ 3145
+ 3146
+ 3147
+ 3148
+ 3149
+ 3150
+ 3151
+ 3152
+ 3153
+ 3154
+ 3155
+ 3156
+ 3157
+ 3158
+ 3159
+ 3160
+ 3161
+ 3162
+ 3163
+ 3164
+ 3165
+ 3166
+ 3167
+ 3168
+ 3169
+ 3170
+ 3171
+ 3172
+ 3173
+ 3174
+ 3175
+ 3176
+ 3177
+ 3178
+ 3179
+ 3180
+ 3181
+ 3182
+ 3183
+ 3184
+ 3185
+ 3186
+ 3187
+ 3188
+ 3189
+ 3190
+ 3191
+ 3192
+ 3193
+ 3194
+ 3195
+ 3196
+ 3197
+ 3198
+ 3199
+ 3200
+ 3201
+ 3202
+ 3203
+ 3204
+ 3205
+ 3206
+ 3207
+ 3208
+ 3209
+ 3210
+ 3211
+ 3212
+ 3213
+ 3214
+ 3215
+ 3216
+ 3217
+ 3218
+ 3219
+ 3220
+ 3221
+ 3222
+ 3223
+ 3224
+ 3225
+ 3226
+ 3227
+ 3228
+ 3229
+ 3230
+ 3231
+ 3232
+ 3233
+ 3234
+ 3235
+ 3236
+ 3237
+ 3238
+ 3239
+ 3240
+ 3241
+ 3242
+ 3243
+ 3244
+ 3245
+ 3246
+ 3247
+ 3248
+ 3249
+ 3250
+ 3251
+ 3252
+ 3253
+ 3254
+ 3255
+ 3256
+ 3257
+ 3258
+ 3259
+ 3260
+ 3261
+ 3262
+ 3263
+ 3264
+ 3265
+ 3266
+ 3267
+ 3268
+ 3269
+ 3270
+ 3271
+ 3272
+ 3273
+ 3274
+ 3275
+ 3276
+ 3277
+ 3278
+ 3279
+ 3280
+ 3281
+ 3282
+ 3283
+ 3284
+ 3285
+ 3286
+ 3287
+ 3288
+ 3289
+ 3290
+ 3291
+ 3292
+ 3293
+ 3294
+ 3295
+ 3296
+ 3297
+ 3298
+ 3299
+ 3300
+ 3301
+ 3302
+ 3303
+ 3304
+ 3305
+ 3306
+ 3307
+ 3308
+ 3309
+ 3310
+ 3311
+ 3312
+ 3313
+ 3314
+ 3315
+ 3316
+ 3317
+ 3318
+ 3319
+ 3320
+ 3321
+ 3322
+ 3323
+ 3324
+ 3325
+ 3326
+ 3327
+ 3328
+ 3329
+ 3330
+ 3331
+ 3332
+ 3333
+ 3334
+ 3335
+ 3336
+ 3337
+ 3338
+ 3339
+ 3340
+ 3341
+ 3342
+ 3343
+ 3344
+ 3345
+ 3346
+ 3347
+ 3348
+ 3349
+ 3350
+ 3351
+ 3352
+ 3353
+ 3354
+ 3355
+ 3356
+ 3357
+ 3358
+ 3359
+ 3360
+ 3361
+ 3362
+ 3363
+ 3364
+ 3365
+ 3366
+ 3367
+ 3368
+ 3369
+ 3370
+ 3371
+ 3372
+ 3373
+ 3374
+ 3375
+ 3376
+ 3377
+ 3378
+ 3379
+ 3380
+ 3381
+ 3382
+ 3383
+ 3384
+ 3385
+ 3386
+ 3387
+ 3388
+ 3389
+ 3390
+ 3391
+ 3392
+ 3393
+ 3394
+ 3395
+ 3396
+ 3397
+ 3398
+ 3399
+ 3400
+ 3401
+ 3402
+ 3403
+ 3404
+ 3405
+ 3406
+ 3407
+ 3408
+ 3409
+ 3410
+ 3411
+ 3412
+ 3413
+ 3414
+ 3415
+ 3416
+ 3417
+ 3418
+ 3419
+ 3420
+ 3421
+ 3422
+ 3423
+ 3424
+ 3425
+ 3426
+ 3427
+ 3428
+ 3429
+ 3430
+ 3431
+ 3432
+ 3433
+ 3434
+ 3435
+ 3436
+ 3437
+ 3438
+ 3439
+ 3440
+ 3441
+ 3442
+ 3443
+ 3444
+ 3445
+ 3446
+ 3447
+ 3448
+ 3449
+ 3450
+ 3451
+ 3452
+ 3453
+ 3454
+ 3455
+ 3456
+ 3457
+ 3458
+ 3459
+ 3460
+ 3461
+ 3462
+ 3463
+ 3464
+ 3465
+ 3466
+ 3467
+ 3468
+ 3469
+ 3470
+ 3471
+ 3472
+ 3473
+ 3474
+ 3475
+ 3476
+ 3477
+ 3478
+ 3479
+ 3480
+ 3481
+ 3482
+ 3483
+ 3484
+ 3485
+ 3486
+ 3487
+ 3488
+ 3489
+ 3490
+ 3491
+ 3492
+ 3493
+ 3494
+ 3495
+ 3496
+ 3497
+ 3498
+ 3499
+ 3500
+ 3501
+ 3502
+ 3503
+ 3504
+ 3505
+ 3506
+ 3507
+ 3508
+ 3509
+ 3510
+ 3511
+ 3512
+ 3513
+ 3514
+ 3515
+ 3516
+ 3517
+ 3518
+ 3519
+ 3520
+ 3521
+ 3522
+ 3523
+ 3524
+ 3525
+ 3526
+ 3527
+ 3528
+ 3529
+ 3530
+ 3531
+ 3532
+ 3533
+ 3534
+ 3535
+ 3536
+ 3537
+ 3538
+ 3539
+ 3540
+ 3541
+ 3542
+ 3543
+ 3544
+ 3545
+ 3546
+ 3547
+ 3548
+ 3549
+ 3550
+ 3551
+ 3552
+ 3553
+ 3554
+ 3555
+ 3556
+ 3557
+ 3558
+ 3559
+ 3560
+ 3561
+ 3562
+ 3563
+ 3564
+ 3565
+ 3566
+ 3567
+ 3568
+ 3569
+ 3570
+ 3571
+ 3572
+ 3573
+ 3574
+ 3575
+ 3576
+ 3577
+ 3578
+ 3579
+ 3580
+ 3581
+ 3582
+ 3583
+ 3584
+ 3585
+ 3586
+ 3587
+ 3588
+ 3589
+ 3590
+ 3591
+ 3592
+ 3593
+ 3594
+ 3595
+ 3596
+ 3597
+ 3598
+ 3599
+ 3600
+ 3601
+ 3602
+ 3603
+ 3604
+ 3605
+ 3606
+ 3607
+ 3608
+ 3609
+ 3610
+ 3611
+ 3612
+ 3613
+ 3614
+ 3615
+ 3616
+ 3617
+ 3618
+ 3619
+ 3620
+ 3621
+ 3622
+ 3623
+ 3624
+ 3625
+ 3626
+ 3627
+ 3628
+ 3629
+ 3630
+ 3631
+ 3632
+ 3633
+ 3634
+ 3635
+ 3636
+ 3637
+ 3638
+ 3639
+ 3640
+ 3641
+ 3642
+ 3643
+ 3644
+ 3645
+ 3646
+ 3647
+ 3648
+ 3649
+ 3650
+ 3651
+ 3652
+ 3653
+ 3654
+ 3655
+ 3656
+ 3657
+ 3658
+ 3659
+ 3660
+ 3661
+ 3662
+ 3663
+ 3664
+ 3665
+ 3666
+ 3667
+ 3668
+ 3669
+ 3670
+ 3671
+ 3672
+ 3673
+ 3674
+ 3675
+ 3676
+ 3677
+ 3678
+ 3679
+ 3680
+ 3681
+ 3682
+ 3683
+ 3684
+ 3685
+ 3686
+ 3687
+ 3688
+ 3689
+ 3690
+ 3691
+ 3692
+ 3693
+ 3694
+ 3695
+ 3696
+ 3697
+ 3698
+ 3699
+ 3700
+ 3701
+ 3702
+ 3703
+ 3704
+ 3705
+ 3706
+ 3707
+ 3708
+ 3709
+ 3710
+ 3711
+ 3712
+ 3713
+ 3714
+ 3715
+ 3716
+ 3717
+ 3718
+ 3719
+ 3720
+ 3721
+ 3722
+ 3723
+ 3724
+ 3725
+ 3726
+ 3727
+ 3728
+ 3729
+ 3730
+ 3731
+ 3732
+ 3733
+ 3734
+ 3735
+ 3736
+ 3737
+ 3738
+ 3739
+ 3740
+ 3741
+ 3742
+ 3743
+ 3744
+ 3745
+ 3746
+ 3747
+ 3748
+ 3749
+ 3750
+ 3751
+ 3752
+ 3753
+ 3754
+ 3755
+ 3756
+ 3757
+ 3758
+ 3759
+ 3760
+ 3761
+ 3762
+ 3763
+ 3764
+ 3765
+ 3766
+ 3767
+ 3768
+ 3769
+ 3770
+ 3771
+ 3772
+ 3773
+ 3774
+ 3775
+ 3776
+ 3777
+ 3778
+ 3779
+ 3780
+ 3781
+ 3782
+ 3783
+ 3784
+ 3785
+ 3786
+ 3787
+ 3788
+ 3789
+ 3790
+ 3791
+ 3792
+ 3793
+ 3794
+ 3795
+ 3796
+ 3797
+ 3798
+ 3799
+ 3800
+ 3801
+ 3802
+ 3803
+ 3804
+ 3805
+ 3806
+ 3807
+ 3808
+ 3809
+ 3810
+ 3811
+ 3812
+ 3813
+ 3814
+ 3815
+ 3816
+ 3817
+ 3818
+ 3819
+ 3820
+ 3821
+ 3822
+ 3823
+ 3824
+ 3825
+ 3826
+ 3827
+ 3828
+ 3829
+ 3830
+ 3831
+ 3832
+ 3833
+ 3834
+ 3835
+ 3836
+ 3837
+ 3838
+ 3839
+ 3840
+ 3841
+ 3842
+ 3843
+ 3844
+ 3845
+ 3846
+ 3847
+ 3848
+ 3849
+ 3850
+ 3851
+ 3852
+ 3853
+ 3854
+ 3855
+ 3856
+ 3857
+ 3858
+ 3859
+ 3860
+ 3861
+ 3862
+ 3863
+ 3864
+ 3865
+ 3866
+ 3867
+ 3868
+ 3869
+ 3870
+ 3871
+ 3872
+ 3873
+ 3874
+ 3875
+ 3876
+ 3877
+ 3878
+ 3879
+ 3880
+ 3881
+ 3882
+ 3883
+ 3884
+ 3885
+ 3886
+ 3887
+ 3888
+ 3889
+ 3890
+ 3891
+ 3892
+ 3893
+ 3894
+ 3895
+ 3896
+ 3897
+ 3898
+ 3899
+ 3900
+ 3901
+ 3902
+ 3903
+ 3904
+ 3905
+ 3906
+ 3907
+ 3908
+ 3909
+ 3910
+ 3911
+ 3912
+ 3913
+ 3914
+ 3915
+ 3916
+ 3917
+ 3918
+ 3919
+ 3920
+ 3921
+ 3922
+ 3923
+ 3924
+ 3925
+ 3926
+ 3927
+ 3928
+ 3929
+ 3930
+ 3931
+ 3932
+ 3933
+ 3934
+ 3935
+ 3936
+ 3937
+ 3938
+ 3939
+ 3940
+ 3941
+ 3942
+ 3943
+ 3944
+ 3945
+ 3946
+ 3947
+ 3948
+ 3949
+ 3950
+ 3951
+ 3952
+ 3953
+ 3954
+ 3955
+ 3956
+ 3957
+ 3958
+ 3959
+ 3960
+ 3961
+ 3962
+ 3963
+ 3964
+ 3965
+ 3966
+ 3967
+ 3968
+ 3969
+ 3970
+ 3971
+ 3972
+ 3973
+ 3974
+ 3975
+ 3976
+ 3977
+ 3978
+ 3979
+ 3980
+ 3981
+ 3982
+ 3983
+ 3984
+ 3985
+ 3986
+ 3987
+ 3988
+ 3989
+ 3990
+ 3991
+ 3992
+ 3993
+ 3994
+ 3995
+ 3996
+ 3997
+ 3998
+ 3999
+ 4000
+ 4001
+ 4002
+ 4003
+ 4004
+ 4005
+ 4006
+ 4007
+ 4008
+ 4009
+ 4010
+ 4011
+ 4012
+ 4013
+ 4014
+ 4015
+ 4016
+ 4017
+ 4018
+ 4019
+ 4020
+ 4021
+ 4022
+ 4023
+ 4024
+ 4025
+ 4026
+ 4027
+ 4028
+ 4029
+ 4030
+ 4031
+ 4032
+ 4033
+ 4034
+ 4035
+ 4036
+ 4037
+ 4038
+ 4039
+ 4040
+ 4041
+ 4042
+ 4043
+ 4044
+ 4045
+ 4046
+ 4047
+ 4048
+ 4049
+ 4050
+ 4051
+ 4052
+ 4053
+ 4054
+ 4055
+ 4056
+ 4057
+ 4058
+ 4059
+ 4060
+ 4061
+ 4062
+ 4063
+ 4064
+ 4065
+ 4066
+ 4067
+ 4068
+ 4069
+ 4070
+ 4071
+ 4072
+ 4073
+ 4074
+ 4075
+ 4076
+ 4077
+ 4078
+ 4079
+ 4080
+ 4081
+ 4082
+ 4083
+ 4084
+ 4085
+ 4086
+ 4087
+ 4088
+ 4089
+ 4090
+ 4091
+ 4092
+ 4093
+ 4094
+ 4095
+ 4096
+ 4097
+ 4098
+ 4099
+ 4100
+ 4101
+ 4102
+ 4103
+ 4104
+ 4105
+ 4106
+ 4107
+ 4108
+ 4109
+ 4110
+ 4111
+ 4112
+ 4113
+ 4114
+ 4115
+ 4116
+ 4117
+ 4118
+ 4119
+ 4120
+ 4121
+ 4122
+ 4123
+ 4124
+ 4125
+ 4126
+ 4127
+ 4128
+ 4129
+ 4130
+ 4131
+ 4132
+ 4133
+ 4134
+ 4135
+ 4136
+ 4137
+ 4138
+ 4139
+ 4140
+ 4141
+ 4142
+ 4143
+ 4144
+ 4145
+ 4146
+ 4147
+ 4148
+ 4149
+ 4150
+ 4151
+ 4152
+ 4153
+ 4154
+ 4155
+ 4156
+ 4157
+ 4158
+ 4159
+ 4160
+ 4161
+ 4162
+ 4163
+ 4164
+ 4165
+ 4166
+ 4167
+ 4168
+ 4169
+ 4170
+ 4171
+ 4172
+ 4173
+ 4174
+ 4175
+ 4176
+ 4177
+ 4178
+ 4179
+ 4180
+ 4181
+ 4182
+ 4183
+ 4184
+ 4185
+ 4186
+ 4187
+ 4188
+ 4189
+ 4190
+ 4191
+ 4192
+ 4193
+ 4194
+ 4195
+ 4196
+ 4197
+ 4198
+ 4199
+ 4200
+ 4201
+ 4202
+ 4203
+ 4204
+ 4205
+ 4206
+ 4207
+ 4208
+ 4209
+ 4210
+ 4211
+ 4212
+ 4213
+ 4214
+ 4215
+ 4216
+ 4217
+ 4218
+ 4219
+ 4220
+ 4221
+ 4222
+ 4223
+ 4224
+ 4225
+ 4226
+ 4227
+ 4228
+ 4229
+ 4230
+ 4231
+ 4232
+ 4233
+ 4234
+ 4235
+ 4236
+ 4237
+ 4238
+ 4239
+ 4240
+ 4241
+ 4242
+ 4243
+ 4244
+ 4245
+ 4246
+ 4247
+ 4248
+ 4249
+ 4250
+ 4251
+ 4252
+ 4253
+ 4254
+ 4255
+ 4256
+ 4257
+ 4258
+ 4259
+ 4260
+ 4261
+ 4262
+ 4263
+ 4264
+ 4265
+ 4266
+ 4267
+ 4268
+ 4269
+ 4270
+ 4271
+ 4272
+ 4273
+ 4274
+ 4275
+ 4276
+ 4277
+ 4278
+ 4279
+ 4280
+ 4281
+ 4282
+ 4283
+ 4284
+ 4285
+ 4286
+ 4287
+ 4288
+ 4289
+ 4290
+ 4291
+ 4292
+ 4293
+ 4294
+ 4295
+ 4296
+ 4297
+ 4298
+ 4299
+ 4300
+ 4301
+ 4302
+ 4303
+ 4304
+ 4305
+ 4306
+ 4307
+ 4308
+ 4309
+ 4310
+ 4311
+ 4312
+ 4313
+ 4314
+ 4315
+ 4316
+ 4317
+ 4318
+ 4319
+ 4320
+ 4321
+ 4322
+ 4323
+ 4324
+ 4325
+ 4326
+ 4327
+ 4328
+ 4329
+ 4330
+ 4331
+ 4332
+ 4333
+ 4334
+ 4335
+ 4336
+ 4337
+ 4338
+ 4339
+ 4340
+ 4341
+ 4342
+ 4343
+ 4344
+ 4345
+ 4346
+ 4347
+ 4348
+ 4349
+ 4350
+ 4351
+ 4352
+ 4353
+ 4354
+ 4355
+ 4356
+ 4357
+ 4358
+ 4359
+ 4360
+ 4361
+ 4362
+ 4363
+ 4364
+ 4365
+ 4366
+ 4367
+ 4368
+ 4369
+ 4370
+ 4371
+ 4372
+ 4373
+ 4374
+ 4375
+ 4376
+ 4377
+ 4378
+ 4379
+ 4380
+ 4381
+ 4382
+ 4383
+ 4384
+ 4385
+ 4386
+ 4387
+ 4388
+ 4389
+ 4390
+ 4391
+ 4392
+ 4393
+ 4394
+ 4395
+ 4396
+ 4397
+ 4398
+ 4399
+ 4400
+ 4401
+ 4402
+ 4403
+ 4404
+ 4405
+ 4406
+ 4407
+ 4408
+ 4409
+ 4410
+ 4411
+ 4412
+ 4413
+ 4414
+ 4415
+ 4416
+ 4417
+ 4418
+ 4419
+ 4420
+ 4421
+ 4422
+ 4423
+ 4424
+ 4425
+ 4426
+ 4427
+ 4428
+ 4429
+ 4430
+ 4431
+ 4432
+ 4433
+ 4434
+ 4435
+ 4436
+ 4437
+ 4438
+ 4439
+ 4440
+ 4441
+ 4442
+ 4443
+ 4444
+ 4445
+ 4446
+ 4447
+ 4448
+ 4449
+ 4450
+ 4451
+ 4452
+ 4453
+ 4454
+ 4455
+ 4456
+ 4457
+ 4458
+ 4459
+ 4460
+ 4461
+ 4462
+ 4463
+ 4464
+ 4465
+ 4466
+ 4467
+ 4468
+ 4469
+ 4470
+ 4471
+ 4472
+ 4473
+ 4474
+ 4475
+ 4476
+ 4477
+ 4478
+ 4479
+ 4480
+ 4481
+ 4482
+ 4483
+ 4484
+ 4485
+ 4486
+ 4487
+ 4488
+ 4489
+ 4490
+ 4491
+ 4492
+ 4493
+ 4494
+ 4495
+ 4496
+ 4497
+ 4498
+ 4499
+ 4500
+ 4501
+ 4502
+ 4503
+ 4504
+ 4505
+ 4506
+ 4507
+ 4508
+ 4509
+ 4510
+ 4511
+ 4512
+ 4513
+ 4514
+ 4515
+ 4516
+ 4517
+ 4518
+ 4519
+ 4520
+ 4521
+ 4522
+ 4523
+ 4524
+ 4525
+ 4526
+ 4527
+ 4528
+ 4529
+ 4530
+ 4531
+ 4532
+ 4533
+ 4534
+ 4535
+ 4536
+ 4537
+ 4538
+ 4539
+ 4540
+ 4541
+ 4542
+ 4543
+ 4544
+ 4545
+ 4546
+ 4547
+ 4548
+ 4549
+ 4550
+ 4551
+ 4552
+ 4553
+ 4554
+ 4555
+ 4556
+ 4557
+ 4558
+ 4559
+ 4560
+ 4561
+ 4562
+ 4563
+ 4564
+ 4565
+ 4566
+ 4567
+ 4568
+ 4569
+ 4570
+ 4571
+ 4572
+ 4573
+ 4574
+ 4575
+ 4576
+ 4577
+ 4578
+ 4579
+ 4580
+ 4581
+ 4582
+ 4583
+ 4584
+ 4585
+ 4586
+ 4587
+ 4588
+ 4589
+ 4590
+ 4591
+ 4592
+ 4593
+ 4594
+ 4595
+ 4596
+ 4597
+ 4598
+ 4599
+ 4600
+ 4601
+ 4602
+ 4603
+ 4604
+ 4605
+ 4606
+ 4607
+ 4608
+ 4609
+ 4610
+ 4611
+ 4612
+ 4613
+ 4614
+ 4615
+ 4616
+ 4617
+ 4618
+ 4619
+ 4620
+ 4621
+ 4622
+ 4623
+ 4624
+ 4625
+ 4626
+ 4627
+ 4628
+ 4629
+ 4630
+ 4631
+ 4632
+ 4633
+ 4634
+ 4635
+ 4636
+ 4637
+ 4638
+ 4639
+ 4640
+ 4641
+ 4642
+ 4643
+ 4644
+ 4645
+ 4646
+ 4647
+ 4648
+ 4649
+ 4650
+ 4651
+ 4652
+ 4653
+ 4654
+ 4655
+ 4656
+ 4657
+ 4658
+ 4659
+ 4660
+ 4661
+ 4662
+ 4663
+ 4664
+ 4665
+ 4666
+ 4667
+ 4668
+ 4669
+ 4670
+ 4671
+ 4672
+ 4673
+ 4674
+ 4675
+ 4676
+ 4677
+ 4678
+ 4679
+ 4680
+ 4681
+ 4682
+ 4683
+ 4684
+ 4685
+ 4686
+ 4687
+ 4688
+ 4689
+ 4690
+ 4691
+ 4692
+ 4693
+ 4694
+ 4695
+ 4696
+ 4697
+ 4698
+ 4699
+ 4700
+ 4701
+ 4702
+ 4703
+ 4704
+ 4705
+ 4706
+ 4707
+ 4708
+ 4709
+ 4710
+ 4711
+ 4712
+ 4713
+ 4714
+ 4715
+ 4716
+ 4717
+ 4718
+ 4719
+ 4720
+ 4721
+ 4722
+ 4723
+ 4724
+ 4725
+ 4726
+ 4727
+ 4728
+ 4729
+ 4730
+ 4731
+ 4732
+ 4733
+ 4734
+ 4735
+ 4736
+ 4737
+ 4738
+ 4739
+ 4740
+ 4741
+ 4742
+ 4743
+ 4744
+ 4745
+ 4746
+ 4747
+ 4748
+ 4749
+ 4750
+ 4751
+ 4752
+ 4753
+ 4754
+ 4755
+ 4756
+ 4757
+ 4758
+ 4759
+ 4760
+ 4761
+ 4762
+ 4763
+ 4764
+ 4765
+ 4766
+ 4767
+ 4768
+ 4769
+ 4770
+ 4771
+ 4772
+ 4773
+ 4774
+ 4775
+ 4776
+ 4777
+ 4778
+ 4779
+ 4780
+ 4781
+ 4782
+ 4783
+ 4784
+ 4785
+ 4786
+ 4787
+ 4788
+ 4789
+ 4790
+ 4791
+ 4792
+ 4793
+ 4794
+ 4795
+ 4796
+ 4797
+ 4798
+ 4799
+ 4800
+ 4801
+ 4802
+ 4803
+ 4804
+ 4805
+ 4806
+ 4807
+ 4808
+ 4809
+ 4810
+ 4811
+ 4812
+ 4813
+ 4814
+ 4815
+ 4816
+ 4817
+ 4818
+ 4819
+ 4820
+ 4821
+ 4822
+ 4823
+ 4824
+ 4825
+ 4826
+ 4827
+ 4828
+ 4829
+ 4830
+ 4831
+ 4832
+ 4833
+ 4834
+ 4835
+ 4836
+ 4837
+ 4838
+ 4839
+ 4840
+ 4841
+ 4842
+ 4843
+ 4844
+ 4845
+ 4846
+ 4847
+ 4848
+ 4849
+ 4850
+ 4851
+ 4852
+ 4853
+ 4854
+ 4855
+ 4856
+ 4857
+ 4858
+ 4859
+ 4860
+ 4861
+ 4862
+ 4863
+ 4864
+ 4865
+ 4866
+ 4867
+ 4868
+ 4869
+ 4870
+ 4871
+ 4872
+ 4873
+ 4874
+ 4875
+ 4876
+ 4877
+ 4878
+ 4879
+ 4880
+ 4881
+ 4882
+ 4883
+ 4884
+ 4885
+ 4886
+ 4887
+ 4888
+ 4889
+ 4890
+ 4891
+ 4892
+ 4893
+ 4894
+ 4895
+ 4896
+ 4897
+ 4898
+ 4899
+ 4900
+ 4901
+ 4902
+ 4903
+ 4904
+ 4905
+ 4906
+ 4907
+ 4908
+ 4909
+ 4910
+ 4911
+ 4912
+ 4913
+ 4914
+ 4915
+ 4916
+ 4917
+ 4918
+ 4919
+ 4920
+ 4921
+ 4922
+ 4923
+ 4924
+ 4925
+ 4926
+ 4927
+ 4928
+ 4929
+ 4930
+ 4931
+ 4932
+ 4933
+ 4934
+ 4935
+ 4936
+ 4937
+ 4938
+ 4939
+ 4940
+ 4941
+ 4942
+ 4943
+ 4944
+ 4945
+ 4946
+ 4947
+ 4948
+ 4949
+ 4950
+ 4951
+ 4952
+ 4953
+ 4954
+ 4955
+ 4956
+ 4957
+ 4958
+ 4959
+ 4960
+ 4961
+ 4962
+ 4963
+ 4964
+ 4965
+ 4966
+ 4967
+ 4968
+ 4969
+ 4970
+ 4971
+ 4972
+ 4973
+ 4974
+ 4975
+ 4976
+ 4977
+ 4978
+ 4979
+ 4980
+ 4981
+ 4982
+ 4983
+ 4984
+ 4985
+ 4986
+ 4987
+ 4988
+ 4989
+ 4990
+ 4991
+ 4992
+ 4993
+ 4994
+ 4995
+ 4996
+ 4997
+ 4998
+ 4999
+ 5000
+ 5001
+ 5002
+ 5003
+ 5004
+ 5005
+ 5006
+ 5007
+ 5008
+ 5009
+ 5010
+ 5011
+ 5012
+ 5013
+ 5014
+ 5015
+ 5016
+ 5017
+ 5018
+ 5019
+ 5020
+ 5021
+ 5022
+ 5023
+ 5024
+ 5025
+ 5026
+ 5027
+ 5028
+ 5029
+ 5030
+ 5031
+ 5032
+ 5033
+ 5034
+ 5035
+ 5036
+ 5037
+ 5038
+ 5039
+ 5040
+ 5041
+ 5042
+ 5043
+ 5044
+ 5045
+ 5046
+ 5047
+ 5048
+ 5049
+ 5050
+ 5051
+ 5052
+ 5053
+ 5054
+ 5055
+ 5056
+ 5057
+ 5058
+ 5059
+ 5060
+ 5061
+ 5062
+ 5063
+ 5064
+ 5065
+ 5066
+ 5067
+ 5068
+ 5069
+ 5070
+ 5071
+ 5072
+ 5073
+ 5074
+ 5075
+ 5076
+ 5077
+ 5078
+ 5079
+ 5080
+ 5081
+ 5082
+ 5083
+ 5084
+ 5085
+ 5086
+ 5087
+ 5088
+ 5089
+ 5090
+ 5091
+ 5092
+ 5093
+ 5094
+ 5095
+ 5096
+ 5097
+ 5098
+ 5099
+ 5100
+ 5101
+ 5102
+ 5103
+ 5104
+ 5105
+ 5106
+ 5107
+ 5108
+ 5109
+ 5110
+ 5111
+ 5112
+ 5113
+ 5114
+ 5115
+ 5116
+ 5117
+ 5118
+ 5119
+ 5120
+ 5121
+ 5122
+ 5123
+ 5124
+ 5125
+ 5126
+ 5127
+ 5128
+ 5129
+ 5130
+ 5131
+ 5132
+ 5133
+ 5134
+ 5135
+ 5136
+ 5137
+ 5138
+ 5139
+ 5140
+ 5141
+ 5142
+ 5143
+ 5144
+ 5145
+ 5146
+ 5147
+ 5148
+ 5149
+ 5150
+ 5151
+ 5152
+ 5153
+ 5154
+ 5155
+ 5156
+ 5157
+ 5158
+ 5159
+ 5160
+ 5161
+ 5162
+ 5163
+ 5164
+ 5165
+ 5166
+ 5167
+ 5168
+ 5169
+ 5170
+ 5171
+ 5172
+ 5173
+ 5174
+ 5175
+ 5176
+ 5177
+ 5178
+ 5179
+ 5180
+ 5181
+ 5182
+ 5183
+ 5184
+ 5185
+ 5186
+ 5187
+ 5188
+ 5189
+ 5190
+ 5191
+ 5192
+ 5193
+ 5194
+ 5195
+ 5196
+ 5197
+ 5198
+ 5199
+ 5200
+ 5201
+ 5202
+ 5203
+ 5204
+ 5205
+ 5206
+ 5207
+ 5208
+ 5209
+ 5210
+ 5211
+ 5212
+ 5213
+ 5214
+ 5215
+ 5216
+ 5217
+ 5218
+ 5219
+ 5220
+ 5221
+ 5222
+ 5223
+ 5224
+ 5225
+ 5226
+ 5227
+ 5228
+ 5229
+ 5230
+ 5231
+ 5232
+ 5233
+ 5234
+ 5235
+ 5236
+ 5237
+ 5238
+ 5239
+ 5240
+ 5241
+ 5242
+ 5243
+ 5244
+ 5245
+ 5246
+ 5247
+ 5248
+ 5249
+ 5250
+ 5251
+ 5252
+ 5253
+ 5254
+ 5255
+ 5256
+ 5257
+ 5258
+ 5259
+ 5260
+ 5261
+ 5262
+ 5263
+ 5264
+ 5265
+ 5266
+ 5267
+ 5268
+ 5269
+ 5270
+ 5271
+ 5272
+ 5273
+ 5274
+ 5275
+ 5276
+ 5277
+ 5278
+ 5279
+ 5280
+ 5281
+ 5282
+ 5283
+ 5284
+ 5285
+ 5286
+ 5287
+ 5288
+ 5289
+ 5290
+ 5291
+ 5292
+ 5293
+ 5294
+ 5295
+ 5296
+ 5297
+ 5298
+ 5299
+ 5300
+ 5301
+ 5302
+ 5303
+ 5304
+ 5305
+ 5306
+ 5307
+ 5308
+ 5309
+ 5310
+ 5311
+ 5312
+ 5313
+ 5314
+ 5315
+ 5316
+ 5317
+ 5318
+ 5319
+ 5320
+ 5321
+ 5322
+ 5323
+ 5324
+ 5325
+ 5326
+ 5327
+ 5328
+ 5329
+ 5330
+ 5331
+ 5332
+ 5333
+ 5334
+ 5335
+ 5336
+ 5337
+ 5338
+ 5339
+ 5340
+ 5341
+ 5342
+ 5343
+ 5344
+ 5345
+ 5346
+ 5347
+ 5348
+ 5349
+ 5350
+ 5351
+ 5352
+ 5353
+ 5354
+ 5355
+ 5356
+ 5357
+ 5358
+ 5359
+ 5360
+ 5361
+ 5362
+ 5363
+ 5364
+ 5365
+ 5366
+ 5367
+ 5368
+ 5369
+ 5370
+ 5371
+ 5372
+ 5373
+ 5374
+ 5375
+ 5376
+ 5377
+ 5378
+ 5379
+ 5380
+ 5381
+ 5382
+ 5383
+ 5384
+ 5385
+ 5386
+ 5387
+ 5388
+ 5389
+ 5390
+ 5391
+ 5392
+ 5393
+ 5394
+ 5395
+ 5396
+ 5397
+ 5398
+ 5399
+ 5400
+ 5401
+ 5402
+ 5403
+ 5404
+ 5405
+ 5406
+ 5407
+ 5408
+ 5409
+ 5410
+ 5411
+ 5412
+ 5413
+ 5414
+ 5415
+ 5416
+ 5417
+ 5418
+ 5419
+ 5420
+ 5421
+ 5422
+ 5423
+ 5424
+ 5425
+ 5426
+ 5427
+ 5428
+ 5429
+ 5430
+ 5431
+ 5432
+ 5433
+ 5434
+ 5435
+ 5436
+ 5437
+ 5438
+ 5439
+ 5440
+ 5441
+ 5442
+ 5443
+ 5444
+ 5445
+ 5446
+ 5447
+ 5448
+ 5449
+ 5450
+ 5451
+ 5452
+ 5453
+ 5454
+ 5455
+ 5456
+ 5457
+ 5458
+ 5459
+ 5460
+ 5461
+ 5462
+ 5463
+ 5464
+ 5465
+ 5466
+ 5467
+ 5468
+ 5469
+ 5470
+ 5471
+ 5472
+ 5473
+ 5474
+ 5475
+ 5476
+ 5477
+ 5478
+ 5479
+ 5480
+ 5481
+ 5482
+ 5483
+ 5484
+ 5485
+ 5486
+ 5487
+ 5488
+ 5489
+ 5490
+ 5491
+ 5492
+ 5493
+ 5494
+ 5495
+ 5496
+ 5497
+ 5498
+ 5499
+ 5500
+ 5501
+ 5502
+ 5503
+ 5504
+ 5505
+ 5506
+ 5507
+ 5508
+ 5509
+ 5510
+ 5511
+ 5512
+ 5513
+ 5514
+ 5515
+ 5516
+ 5517
+ 5518
+ 5519
+ 5520
+ 5521
+ 5522
+ 5523
+ 5524
+ 5525
+ 5526
+ 5527
+ 5528
+ 5529
+ 5530
+ 5531
+ 5532
+ 5533
+ 5534
+ 5535
+ 5536
+ 5537
+ 5538
+ 5539
+ 5540
+ 5541
+ 5542
+ 5543
+ 5544
+ 5545
+ 5546
+ 5547
+ 5548
+ 5549
+ 5550
+ 5551
+ 5552
+ 5553
+ 5554
+ 5555
+ 5556
+ 5557
+ 5558
+ 5559
+ 5560
+ 5561
+ 5562
+ 5563
+ 5564
+ 5565
+ 5566
+ 5567
+ 5568
+ 5569
+ 5570
+ 5571
+ 5572
+ 5573
+ 5574
+ 5575
+ 5576
+ 5577
+ 5578
+ 5579
+ 5580
+ 5581
+ 5582
+ 5583
+ 5584
+ 5585
+ 5586
+ 5587
+ 5588
+ 5589
+ 5590
+ 5591
+ 5592
+ 5593
+ 5594
+ 5595
+ 5596
+ 5597
+ 5598
+ 5599
+ 5600
+ 5601
+ 5602
+ 5603
+ 5604
+ 5605
+ 5606
+ 5607
+ 5608
+ 5609
+ 5610
+ 5611
+ 5612
+ 5613
+ 5614
+ 5615
+ 5616
+ 5617
+ 5618
+ 5619
+ 5620
+ 5621
+ 5622
+ 5623
+ 5624
+ 5625
+ 5626
+ 5627
+ 5628
+ 5629
+ 5630
+ 5631
+ 5632
+ 5633
+ 5634
+ 5635
+ 5636
+ 5637
+ 5638
+ 5639
+ 5640
+ 5641
+ 5642
+ 5643
+ 5644
+ 5645
+ 5646
+ 5647
+ 5648
+ 5649
+ 5650
+ 5651
+ 5652
+ 5653
+ 5654
+ 5655
+ 5656
+ 5657
+ 5658
+ 5659
+ 5660
+ 5661
+ 5662
+ 5663
+ 5664
+ 5665
+ 5666
+ 5667
+ 5668
+ 5669
+ 5670
+ 5671
+ 5672
+ 5673
+ 5674
+ 5675
+ 5676
+ 5677
+ 5678
+ 5679
+ 5680
+ 5681
+ 5682
+ 5683
+ 5684
+ 5685
+ 5686
+ 5687
+ 5688
+ 5689
+ 5690
+ 5691
+ 5692
+ 5693
+ 5694
+ 5695
+ 5696
+ 5697
+ 5698
+ 5699
+ 5700
+ 5701
+ 5702
+ 5703
+ 5704
+ 5705
+ 5706
+ 5707
+ 5708
+ 5709
+ 5710
+ 5711
+ 5712
+ 5713
+ 5714
+ 5715
+ 5716
+ 5717
+ 5718
+ 5719
+ 5720
+ 5721
+ 5722
+ 5723
+ 5724
+ 5725
+ 5726
+ 5727
+ 5728
+ 5729
+ 5730
+ 5731
+ 5732
+ 5733
+ 5734
+ 5735
+ 5736
+ 5737
+ 5738
+ 5739
+ 5740
+ 5741
+ 5742
+ 5743
+ 5744
+ 5745
+ 5746
+ 5747
+ 5748
+ 5749
+ 5750
+ 5751
+ 5752
+ 5753
+ 5754
+ 5755
+ 5756
+ 5757
+ 5758
+ 5759
+ 5760
+ 5761
+ 5762
+ 5763
+ 5764
+ 5765
+ 5766
+ 5767
+ 5768
+ 5769
+ 5770
+ 5771
+ 5772
+ 5773
+ 5774
+ 5775
+ 5776
+ 5777
+ 5778
+ 5779
+ 5780
+ 5781
+ 5782
+ 5783
+ 5784
+ 5785
+ 5786
+ 5787
+ 5788
+ 5789
+ 5790
+ 5791
+ 5792
+ 5793
+ 5794
+ 5795
+ 5796
+ 5797
+ 5798
+ 5799
+ 5800
+ 5801
+ 5802
+ 5803
+ 5804
+ 5805
+ 5806
+ 5807
+ 5808
+ 5809
+ 5810
+ 5811
+ 5812
+ 5813
+ 5814
+ 5815
+ 5816
+ 5817
+ 5818
+ 5819
+ 5820
+ 5821
+ 5822
+ 5823
+ 5824
+ 5825
+ 5826
+ 5827
+ 5828
+ 5829
+ 5830
+ 5831
+ 5832
+ 5833
+ 5834
+ 5835
+ 5836
+ 5837
+ 5838
+ 5839
+ 5840
+ 5841
+ 5842
+ 5843
+ 5844
+ 5845
+ 5846
+ 5847
+ 5848
+ 5849
+ 5850
+ 5851
+ 5852
+ 5853
+ 5854
+ 5855
+ 5856
+ 5857
+ 5858
+ 5859
+ 5860
+ 5861
+ 5862
+ 5863
+ 5864
+ 5865
+ 5866
+ 5867
+ 5868
+ 5869
+ 5870
+ 5871
+ 5872
+ 5873
+ 5874
+ 5875
+ 5876
+ 5877
+ 5878
+ 5879
+ 5880
+ 5881
+ 5882
+ 5883
+ 5884
+ 5885
+ 5886
+ 5887
+ 5888
+ 5889
+ 5890
+ 5891
+ 5892
+ 5893
+ 5894
+ 5895
+ 5896
+ 5897
+ 5898
+ 5899
+ 5900
+ 5901
+ 5902
+ 5903
+ 5904
+ 5905
+ 5906
+ 5907
+ 5908
+ 5909
+ 5910
+ 5911
+ 5912
+ 5913
+ 5914
+ 5915
+ 5916
+ 5917
+ 5918
+ 5919
+ 5920
+ 5921
+ 5922
+ 5923
+ 5924
+ 5925
+ 5926
+ 5927
+ 5928
+ 5929
+ 5930
+ 5931
+ 5932
+ 5933
+ 5934
+ 5935
+ 5936
+ 5937
+ 5938
+ 5939
+ 5940
+ 5941
+ 5942
+ 5943
+ 5944
+ 5945
+ 5946
+ 5947
+ 5948
+ 5949
+ 5950
+ 5951
+ 5952
+ 5953
+ 5954
+ 5955
+ 5956
+ 5957
+ 5958
+ 5959
+ 5960
+ 5961
+ 5962
+ 5963
+ 5964
+ 5965
+ 5966
+ 5967
+ 5968
+ 5969
+ 5970
+ 5971
+ 5972
+ 5973
+ 5974
+ 5975
+ 5976
+ 5977
+ 5978
+ 5979
+ 5980
+ 5981
+ 5982
+ 5983
+ 5984
+ 5985
+ 5986
+ 5987
+ 5988
+ 5989
+ 5990
+ 5991
+ 5992
+ 5993
+ 5994
+ 5995
+ 5996
+ 5997
+ 5998
+ 5999
+ 6000
+ 6001
+ 6002
+ 6003
+ 6004
+ 6005
+ 6006
+ 6007
+ 6008
+ 6009
+ 6010
+ 6011
+ 6012
+ 6013
+ 6014
+ 6015
+ 6016
+ 6017
+ 6018
+ 6019
+ 6020
+ 6021
+ 6022
+ 6023
+ 6024
+ 6025
+ 6026
+ 6027
+ 6028
+ 6029
+ 6030
+ 6031
+ 6032
+ 6033
+ 6034
+ 6035
+ 6036
+ 6037
+ 6038
+ 6039
+ 6040
+ 6041
+ 6042
+ 6043
+ 6044
+ 6045
+ 6046
+ 6047
+ 6048
+ 6049
+ 6050
+ 6051
+ 6052
+ 6053
+ 6054
+ 6055
+ 6056
+ 6057
+ 6058
+ 6059
+ 6060
+ 6061
+ 6062
+ 6063
+ 6064
+ 6065
+ 6066
+ 6067
+ 6068
+ 6069
+ 6070
+ 6071
+ 6072
+ 6073
+ 6074
+ 6075
+ 6076
+ 6077
+ 6078
+ 6079
+ 6080
+ 6081
+ 6082
+ 6083
+ 6084
+ 6085
+ 6086
+ 6087
+ 6088
+ 6089
+ 6090
+ 6091
+ 6092
+ 6093
+ 6094
+ 6095
+ 6096
+ 6097
+ 6098
+ 6099
+ 6100
+ 6101
+ 6102
+ 6103
+ 6104
+ 6105
+ 6106
+ 6107
+ 6108
+ 6109
+ 6110
+ 6111
+ 6112
+ 6113
+ 6114
+ 6115
+ 6116
+ 6117
+ 6118
+ 6119
+ 6120
+ 6121
+ 6122
+ 6123
+ 6124
+ 6125
+ 6126
+ 6127
+ 6128
+ 6129
+ 6130
+ 6131
+ 6132
+ 6133
+ 6134
+ 6135
+ 6136
+ 6137
+ 6138
+ 6139
+ 6140
+ 6141
+ 6142
+ 6143
+ 6144
+ 6145
+ 6146
+ 6147
+ 6148
+ 6149
+ 6150
+ 6151
+ 6152
+ 6153
+ 6154
+ 6155
+ 6156
+ 6157
+ 6158
+ 6159
+ 6160
+ 6161
+ 6162
+ 6163
+ 6164
+ 6165
+ 6166
+ 6167
+ 6168
+ 6169
+ 6170
+ 6171
+ 6172
+ 6173
+ 6174
+ 6175
+ 6176
+ 6177
+ 6178
+ 6179
+ 6180
+ 6181
+ 6182
+ 6183
+ 6184
+ 6185
+ 6186
+ 6187
+ 6188
+ 6189
+ 6190
+ 6191
+ 6192
+ 6193
+ 6194
+ 6195
+ 6196
+ 6197
+ 6198
+ 6199
+ 6200
+ 6201
+ 6202
+ 6203
+ 6204
+ 6205
+ 6206
+ 6207
+ 6208
+ 6209
+ 6210
+ 6211
+ 6212
+ 6213
+ 6214
+ 6215
+ 6216
+ 6217
+ 6218
+ 6219
+ 6220
+ 6221
+ 6222
+ 6223
+ 6224
+ 6225
+ 6226
+ 6227
+ 6228
+ 6229
+ 6230
+ 6231
+ 6232
+ 6233
+ 6234
+ 6235
+ 6236
+ 6237
+ 6238
+ 6239
+ 6240
+ 6241
+ 6242
+ 6243
+ 6244
+ 6245
+ 6246
+ 6247
+ 6248
+ 6249
+ 6250
+ 6251
+ 6252
+ 6253
+ 6254
+ 6255
+ 6256
+ 6257
+ 6258
+ 6259
+ 6260
+ 6261
+ 6262
+ 6263
+ 6264
+ 6265
+ 6266
+ 6267
+ 6268
+ 6269
+ 6270
+ 6271
+ 6272
+ 6273
+ 6274
+ 6275
+ 6276
+ 6277
+ 6278
+ 6279
+ 6280
+ 6281
+ 6282
+ 6283
+ 6284
+ 6285
+ 6286
+ 6287
+ 6288
+ 6289
+ 6290
+ 6291
+ 6292
+ 6293
+ 6294
+ 6295
+ 6296
+ 6297
+ 6298
+ 6299
+ 6300
+ 6301
+ 6302
+ 6303
+ 6304
+ 6305
+ 6306
+ 6307
+ 6308
+ 6309
+ 6310
+ 6311
+ 6312
+ 6313
+ 6314
+ 6315
+ 6316
+ 6317
+ 6318
+ 6319
+ 6320
+ 6321
+ 6322
+ 6323
+ 6324
+ 6325
+ 6326
+ 6327
+ 6328
+ 6329
+ 6330
+ 6331
+ 6332
+ 6333
+ 6334
+ 6335
+ 6336
+ 6337
+ 6338
+ 6339
+ 6340
+ 6341
+ 6342
+ 6343
+ 6344
+ 6345
+ 6346
+ 6347
+ 6348
+ 6349
+ 6350
+ 6351
+ 6352
+ 6353
+ 6354
+ 6355
+ 6356
+ 6357
+ 6358
+ 6359
+ 6360
+ 6361
+ 6362
+ 6363
+ 6364
+ 6365
+ 6366
+ 6367
+ 6368
+ 6369
+ 6370
+ 6371
+ 6372
+ 6373
+ 6374
+ 6375
+ 6376
+ 6377
+ 6378
+ 6379
+ 6380
+ 6381
+ 6382
+ 6383
+ 6384
+ 6385
+ 6386
+ 6387
+ 6388
+ 6389
+ 6390
+ 6391
+ 6392
+ 6393
+ 6394
+ 6395
+ 6396
+ 6397
+ 6398
+ 6399
+ 6400
+ 6401
+ 6402
+ 6403
+ 6404
+ 6405
+ 6406
+ 6407
+ 6408
+ 6409
+ 6410
+ 6411
+ 6412
+ 6413
+ 6414
+ 6415
+ 6416
+ 6417
+ 6418
+ 6419
+ 6420
+ 6421
+ 6422
+ 6423
+ 6424
+ 6425
+ 6426
+ 6427
+ 6428
+ 6429
+ 6430
+ 6431
+ 6432
+ 6433
+ 6434
+ 6435
+ 6436
+ 6437
+ 6438
+ 6439
+ 6440
+ 6441
+ 6442
+ 6443
+ 6444
+ 6445
+ 6446
+ 6447
+ 6448
+ 6449
+ 6450
+ 6451
+ 6452
+ 6453
+ 6454
+ 6455
+ 6456
+ 6457
+ 6458
+ 6459
+ 6460
+ 6461
+ 6462
+ 6463
+ 6464
+ 6465
+ 6466
+ 6467
+ 6468
+ 6469
+ 6470
+ 6471
+ 6472
+ 6473
+ 6474
+ 6475
+ 6476
+ 6477
+ 6478
+ 6479
+ 6480
+ 6481
+ 6482
+ 6483
+ 6484
+ 6485
+ 6486
+ 6487
+ 6488
+ 6489
+ 6490
+ 6491
+ 6492
+ 6493
+ 6494
+ 6495
+ 6496
+ 6497
+ 6498
+ 6499
+ 6500
+ 6501
+ 6502
+ 6503
+ 6504
+ 6505
+ 6506
+ 6507
+ 6508
+ 6509
+ 6510
+ 6511
+ 6512
+ 6513
+ 6514
+ 6515
+ 6516
+ 6517
+ 6518
+ 6519
+ 6520
+ 6521
+ 6522
+ 6523
+ 6524
+ 6525
+ 6526
+ 6527
+ 6528
+ 6529
+ 6530
+ 6531
+ 6532
+ 6533
+ 6534
+ 6535
+ 6536
+ 6537
+ 6538
+ 6539
+ 6540
+ 6541
+ 6542
+ 6543
+ 6544
+ 6545
+ 6546
+ 6547
+ 6548
+ 6549
+ 6550
+ 6551
+ 6552
+ 6553
+ 6554
+ 6555
+ 6556
+ 6557
+ 6558
+ 6559
+ 6560
+ 6561
+ 6562
+ 6563
+ 6564
+ 6565
+ 6566
+ 6567
+ 6568
+ 6569
+ 6570
+ 6571
+ 6572
+ 6573
+ 6574
+ 6575
+ 6576
+ 6577
+ 6578
+ 6579
+ 6580
+ 6581
+ 6582
+ 6583
+ 6584
+ 6585
+ 6586
+ 6587
+ 6588
+ 6589
+ 6590
+ 6591
+ 6592
+ 6593
+ 6594
+ 6595
+ 6596
+ 6597
+ 6598
+ 6599
+ 6600
+ 6601
+ 6602
+ 6603
+ 6604
+ 6605
+ 6606
+ 6607
+ 6608
+ 6609
+ 6610
+ 6611
+ 6612
+ 6613
+ 6614
+ 6615
+ 6616
+ 6617
+ 6618
+ 6619
+ 6620
+ 6621
+ 6622
+ 6623
+ 6624
+ 6625
+ 6626
+ 6627
+ 6628
+ 6629
+ 6630
+ 6631
+ 6632
+ 6633
+ 6634
+ 6635
+ 6636
+ 6637
+ 6638
+ 6639
+ 6640
+ 6641
+ 6642
+ 6643
+ 6644
+ 6645
+ 6646
+ 6647
+ 6648
+ 6649
+ 6650
+ 6651
+ 6652
+ 6653
+ 6654
+ 6655
+ 6656
+ 6657
+ 6658
+ 6659
+ 6660
+ 6661
+ 6662
+ 6663
+ 6664
+ 6665
+ 6666
+ 6667
+ 6668
+ 6669
+ 6670
+ 6671
+ 6672
+ 6673
+ 6674
+ 6675
+ 6676
+ 6677
+ 6678
+ 6679
+ 6680
+ 6681
+ 6682
+ 6683
+ 6684
+ 6685
+ 6686
+ 6687
+ 6688
+ 6689
+ 6690
+ 6691
+ 6692
+ 6693
+ 6694
+ 6695
+ 6696
+ 6697
+ 6698
+ 6699
+ 6700
+ 6701
+ 6702
+ 6703
+ 6704
+ 6705
+ 6706
+ 6707
+ 6708
+ 6709
+ 6710
+ 6711
+ 6712
+ 6713
+ 6714
+ 6715
+ 6716
+ 6717
+ 6718
+ 6719
+ 6720
+ 6721
+ 6722
+ 6723
+ 6724
+ 6725
+ 6726
+ 6727
+ 6728
+ 6729
+ 6730
+ 6731
+ 6732
+ 6733
+ 6734
+ 6735
+ 6736
+ 6737
+ 6738
+ 6739
+ 6740
+ 6741
+ 6742
+ 6743
+ 6744
+ 6745
+ 6746
+ 6747
+ 6748
+ 6749
+ 6750
+ 6751
+ 6752
+ 6753
+ 6754
+ 6755
+ 6756
+ 6757
+ 6758
+ 6759
+ 6760
+ 6761
+ 6762
+ 6763
+ 6764
+ 6765
+ 6766
+ 6767
+ 6768
+ 6769
+ 6770
+ 6771
+ 6772
+ 6773
+ 6774
+ 6775
+ 6776
+ 6777
+ 6778
+ 6779
+ 6780
+ 6781
+ 6782
+ 6783
+ 6784
+ 6785
+ 6786
+ 6787
+ 6788
+ 6789
+ 6790
+ 6791
+ 6792
+ 6793
+ 6794
+ 6795
+ 6796
+ 6797
+ 6798
+ 6799
+ 6800
+ 6801
+ 6802
+ 6803
+ 6804
+ 6805
+ 6806
+ 6807
+ 6808
+ 6809
+ 6810
+ 6811
+ 6812
+ 6813
+ 6814
+ 6815
+ 6816
+ 6817
+ 6818
+ 6819
+ 6820
+ 6821
+ 6822
+ 6823
+ 6824
+ 6825
+ 6826
+ 6827
+ 6828
+ 6829
+ 6830
+ 6831
+ 6832
+ 6833
+ 6834
+ 6835
+ 6836
+ 6837
+ 6838
+ 6839
+ 6840
+ 6841
+ 6842
+ 6843
+ 6844
+ 6845
+ 6846
+ 6847
+ 6848
+ 6849
+ 6850
+ 6851
+ 6852
+ 6853
+ 6854
+ 6855
+ 6856
+ 6857
+ 6858
+ 6859
+ 6860
+ 6861
+ 6862
+ 6863
+ 6864
+ 6865
+ 6866
+ 6867
+ 6868
+ 6869
+ 6870
+ 6871
+ 6872
+ 6873
+ 6874
+ 6875
+ 6876
+ 6877
+ 6878
+ 6879
+ 6880
+ 6881
+ 6882
+ 6883
+ 6884
+ 6885
+ 6886
+ 6887
+ 6888
+ 6889
+ 6890
+ 6891
+ 6892
+ 6893
+ 6894
+ 6895
+ 6896
+ 6897
+ 6898
+ 6899
+ 6900
+ 6901
+ 6902
+ 6903
+ 6904
+ 6905
+ 6906
+ 6907
+ 6908
+ 6909
+ 6910
+ 6911
+ 6912
+ 6913
+ 6914
+ 6915
+ 6916
+ 6917
+ 6918
+ 6919
+ 6920
+ 6921
+ 6922
+ 6923
+ 6924
+ 6925
+ 6926
+ 6927
+ 6928
+ 6929
+ 6930
+ 6931
+ 6932
+ 6933
+ 6934
+ 6935
+ 6936
+ 6937
+ 6938
+ 6939
+ 6940
+ 6941
+ 6942
+ 6943
+ 6944
+ 6945
+ 6946
+ 6947
+ 6948
+ 6949
+ 6950
+ 6951
+ 6952
+ 6953
+ 6954
+ 6955
+ 6956
+ 6957
+ 6958
+ 6959
+ 6960
+ 6961
+ 6962
+ 6963
+ 6964
+ 6965
+ 6966
+ 6967
+ 6968
+ 6969
+ 6970
+ 6971
+ 6972
+ 6973
+ 6974
+ 6975
+ 6976
+ 6977
+ 6978
+ 6979
+ 6980
+ 6981
+ 6982
+ 6983
+ 6984
+ 6985
+ 6986
+ 6987
+ 6988
+ 6989
+ 6990
+ 6991
+ 6992
+ 6993
+ 6994
+ 6995
+ 6996
+ 6997
+ 6998
+ 6999
+ 7000
+ 7001
+ 7002
+ 7003
+ 7004
+ 7005
+ 7006
+ 7007
+ 7008
+ 7009
+ 7010
+ 7011
+ 7012
+ 7013
+ 7014
+ 7015
+ 7016
+ 7017
+ 7018
+ 7019
+ 7020
+ 7021
+ 7022
+ 7023
+ 7024
+ 7025
+ 7026
+ 7027
+ 7028
+ 7029
+ 7030
+ 7031
+ 7032
+ 7033
+ 7034
+ 7035
+ 7036
+ 7037
+ 7038
+ 7039
+ 7040
+ 7041
+ 7042
+ 7043
+ 7044
+ 7045
+ 7046
+ 7047
+ 7048
+ 7049
+ 7050
+ 7051
+ 7052
+ 7053
+ 7054
+ 7055
+ 7056
+ 7057
+ 7058
+ 7059
+ 7060
+ 7061
+ 7062
+ 7063
+ 7064
+ 7065
+ 7066
+ 7067
+ 7068
+ 7069
+ 7070
+ 7071
+ 7072
+ 7073
+ 7074
+ 7075
+ 7076
+ 7077
+ 7078
+ 7079
+ 7080
+ 7081
+ 7082
+ 7083
+ 7084
+ 7085
+ 7086
+ 7087
+ 7088
+ 7089
+ 7090
+ 7091
+ 7092
+ 7093
+ 7094
+ 7095
+ 7096
+ 7097
+ 7098
+ 7099
+ 7100
+ 7101
+ 7102
+ 7103
+ 7104
+ 7105
+ 7106
+ 7107
+ 7108
+ 7109
+ 7110
+ 7111
+ 7112
+ 7113
+ 7114
+ 7115
+ 7116
+ 7117
+ 7118
+ 7119
+ 7120
+ 7121
+ 7122
+ 7123
+ 7124
+ 7125
+ 7126
+ 7127
+ 7128
+ 7129
+ 7130
+ 7131
+ 7132
+ 7133
+ 7134
+ 7135
+ 7136
+ 7137
+ 7138
+ 7139
+ 7140
+ 7141
+ 7142
+ 7143
+ 7144
+ 7145
+ 7146
+ 7147
+ 7148
+ 7149
+ 7150
+ 7151
+ 7152
+ 7153
+ 7154
+ 7155
+ 7156
+ 7157
+ 7158
+ 7159
+ 7160
+ 7161
+ 7162
+ 7163
+ 7164
+ 7165
+ 7166
+ 7167
+ 7168
+ 7169
+ 7170
+ 7171
+ 7172
+ 7173
+ 7174
+ 7175
+ 7176
+ 7177
+ 7178
+ 7179
+ 7180
+ 7181
+ 7182
+ 7183
+ 7184
+ 7185
+ 7186
+ 7187
+ 7188
+ 7189
+ 7190
+ 7191
+ 7192
+ 7193
+ 7194
+ 7195
+ 7196
+ 7197
+ 7198
+ 7199
+ 7200
+ 7201
+ 7202
+ 7203
+ 7204
+ 7205
+ 7206
+ 7207
+ 7208
+ 7209
+ 7210
+ 7211
+ 7212
+ 7213
+ 7214
+ 7215
+ 7216
+ 7217
+ 7218
+ 7219
+ 7220
+ 7221
+ 7222
+ 7223
+ 7224
+ 7225
+ 7226
+ 7227
+ 7228
+ 7229
+ 7230
+ 7231
+ 7232
+ 7233
+ 7234
+ 7235
+ 7236
+ 7237
+ 7238
+ 7239
+ 7240
+ 7241
+ 7242
+ 7243
+ 7244
+ 7245
+ 7246
+ 7247
+ 7248
+ 7249
+ 7250
+ 7251
+ 7252
+ 7253
+ 7254
+ 7255
+ 7256
+ 7257
+ 7258
+ 7259
+ 7260
+ 7261
+ 7262
+ 7263
+ 7264
+ 7265
+ 7266
+ 7267
+ 7268
+ 7269
+ 7270
+ 7271
+ 7272
+ 7273
+ 7274
+ 7275
+ 7276
+ 7277
+ 7278
+ 7279
+ 7280
+ 7281
+ 7282
+ 7283
+ 7284
+ 7285
+ 7286
+ 7287
+ 7288
+ 7289
+ 7290
+ 7291
+ 7292
+ 7293
+ 7294
+ 7295
+ 7296
+ 7297
+ 7298
+ 7299
+ 7300
+ 7301
+ 7302
+ 7303
+ 7304
+ 7305
+ 7306
+ 7307
+ 7308
+ 7309
+ 7310
+ 7311
+ 7312
+ 7313
+ 7314
+ 7315
+ 7316
+ 7317
+ 7318
+ 7319
+ 7320
+ 7321
+ 7322
+ 7323
+ 7324
+ 7325
+ 7326
+ 7327
+ 7328
+ 7329
+ 7330
+ 7331
+ 7332
+ 7333
+ 7334
+ 7335
+ 7336
+ 7337
+ 7338
+ 7339
+ 7340
+ 7341
+ 7342
+ 7343
+ 7344
+ 7345
+ 7346
+ 7347
+ 7348
+ 7349
+ 7350
+ 7351
+ 7352
+ 7353
+ 7354
+ 7355
+ 7356
+ 7357
+ 7358
+ 7359
+ 7360
+ 7361
+ 7362
+ 7363
+ 7364
+ 7365
+ 7366
+ 7367
+ 7368
+ 7369
+ 7370
+ 7371
+ 7372
+ 7373
+ 7374
+ 7375
+ 7376
+ 7377
+ 7378
+ 7379
+ 7380
+ 7381
+ 7382
+ 7383
+ 7384
+ 7385
+ 7386
+ 7387
+ 7388
+ 7389
+ 7390
+ 7391
+ 7392
+ 7393
+ 7394
+ 7395
+ 7396
+ 7397
+ 7398
+ 7399
+ 7400
+ 7401
+ 7402
+ 7403
+ 7404
+ 7405
+ 7406
+ 7407
+ 7408
+ 7409
+ 7410
+ 7411
+ 7412
+ 7413
+ 7414
+ 7415
+ 7416
+ 7417
+ 7418
+ 7419
+ 7420
+ 7421
+ 7422
+ 7423
+ 7424
+ 7425
+ 7426
+ 7427
+ 7428
+ 7429
+ 7430
+ 7431
+ 7432
+ 7433
+ 7434
+ 7435
+ 7436
+ 7437
+ 7438
+ 7439
+ 7440
+ 7441
+ 7442
+ 7443
+ 7444
+ 7445
+ 7446
+ 7447
+ 7448
+ 7449
+ 7450
+ 7451
+ 7452
+ 7453
+ 7454
+ 7455
+ 7456
+ 7457
+ 7458
+ 7459
+ 7460
+ 7461
+ 7462
+ 7463
+ 7464
+ 7465
+ 7466
+ 7467
+ 7468
+ 7469
+ 7470
+ 7471
+ 7472
+ 7473
+ 7474
+ 7475
+ 7476
+ 7477
+ 7478
+ 7479
+ 7480
+ 7481
+ 7482
+ 7483
+ 7484
+ 7485
+ 7486
+ 7487
+ 7488
+ 7489
+ 7490
+ 7491
+ 7492
+ 7493
+ 7494
+ 7495
+ 7496
+ 7497
+ 7498
+ 7499
+ 7500
+ 7501
+ 7502
+ 7503
+ 7504
+ 7505
+ 7506
+ 7507
+ 7508
+ 7509
+ 7510
+ 7511
+ 7512
+ 7513
+ 7514
+ 7515
+ 7516
+ 7517
+ 7518
+ 7519
+ 7520
+ 7521
+ 7522
+ 7523
+ 7524
+ 7525
+ 7526
+ 7527
+ 7528
+ 7529
+ 7530
+ 7531
+ 7532
+ 7533
+ 7534
+ 7535
+ 7536
+ 7537
+ 7538
+ 7539
+ 7540
+ 7541
+ 7542
+ 7543
+ 7544
+ 7545
+ 7546
+ 7547
+ 7548
+ 7549
+ 7550
+ 7551
+ 7552
+ 7553
+ 7554
+ 7555
+ 7556
+ 7557
+ 7558
+ 7559
+ 7560
+ 7561
+ 7562
+ 7563
+ 7564
+ 7565
+ 7566
+ 7567
+ 7568
+ 7569
+ 7570
+ 7571
+ 7572
+ 7573
+ 7574
+ 7575
+ 7576
+ 7577
+ 7578
+ 7579
+ 7580
+ 7581
+ 7582
+ 7583
+ 7584
+ 7585
+ 7586
+ 7587
+ 7588
+ 7589
+ 7590
+ 7591
+ 7592
+ 7593
+ 7594
+ 7595
+ 7596
+ 7597
+ 7598
+ 7599
+ 7600
+ 7601
+ 7602
+ 7603
+ 7604
+ 7605
+ 7606
+ 7607
+ 7608
+ 7609
+ 7610
+ 7611
+ 7612
+ 7613
+ 7614
+ 7615
+ 7616
+ 7617
+ 7618
+ 7619
+ 7620
+ 7621
+ 7622
+ 7623
+ 7624
+ 7625
+ 7626
+ 7627
+ 7628
+ 7629
+ 7630
+ 7631
+ 7632
+ 7633
+ 7634
+ 7635
+ 7636
+ 7637
+ 7638
+ 7639
+ 7640
+ 7641
+ 7642
+ 7643
+ 7644
+ 7645
+ 7646
+ 7647
+ 7648
+ 7649
+ 7650
+ 7651
+ 7652
+ 7653
+ 7654
+ 7655
+ 7656
+ 7657
+ 7658
+ 7659
+ 7660
+ 7661
+ 7662
+ 7663
+ 7664
+ 7665
+ 7666
+ 7667
+ 7668
+ 7669
+ 7670
+ 7671
+ 7672
+ 7673
+ 7674
+ 7675
+ 7676
+ 7677
+ 7678
+ 7679
+ 7680
+ 7681
+ 7682
+ 7683
+ 7684
+ 7685
+ 7686
+ 7687
+ 7688
+ 7689
+ 7690
+ 7691
+ 7692
+ 7693
+ 7694
+ 7695
+ 7696
+ 7697
+ 7698
+ 7699
+ 7700
+ 7701
+ 7702
+ 7703
+ 7704
+ 7705
+ 7706
+ 7707
+ 7708
+ 7709
+ 7710
+ 7711
+ 7712
+ 7713
+ 7714
+ 7715
+ 7716
+ 7717
+ 7718
+ 7719
+ 7720
+ 7721
+ 7722
+ 7723
+ 7724
+ 7725
+ 7726
+ 7727
+ 7728
+ 7729
+ 7730
+ 7731
+ 7732
+ 7733
+ 7734
+ 7735
+ 7736
+ 7737
+ 7738
+ 7739
+ 7740
+ 7741
+ 7742
+ 7743
+ 7744
+ 7745
+ 7746
+ 7747
+ 7748
+ 7749
+ 7750
+ 7751
+ 7752
+ 7753
+ 7754
+ 7755
+ 7756
+ 7757
+ 7758
+ 7759
+ 7760
+ 7761
+ 7762
+ 7763
+ 7764
+ 7765
+ 7766
+ 7767
+ 7768
+ 7769
+ 7770
+ 7771
+ 7772
+ 7773
+ 7774
+ 7775
+ 7776
+ 7777
+ 7778
+ 7779
+ 7780
+ 7781
+ 7782
+ 7783
+ 7784
+ 7785
+ 7786
+ 7787
+ 7788
+ 7789
+ 7790
+ 7791
+ 7792
+ 7793
+ 7794
+ 7795
+ 7796
+ 7797
+ 7798
+ 7799
+ 7800
+ 7801
+ 7802
+ 7803
+ 7804
+ 7805
+ 7806
+ 7807
+ 7808
+ 7809
+ 7810
+ 7811
+ 7812
+ 7813
+ 7814
+ 7815
+ 7816
+ 7817
+ 7818
+ 7819
+ 7820
+ 7821
+ 7822
+ 7823
+ 7824
+ 7825
+ 7826
+ 7827
+ 7828
+ 7829
+ 7830
+ 7831
+ 7832
+ 7833
+ 7834
+ 7835
+ 7836
+ 7837
+ 7838
+ 7839
+ 7840
+ 7841
+ 7842
+ 7843
+ 7844
+ 7845
+ 7846
+ 7847
+ 7848
+ 7849
+ 7850
+ 7851
+ 7852
+ 7853
+ 7854
+ 7855
+ 7856
+ 7857
+ 7858
+ 7859
+ 7860
+ 7861
+ 7862
+ 7863
+ 7864
+ 7865
+ 7866
+ 7867
+ 7868
+ 7869
+ 7870
+ 7871
+ 7872
+ 7873
+ 7874
+ 7875
+ 7876
+ 7877
+ 7878
+ 7879
+ 7880
+ 7881
+ 7882
+ 7883
+ 7884
+ 7885
+ 7886
+ 7887
+ 7888
+ 7889
+ 7890
+ 7891
+ 7892
+ 7893
+ 7894
+ 7895
+ 7896
+ 7897
+ 7898
+ 7899
+ 7900
+ 7901
+ 7902
+ 7903
+ 7904
+ 7905
+ 7906
+ 7907
+ 7908
+ 7909
+ 7910
+ 7911
+ 7912
+ 7913
+ 7914
+ 7915
+ 7916
+ 7917
+ 7918
+ 7919
+ 7920
+ 7921
+ 7922
+ 7923
+ 7924
+ 7925
+ 7926
+ 7927
+ 7928
+ 7929
+ 7930
+ 7931
+ 7932
+ 7933
+ 7934
+ 7935
+ 7936
+ 7937
+ 7938
+ 7939
+ 7940
+ 7941
+ 7942
+ 7943
+ 7944
+ 7945
+ 7946
+ 7947
+ 7948
+ 7949
+ 7950
+ 7951
+ 7952
+ 7953
+ 7954
+ 7955
+ 7956
+ 7957
+ 7958
+ 7959
+ 7960
+ 7961
+ 7962
+ 7963
+ 7964
+ 7965
+ 7966
+ 7967
+ 7968
+ 7969
+ 7970
+ 7971
+ 7972
+ 7973
+ 7974
+ 7975
+ 7976
+ 7977
+ 7978
+ 7979
+ 7980
+ 7981
+ 7982
+ 7983
+ 7984
+ 7985
+ 7986
+ 7987
+ 7988
+ 7989
+ 7990
+ 7991
+ 7992
+ 7993
+ 7994
+ 7995
+ 7996
+ 7997
+ 7998
+ 7999
+ 8000
+ 8001
+ 8002
+ 8003
+ 8004
+ 8005
+ 8006
+ 8007
+ 8008
+ 8009
+ 8010
+ 8011
+ 8012
+ 8013
+ 8014
+ 8015
+ 8016
+ 8017
+ 8018
+ 8019
+ 8020
+ 8021
+ 8022
+ 8023
+ 8024
+ 8025
+ 8026
+ 8027
+ 8028
+ 8029
+ 8030
+ 8031
+ 8032
+ 8033
+ 8034
+ 8035
+ 8036
+ 8037
+ 8038
+ 8039
+ 8040
+ 8041
+ 8042
+ 8043
+ 8044
+ 8045
+ 8046
+ 8047
+ 8048
+ 8049
+ 8050
+ 8051
+ 8052
+ 8053
+ 8054
+ 8055
+ 8056
+ 8057
+ 8058
+ 8059
+ 8060
+ 8061
+ 8062
+ 8063
+ 8064
+ 8065
+ 8066
+ 8067
+ 8068
+ 8069
+ 8070
+ 8071
+ 8072
+ 8073
+ 8074
+ 8075
+ 8076
+ 8077
+ 8078
+ 8079
+ 8080
+ 8081
+ 8082
+ 8083
+ 8084
+ 8085
+ 8086
+ 8087
+ 8088
+ 8089
+ 8090
+ 8091
+ 8092
+ 8093
+ 8094
+ 8095
+ 8096
+ 8097
+ 8098
+ 8099
+ 8100
+ 8101
+ 8102
+ 8103
+ 8104
+ 8105
+ 8106
+ 8107
+ 8108
+ 8109
+ 8110
+ 8111
+ 8112
+ 8113
+ 8114
+ 8115
+ 8116
+ 8117
+ 8118
+ 8119
+ 8120
+ 8121
+ 8122
+ 8123
+ 8124
+ 8125
+ 8126
+ 8127
+ 8128
+ 8129
+ 8130
+ 8131
+ 8132
+ 8133
+ 8134
+ 8135
+ 8136
+ 8137
+ 8138
+ 8139
+ 8140
+ 8141
+ 8142
+ 8143
+ 8144
+ 8145
+ 8146
+ 8147
+ 8148
+ 8149
+ 8150
+ 8151
+ 8152
+ 8153
+ 8154
+ 8155
+ 8156
+ 8157
+ 8158
+ 8159
+ 8160
+ 8161
+ 8162
+ 8163
+ 8164
+ 8165
+ 8166
+ 8167
+ 8168
+ 8169
+ 8170
+ 8171
+ 8172
+ 8173
+ 8174
+ 8175
+ 8176
+ 8177
+ 8178
+ 8179
+ 8180
+ 8181
+ 8182
+ 8183
+ 8184
+ 8185
+ 8186
+ 8187
+ 8188
+ 8189
+ 8190
+ 8191
+ 8192
+ 8193
+ 8194
+ 8195
+ 8196
+ 8197
+ 8198
+ 8199
+ 8200
+ 8201
+ 8202
+ 8203
+ 8204
+ 8205
+ 8206
+ 8207
+ 8208
+ 8209
+ 8210
+ 8211
+ 8212
+ 8213
+ 8214
+ 8215
+ 8216
+ 8217
+ 8218
+ 8219
+ 8220
+ 8221
+ 8222
+ 8223
+ 8224
+ 8225
+ 8226
+ 8227
+ 8228
+ 8229
+ 8230
+ 8231
+ 8232
+ 8233
+ 8234
+ 8235
+ 8236
+ 8237
+ 8238
+ 8239
+ 8240
+ 8241
+ 8242
+ 8243
+ 8244
+ 8245
+ 8246
+ 8247
+ 8248
+ 8249
+ 8250
+ 8251
+ 8252
+ 8253
+ 8254
+ 8255
+ 8256
+ 8257
+ 8258
+ 8259
+ 8260
+ 8261
+ 8262
+ 8263
+ 8264
+ 8265
+ 8266
+ 8267
+ 8268
+ 8269
+ 8270
+ 8271
+ 8272
+ 8273
+ 8274
+ 8275
+ 8276
+ 8277
+ 8278
+ 8279
+ 8280
+ 8281
+ 8282
+ 8283
+ 8284
+ 8285
+ 8286
+ 8287
+ 8288
+ 8289
+ 8290
+ 8291
+ 8292
+ 8293
+ 8294
+ 8295
+ 8296
+ 8297
+ 8298
+ 8299
+ 8300
+ 8301
+ 8302
+ 8303
+ 8304
+ 8305
+ 8306
+ 8307
+ 8308
+ 8309
+ 8310
+ 8311
+ 8312
+ 8313
+ 8314
+ 8315
+ 8316
+ 8317
+ 8318
+ 8319
+ 8320
+ 8321
+ 8322
+ 8323
+ 8324
+ 8325
+ 8326
+ 8327
+ 8328
+ 8329
+ 8330
+ 8331
+ 8332
+ 8333
+ 8334
+ 8335
+ 8336
+ 8337
+ 8338
+ 8339
+ 8340
+ 8341
+ 8342
+ 8343
+ 8344
+ 8345
+ 8346
+ 8347
+ 8348
+ 8349
+ 8350
+ 8351
+ 8352
+ 8353
+ 8354
+ 8355
+ 8356
+ 8357
+ 8358
+ 8359
+ 8360
+ 8361
+ 8362
+ 8363
+ 8364
+ 8365
+ 8366
+ 8367
+ 8368
+ 8369
+ 8370
+ 8371
+ 8372
+ 8373
+ 8374
+ 8375
+ 8376
+ 8377
+ 8378
+ 8379
+ 8380
+ 8381
+ 8382
+ 8383
+ 8384
+ 8385
+ 8386
+ 8387
+ 8388
+ 8389
+ 8390
+ 8391
+ 8392
+ 8393
+ 8394
+ 8395
+ 8396
+ 8397
+ 8398
+ 8399
+ 8400
+ 8401
+ 8402
+ 8403
+ 8404
+ 8405
+ 8406
+ 8407
+ 8408
+ 8409
+ 8410
+ 8411
+ 8412
+ 8413
+ 8414
+ 8415
+ 8416
+ 8417
+ 8418
+ 8419
+ 8420
+ 8421
+ 8422
+ 8423
+ 8424
+ 8425
+ 8426
+ 8427
+ 8428
+ 8429
+ 8430
+ 8431
+ 8432
+ 8433
+ 8434
+ 8435
+ 8436
+ 8437
+ 8438
+ 8439
+ 8440
+ 8441
+ 8442
+ 8443
+ 8444
+ 8445
+ 8446
+ 8447
+ 8448
+ 8449
+ 8450
+ 8451
+ 8452
+ 8453
+ 8454
+ 8455
+ 8456
+ 8457
+ 8458
+ 8459
+ 8460
+ 8461
+ 8462
+ 8463
+ 8464
+ 8465
+ 8466
+ 8467
+ 8468
+ 8469
+ 8470
+ 8471
+ 8472
+ 8473
+ 8474
+ 8475
+ 8476
+ 8477
+ 8478
+ 8479
+ 8480
+ 8481
+ 8482
+ 8483
+ 8484
+ 8485
+ 8486
+ 8487
+ 8488
+ 8489
+ 8490
+ 8491
+ 8492
+ 8493
+ 8494
+ 8495
+ 8496
+ 8497
+ 8498
+ 8499
+ 8500
+ 8501
+ 8502
+ 8503
+ 8504
+ 8505
+ 8506
+ 8507
+ 8508
+ 8509
+ 8510
+ 8511
+ 8512
+ 8513
+ 8514
+ 8515
+ 8516
+ 8517
+ 8518
+ 8519
+ 8520
+ 8521
+ 8522
+ 8523
+ 8524
+ 8525
+ 8526
+ 8527
+ 8528
+ 8529
+ 8530
+ 8531
+ 8532
+ 8533
+ 8534
+ 8535
+ 8536
+ 8537
+ 8538
+ 8539
+ 8540
+ 8541
+ 8542
+ 8543
+ 8544
+ 8545
+ 8546
+ 8547
+ 8548
+ 8549
+ 8550
+ 8551
+ 8552
+ 8553
+ 8554
+ 8555
+ 8556
+ 8557
+ 8558
+ 8559
+ 8560
+ 8561
+ 8562
+ 8563
+ 8564
+ 8565
+ 8566
+ 8567
+ 8568
+ 8569
+ 8570
+ 8571
+ 8572
+ 8573
+ 8574
+ 8575
+ 8576
+ 8577
+ 8578
+ 8579
+ 8580
+ 8581
+ 8582
+ 8583
+ 8584
+ 8585
+ 8586
+ 8587
+ 8588
+ 8589
+ 8590
+ 8591
+ 8592
+ 8593
+ 8594
+ 8595
+ 8596
+ 8597
+ 8598
+ 8599
+ 8600
+ 8601
+ 8602
+ 8603
+ 8604
+ 8605
+ 8606
+ 8607
+ 8608
+ 8609
+ 8610
+ 8611
+ 8612
+ 8613
+ 8614
+ 8615
+ 8616
+ 8617
+ 8618
+ 8619
+ 8620
+ 8621
+ 8622
+ 8623
+ 8624
+ 8625
+ 8626
+ 8627
+ 8628
+ 8629
+ 8630
+ 8631
+ 8632
+ 8633
+ 8634
+ 8635
+ 8636
+ 8637
+ 8638
+ 8639
+ 8640
+ 8641
+ 8642
+ 8643
+ 8644
+ 8645
+ 8646
+ 8647
+ 8648
+ 8649
+ 8650
+ 8651
+ 8652
+ 8653
+ 8654
+ 8655
+ 8656
+ 8657
+ 8658
+ 8659
+ 8660
+ 8661
+ 8662
+ 8663
+ 8664
+ 8665
+ 8666
+ 8667
+ 8668
+ 8669
+ 8670
+ 8671
+ 8672
+ 8673
+ 8674
+ 8675
+ 8676
+ 8677
+ 8678
+ 8679
+ 8680
+ 8681
+ 8682
+ 8683
+ 8684
+ 8685
+ 8686
+ 8687
+ 8688
+ 8689
+ 8690
+ 8691
+ 8692
+ 8693
+ 8694
+ 8695
+ 8696
+ 8697
+ 8698
+ 8699
+ 8700
+ 8701
+ 8702
+ 8703
+ 8704
+ 8705
+ 8706
+ 8707
+ 8708
+ 8709
+ 8710
+ 8711
+ 8712
+ 8713
+ 8714
+ 8715
+ 8716
+ 8717
+ 8718
+ 8719
+ 8720
+ 8721
+ 8722
+ 8723
+ 8724
+ 8725
+ 8726
+ 8727
+ 8728
+ 8729
+ 8730
+ 8731
+ 8732
+ 8733
+ 8734
+ 8735
+ 8736
+ 8737
+ 8738
+ 8739
+ 8740
+ 8741
+ 8742
+ 8743
+ 8744
+ 8745
+ 8746
+ 8747
+ 8748
+ 8749
+ 8750
+ 8751
+ 8752
+ 8753
+ 8754
+ 8755
+ 8756
+ 8757
+ 8758
+ 8759
+ 8760
+ 8761
+ 8762
+ 8763
+ 8764
+ 8765
+ 8766
+ 8767
+ 8768
+ 8769
+ 8770
+ 8771
+ 8772
+ 8773
+ 8774
+ 8775
+ 8776
+ 8777
+ 8778
+ 8779
+ 8780
+ 8781
+ 8782
+ 8783
+ 8784
+ 8785
+ 8786
+ 8787
+ 8788
+ 8789
+ 8790
+ 8791
+ 8792
+ 8793
+ 8794
+ 8795
+ 8796
+ 8797
+ 8798
+ 8799
+ 8800
+ 8801
+ 8802
+ 8803
+ 8804
+ 8805
+ 8806
+ 8807
+ 8808
+ 8809
+ 8810
+ 8811
+ 8812
+ 8813
+ 8814
+ 8815
+ 8816
+ 8817
+ 8818
+ 8819
+ 8820
+ 8821
+ 8822
+ 8823
+ 8824
+ 8825
+ 8826
+ 8827
+ 8828
+ 8829
+ 8830
+ 8831
+ 8832
+ 8833
+ 8834
+ 8835
+ 8836
+ 8837
+ 8838
+ 8839
+ 8840
+ 8841
+ 8842
+ 8843
+ 8844
+ 8845
+ 8846
+ 8847
+ 8848
+ 8849
+ 8850
+ 8851
+ 8852
+ 8853
+ 8854
+ 8855
+ 8856
+ 8857
+ 8858
+ 8859
+ 8860
+ 8861
+ 8862
+ 8863
+ 8864
+ 8865
+ 8866
+ 8867
+ 8868
+ 8869
+ 8870
+ 8871
+ 8872
+ 8873
+ 8874
+ 8875
+ 8876
+ 8877
+ 8878
+ 8879
+ 8880
+ 8881
+ 8882
+ 8883
+ 8884
+ 8885
+ 8886
+ 8887
+ 8888
+ 8889
+ 8890
+ 8891
+ 8892
+ 8893
+ 8894
+ 8895
+ 8896
+ 8897
+ 8898
+ 8899
+ 8900
+ 8901
+ 8902
+ 8903
+ 8904
+ 8905
+ 8906
+ 8907
+ 8908
+ 8909
+ 8910
+ 8911
+ 8912
+ 8913
+ 8914
+ 8915
+ 8916
+ 8917
+ 8918
+ 8919
+ 8920
+ 8921
+ 8922
+ 8923
+ 8924
+ 8925
+ 8926
+ 8927
+ 8928
+ 8929
+ 8930
+ 8931
+ 8932
+ 8933
+ 8934
+ 8935
+ 8936
+ 8937
+ 8938
+ 8939
+ 8940
+ 8941
+ 8942
+ 8943
+ 8944
+ 8945
+ 8946
+ 8947
+ 8948
+ 8949
+ 8950
+ 8951
+ 8952
+ 8953
+ 8954
+ 8955
+ 8956
+ 8957
+ 8958
+ 8959
+ 8960
+ 8961
+ 8962
+ 8963
+ 8964
+ 8965
+ 8966
+ 8967
+ 8968
+ 8969
+ 8970
+ 8971
+ 8972
+ 8973
+ 8974
+ 8975
+ 8976
+ 8977
+ 8978
+ 8979
+ 8980
+ 8981
+ 8982
+ 8983
+ 8984
+ 8985
+ 8986
+ 8987
+ 8988
+ 8989
+ 8990
+ 8991
+ 8992
+ 8993
+ 8994
+ 8995
+ 8996
+ 8997
+ 8998
+ 8999
+ 9000
+ 9001
+ 9002
+ 9003
+ 9004
+ 9005
+ 9006
+ 9007
+ 9008
+ 9009
+ 9010
+ 9011
+ 9012
+ 9013
+ 9014
+ 9015
+ 9016
+ 9017
+ 9018
+ 9019
+ 9020
+ 9021
+ 9022
+ 9023
+ 9024
+ 9025
+ 9026
+ 9027
+ 9028
+ 9029
+ 9030
+ 9031
+ 9032
+ 9033
+ 9034
+ 9035
+ 9036
+ 9037
+ 9038
+ 9039
+ 9040
+ 9041
+ 9042
+ 9043
+ 9044
+ 9045
+ 9046
+ 9047
+ 9048
+ 9049
+ 9050
+ 9051
+ 9052
+ 9053
+ 9054
+ 9055
+ 9056
+ 9057
+ 9058
+ 9059
+ 9060
+ 9061
+ 9062
+ 9063
+ 9064
+ 9065
+ 9066
+ 9067
+ 9068
+ 9069
+ 9070
+ 9071
+ 9072
+ 9073
+ 9074
+ 9075
+ 9076
+ 9077
+ 9078
+ 9079
+ 9080
+ 9081
+ 9082
+ 9083
+ 9084
+ 9085
+ 9086
+ 9087
+ 9088
+ 9089
+ 9090
+ 9091
+ 9092
+ 9093
+ 9094
+ 9095
+ 9096
+ 9097
+ 9098
+ 9099
+ 9100
+ 9101
+ 9102
+ 9103
+ 9104
+ 9105
+ 9106
+ 9107
+ 9108
+ 9109
+ 9110
+ 9111
+ 9112
+ 9113
+ 9114
+ 9115
+ 9116
+ 9117
+ 9118
+ 9119
+ 9120
+ 9121
+ 9122
+ 9123
+ 9124
+ 9125
+ 9126
+ 9127
+ 9128
+ 9129
+ 9130
+ 9131
+ 9132
+ 9133
+ 9134
+ 9135
+ 9136
+ 9137
+ 9138
+ 9139
+ 9140
+ 9141
+ 9142
+ 9143
+ 9144
+ 9145
+ 9146
+ 9147
+ 9148
+ 9149
+ 9150
+ 9151
+ 9152
+ 9153
+ 9154
+ 9155
+ 9156
+ 9157
+ 9158
+ 9159
+ 9160
+ 9161
+ 9162
+ 9163
+ 9164
+ 9165
+ 9166
+ 9167
+ 9168
+ 9169
+ 9170
+ 9171
+ 9172
+ 9173
+ 9174
+ 9175
+ 9176
+ 9177
+ 9178
+ 9179
+ 9180
+ 9181
+ 9182
+ 9183
+ 9184
+ 9185
+ 9186
+ 9187
+ 9188
+ 9189
+ 9190
+ 9191
+ 9192
+ 9193
+ 9194
+ 9195
+ 9196
+ 9197
+ 9198
+ 9199
+ 9200
+ 9201
+ 9202
+ 9203
+ 9204
+ 9205
+ 9206
+ 9207
+ 9208
+ 9209
+ 9210
+ 9211
+ 9212
+ 9213
+ 9214
+ 9215
+ 9216
+ 9217
+ 9218
+ 9219
+ 9220
+ 9221
+ 9222
+ 9223
+ 9224
+ 9225
+ 9226
+ 9227
+ 9228
+ 9229
+ 9230
+ 9231
+ 9232
+ 9233
+ 9234
+ 9235
+ 9236
+ 9237
+ 9238
+ 9239
+ 9240
+ 9241
+ 9242
+ 9243
+ 9244
+ 9245
+ 9246
+ 9247
+ 9248
+ 9249
+ 9250
+ 9251
+ 9252
+ 9253
+ 9254
+ 9255
+ 9256
+ 9257
+ 9258
+ 9259
+ 9260
+ 9261
+ 9262
+ 9263
+ 9264
+ 9265
+ 9266
+ 9267
+ 9268
+ 9269
+ 9270
+ 9271
+ 9272
+ 9273
+ 9274
+ 9275
+ 9276
+ 9277
+ 9278
+ 9279
+ 9280
+ 9281
+ 9282
+ 9283
+ 9284
+ 9285
+ 9286
+ 9287
+ 9288
+ 9289
+ 9290
+ 9291
+ 9292
+ 9293
+ 9294
+ 9295
+ 9296
+ 9297
+ 9298
+ 9299
+ 9300
+ 9301
+ 9302
+ 9303
+ 9304
+ 9305
+ 9306
+ 9307
+ 9308
+ 9309
+ 9310
+ 9311
+ 9312
+ 9313
+ 9314
+ 9315
+ 9316
+ 9317
+ 9318
+ 9319
+ 9320
+ 9321
+ 9322
+ 9323
+ 9324
+ 9325
+ 9326
+ 9327
+ 9328
+ 9329
+ 9330
+ 9331
+ 9332
+ 9333
+ 9334
+ 9335
+ 9336
+ 9337
+ 9338
+ 9339
+ 9340
+ 9341
+ 9342
+ 9343
+ 9344
+ 9345
+ 9346
+ 9347
+ 9348
+ 9349
+ 9350
+ 9351
+ 9352
+ 9353
+ 9354
+ 9355
+ 9356
+ 9357
+ 9358
+ 9359
+ 9360
+ 9361
+ 9362
+ 9363
+ 9364
+ 9365
+ 9366
+ 9367
+ 9368
+ 9369
+ 9370
+ 9371
+ 9372
+ 9373
+ 9374
+ 9375
+ 9376
+ 9377
+ 9378
+ 9379
+ 9380
+ 9381
+ 9382
+ 9383
+ 9384
+ 9385
+ 9386
+ 9387
+ 9388
+ 9389
+ 9390
+ 9391
+ 9392
+ 9393
+ 9394
+ 9395
+ 9396
+ 9397
+ 9398
+ 9399
+ 9400
+ 9401
+ 9402
+ 9403
+ 9404
+ 9405
+ 9406
+ 9407
+ 9408
+ 9409
+ 9410
+ 9411
+ 9412
+ 9413
+ 9414
+ 9415
+ 9416
+ 9417
+ 9418
+ 9419
+ 9420
+ 9421
+ 9422
+ 9423
+ 9424
+ 9425
+ 9426
+ 9427
+ 9428
+ 9429
+ 9430
+ 9431
+ 9432
+ 9433
+ 9434
+ 9435
+ 9436
+ 9437
+ 9438
+ 9439
+ 9440
+ 9441
+ 9442
+ 9443
+ 9444
+ 9445
+ 9446
+ 9447
+ 9448
+ 9449
+ 9450
+ 9451
+ 9452
+ 9453
+ 9454
+ 9455
+ 9456
+ 9457
+ 9458
+ 9459
+ 9460
+ 9461
+ 9462
+ 9463
+ 9464
+ 9465
+ 9466
+ 9467
+ 9468
+ 9469
+ 9470
+ 9471
+ 9472
+ 9473
+ 9474
+ 9475
+ 9476
+ 9477
+ 9478
+ 9479
+ 9480
+ 9481
+ 9482
+ 9483
+ 9484
+ 9485
+ 9486
+ 9487
+ 9488
+ 9489
+ 9490
+ 9491
+ 9492
+ 9493
+ 9494
+ 9495
+ 9496
+ 9497
+ 9498
+ 9499
+ 9500
+ 9501
+ 9502
+ 9503
+ 9504
+ 9505
+ 9506
+ 9507
+ 9508
+ 9509
+ 9510
+ 9511
+ 9512
+ 9513
+ 9514
+ 9515
+ 9516
+ 9517
+ 9518
+ 9519
+ 9520
+ 9521
+ 9522
+ 9523
+ 9524
+ 9525
+ 9526
+ 9527
+ 9528
+ 9529
+ 9530
+ 9531
+ 9532
+ 9533
+ 9534
+ 9535
+ 9536
+ 9537
+ 9538
+ 9539
+ 9540
+ 9541
+ 9542
+ 9543
+ 9544
+ 9545
+ 9546
+ 9547
+ 9548
+ 9549
+ 9550
+ 9551
+ 9552
+ 9553
+ 9554
+ 9555
+ 9556
+ 9557
+ 9558
+ 9559
+ 9560
+ 9561
+ 9562
+ 9563
+ 9564
+ 9565
+ 9566
+ 9567
+ 9568
+ 9569
+ 9570
+ 9571
+ 9572
+ 9573
+ 9574
+ 9575
+ 9576
+ 9577
+ 9578
+ 9579
+ 9580
+ 9581
+ 9582
+ 9583
+ 9584
+ 9585
+ 9586
+ 9587
+ 9588
+ 9589
+ 9590
+ 9591
+ 9592
+ 9593
+ 9594
+ 9595
+ 9596
+ 9597
+ 9598
+ 9599
+ 9600
+ 9601
+ 9602
+ 9603
+ 9604
+ 9605
+ 9606
+ 9607
+ 9608
+ 9609
+ 9610
+ 9611
+ 9612
+ 9613
+ 9614
+ 9615
+ 9616
+ 9617
+ 9618
+ 9619
+ 9620
+ 9621
+ 9622
+ 9623
+ 9624
+ 9625
+ 9626
+ 9627
+ 9628
+ 9629
+ 9630
+ 9631
+ 9632
+ 9633
+ 9634
+ 9635
+ 9636
+ 9637
+ 9638
+ 9639
+ 9640
+ 9641
+ 9642
+ 9643
+ 9644
+ 9645
+ 9646
+ 9647
+ 9648
+ 9649
+ 9650
+ 9651
+ 9652
+ 9653
+ 9654
+ 9655
+ 9656
+ 9657
+ 9658
+ 9659
+ 9660
+ 9661
+ 9662
+ 9663
+ 9664
+ 9665
+ 9666
+ 9667
+ 9668
+ 9669
+ 9670
+ 9671
+ 9672
+ 9673
+ 9674
+ 9675
+ 9676
+ 9677
+ 9678
+ 9679
+ 9680
+ 9681
+ 9682
+ 9683
+ 9684
+ 9685
+ 9686
+ 9687
+ 9688
+ 9689
+ 9690
+ 9691
+ 9692
+ 9693
+ 9694
+ 9695
+ 9696
+ 9697
+ 9698
+ 9699
+ 9700
+ 9701
+ 9702
+ 9703
+ 9704
+ 9705
+ 9706
+ 9707
+ 9708
+ 9709
+ 9710
+ 9711
+ 9712
+ 9713
+ 9714
+ 9715
+ 9716
+ 9717
+ 9718
+ 9719
+ 9720
+ 9721
+ 9722
+ 9723
+ 9724
+ 9725
+ 9726
+ 9727
+ 9728
+ 9729
+ 9730
+ 9731
+ 9732
+ 9733
+ 9734
+ 9735
+ 9736
+ 9737
+ 9738
+ 9739
+ 9740
+ 9741
+ 9742
+ 9743
+ 9744
+ 9745
+ 9746
+ 9747
+ 9748
+ 9749
+ 9750
+ 9751
+ 9752
+ 9753
+ 9754
+ 9755
+ 9756
+ 9757
+ 9758
+ 9759
+ 9760
+ 9761
+ 9762
+ 9763
+ 9764
+ 9765
+ 9766
+ 9767
+ 9768
+ 9769
+ 9770
+ 9771
+ 9772
+ 9773
+ 9774
+ 9775
+ 9776
+ 9777
+ 9778
+ 9779
+ 9780
+ 9781
+ 9782
+ 9783
+ 9784
+ 9785
+ 9786
+ 9787
+ 9788
+ 9789
+ 9790
+ 9791
+ 9792
+ 9793
+ 9794
+ 9795
+ 9796
+ 9797
+ 9798
+ 9799
+ 9800
+ 9801
+ 9802
+ 9803
+ 9804
+ 9805
+ 9806
+ 9807
+ 9808
+ 9809
+ 9810
+ 9811
+ 9812
+ 9813
+ 9814
+ 9815
+ 9816
+ 9817
+ 9818
+ 9819
+ 9820
+ 9821
+ 9822
+ 9823
+ 9824
+ 9825
+ 9826
+ 9827
+ 9828
+ 9829
+ 9830
+ 9831
+ 9832
+ 9833
+ 9834
+ 9835
+ 9836
+ 9837
+ 9838
+ 9839
+ 9840
+ 9841
+ 9842
+ 9843
+ 9844
+ 9845
+ 9846
+ 9847
+ 9848
+ 9849
+ 9850
+ 9851
+ 9852
+ 9853
+ 9854
+ 9855
+ 9856
+ 9857
+ 9858
+ 9859
+ 9860
+ 9861
+ 9862
+ 9863
+ 9864
+ 9865
+ 9866
+ 9867
+ 9868
+ 9869
+ 9870
+ 9871
+ 9872
+ 9873
+ 9874
+ 9875
+ 9876
+ 9877
+ 9878
+ 9879
+ 9880
+ 9881
+ 9882
+ 9883
+ 9884
+ 9885
+ 9886
+ 9887
+ 9888
+ 9889
+ 9890
+ 9891
+ 9892
+ 9893
+ 9894
+ 9895
+ 9896
+ 9897
+ 9898
+ 9899
+ 9900
+ 9901
+ 9902
+ 9903
+ 9904
+ 9905
+ 9906
+ 9907
+ 9908
+ 9909
+ 9910
+ 9911
+ 9912
+ 9913
+ 9914
+ 9915
+ 9916
+ 9917
+ 9918
+ 9919
+ 9920
+ 9921
+ 9922
+ 9923
+ 9924
+ 9925
+ 9926
+ 9927
+ 9928
+ 9929
+ 9930
+ 9931
+ 9932
+ 9933
+ 9934
+ 9935
+ 9936
+ 9937
+ 9938
+ 9939
+ 9940
+ 9941
+ 9942
+ 9943
+ 9944
+ 9945
+ 9946
+ 9947
+ 9948
+ 9949
+ 9950
+ 9951
+ 9952
+ 9953
+ 9954
+ 9955
+ 9956
+ 9957
+ 9958
+ 9959
+ 9960
+ 9961
+ 9962
+ 9963
+ 9964
+ 9965
+ 9966
+ 9967
+ 9968
+ 9969
+ 9970
+ 9971
+ 9972
+ 9973
+ 9974
+ 9975
+ 9976
+ 9977
+ 9978
+ 9979
+ 9980
+ 9981
+ 9982
+ 9983
+ 9984
+ 9985
+ 9986
+ 9987
+ 9988
+ 9989
+ 9990
+ 9991
+ 9992
+ 9993
+ 9994
+ 9995
+ 9996
+ 9997
+ 9998
+ 9999
+10000
+10001
+10002
+10003
+10004
+10005
+10006
+10007
+10008
+10009
+10010
+10011
+10012
+10013
+10014
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
+10032
+10033
+10034
+10035
+10036
+10037
+10038
+10039
+10040
+10041
+10042
+10043
+10044
+10045
+10046
+10047
+10048
+10049
+10050
+10051
+10052
+10053
+10054
+10055
+10056
+10057
+10058
+10059
+10060
+10061
+10062
+10063
+10064
+10065
+10066
+10067
+10068
+10069
+10070
+10071
+10072
+10073
+10074
+10075
+10076
+10077
+10078
+10079
+10080
+10081
+10082
+10083
+10084
+10085
+10086
+10087
+10088
+10089
+10090
+10091
+10092
+10093
+10094
+10095
+10096
+10097
+10098
+10099
+10100
+10101
+10102
+10103
+10104
+10105
+10106
+10107
+10108
+10109
+10110
+10111
+10112
+10113
+10114
+10115
+10116
+10117
+10118
+10119
+10120
+10121
+10122
+10123
+10124
+10125
+10126
+10127
+10128
+10129
+10130
+10131
+10132
+10133
+10134
+10135
+10136
+10137
+10138
+10139
+10140
+10141
+10142
+10143
+10144
+10145
+10146
+10147
+10148
+10149
+10150
+10151
+10152
+10153
+10154
+10155
+10156
+10157
+10158
+10159
+10160
+10161
+10162
+10163
+10164
+10165
+10166
+10167
+10168
+10169
+10170
+10171
+10172
+10173
+10174
+10175
+10176
+10177
+10178
+10179
+10180
+10181
+10182
+10183
+10184
+10185
+10186
+10187
+10188
+10189
+10190
+10191
+10192
+10193
+10194
+10195
+10196
+10197
+10198
+10199
+10200
+10201
+10202
+10203
+10204
+10205
+10206
+10207
+10208
+10209
+10210
+10211
+10212
+10213
+10214
+10215
+10216
+10217
+10218
+10219
+10220
+10221
+10222
+10223
+10224
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+10255
+10256
+10257
+10258
+10259
+10260
+10261
+10262
+10263
+10264
+10265
+10266
+10267
+10268
+10269
+10270
+10271
+10272
+10273
+10274
+10275
+10276
+10277
+10278
+10279
+10280
+10281
+10282
+10283
+10284
+10285
+10286
+10287
+10288
+10289
+10290
+10291
+10292
+10293
+10294
+10295
+10296
+10297
+10298
+10299
+10300
+10301
+10302
+10303
+10304
+10305
+10306
+10307
+10308
+10309
+10310
+10311
+10312
+10313
+10314
+10315
+10316
+10317
+10318
+10319
+10320
+10321
+10322
+10323
+10324
+10325
+10326
+10327
+10328
+10329
+10330
+10331
+10332
+10333
+10334
+10335
+10336
+10337
+10338
+10339
+10340
+10341
+10342
+10343
+10344
+10345
+10346
+10347
+10348
+10349
+10350
+10351
+10352
+10353
+10354
+10355
+10356
+10357
+10358
+10359
+10360
+10361
+10362
+10363
+10364
+10365
+10366
+10367
+10368
+10369
+10370
+10371
+10372
+10373
+10374
+10375
+10376
+10377
+10378
+10379
+10380
+10381
+10382
+10383
+10384
+10385
+10386
+10387
+10388
+10389
+10390
+10391
+10392
+10393
+10394
+10395
+10396
+10397
+10398
+10399
+10400
+10401
+10402
+10403
+10404
+10405
+10406
+10407
+10408
+10409
+10410
+10411
+10412
+10413
+10414
+10415
+10416
+10417
+10418
+10419
+10420
+10421
+10422
+10423
+10424
+10425
+10426
+10427
+10428
+10429
+10430
+10431
+10432
+10433
+10434
+10435
+10436
+10437
+10438
+10439
+10440
+10441
+10442
+10443
+10444
+10445
+10446
+10447
+10448
+10449
+10450
+10451
+10452
+10453
+10454
+10455
+10456
+10457
+10458
+10459
+10460
+10461
+10462
+10463
+10464
+10465
+10466
+10467
+10468
+10469
+10470
+10471
+10472
+10473
+10474
+10475
+10476
+10477
+10478
+10479
+10480
+10481
+10482
+10483
+10484
+10485
+10486
+10487
+10488
+10489
+10490
+10491
+10492
+10493
+10494
+10495
+10496
+10497
+10498
+10499
+10500
+10501
+10502
+10503
+10504
+10505
+10506
+10507
+10508
+10509
+10510
+10511
+10512
+10513
+10514
+10515
+10516
+10517
+10518
+10519
+10520
+10521
+10522
+10523
+10524
+10525
+10526
+10527
+10528
+10529
+10530
+10531
+10532
+10533
+10534
+10535
+10536
+10537
+10538
+10539
+10540
+10541
+10542
+10543
+10544
+10545
+10546
+10547
+10548
+10549
+10550
+10551
+10552
+10553
+10554
+10555
+10556
+10557
+10558
+10559
+10560
+10561
+10562
+10563
+10564
+10565
+10566
+10567
+10568
+10569
+10570
+10571
+10572
+10573
+10574
+10575
+10576
+10577
+10578
+10579
+10580
+10581
+10582
+10583
+10584
+10585
+10586
+10587
+10588
+10589
+10590
+10591
+10592
+10593
+10594
+10595
+10596
+10597
+10598
+10599
+10600
+10601
+10602
+10603
+10604
+10605
+10606
+10607
+10608
+10609
+10610
+10611
+10612
+10613
+10614
+10615
+10616
+10617
+10618
+10619
+10620
+10621
+10622
+10623
+10624
+10625
+10626
+10627
+10628
+10629
+10630
+10631
+10632
+10633
+10634
+10635
+10636
+10637
+10638
+10639
+10640
+10641
+10642
+10643
+10644
+10645
+10646
+10647
+10648
+10649
+10650
+10651
+10652
+10653
+10654
+10655
+10656
+10657
+10658
+10659
+10660
+10661
+10662
+10663
+10664
+10665
+10666
+10667
+10668
+10669
+10670
+10671
+10672
+10673
+10674
+10675
+10676
+10677
+10678
+10679
+10680
+10681
+10682
+10683
+10684
+10685
+10686
+10687
+10688
+10689
+10690
+10691
+10692
+10693
+10694
+10695
+10696
+10697
+10698
+10699
+10700
+10701
+10702
+10703
+10704
+10705
+10706
+10707
+10708
+10709
+10710
+10711
+10712
+10713
+10714
+10715
+10716
+10717
+10718
+10719
+10720
+10721
+10722
+10723
+10724
+10725
+10726
+10727
+10728
+10729
+10730
+10731
+10732
+10733
+10734
+10735
+10736
+10737
+10738
+10739
+10740
+10741
+10742
+10743
+10744
+10745
+10746
+10747
+10748
+10749
+10750
+10751
+10752
+10753
+10754
+10755
+10756
+10757
+10758
+10759
+10760
+10761
+10762
+10763
+10764
+10765
+10766
+10767
+10768
+10769
+10770
+10771
+10772
+10773
+10774
+10775
+10776
+10777
+10778
+10779
+10780
+10781
+10782
+10783
+10784
+10785
+10786
+10787
+10788
+10789
+10790
+10791
+10792
+10793
+10794
+10795
+10796
+10797
+10798
+10799
+10800
+10801
+10802
+10803
+10804
+10805
+10806
+10807
+10808
+10809
+10810
+10811
+10812
+10813
+10814
+10815
+10816
+10817
+10818
+10819
+10820
+10821
+10822
+10823
+10824
+10825
+10826
+10827
+10828
+10829
+10830
+10831
+10832
+10833
+10834
+10835
+10836
+10837
+10838
+10839
+10840
+10841
+10842
+10843
+10844
+10845
+10846
+10847
+10848
+10849
+10850
+10851
+10852
+10853
+10854
+10855
+10856
+10857
+10858
+10859
+10860
+10861
+10862
+10863
+10864
+10865
+10866
+10867
+10868
+10869
+10870
+10871
+10872
+10873
+10874
+10875
+10876
+10877
+10878
+10879
+10880
+10881
+10882
+10883
+10884
+10885
+10886
+10887
+10888
+10889
+10890
+10891
+10892
+10893
+10894
+10895
+10896
+10897
+10898
+10899
+10900
+10901
+10902
+10903
+10904
+10905
+10906
+10907
+10908
+10909
+10910
+10911
+10912
+10913
+10914
+10915
+10916
+10917
+10918
+10919
+10920
+10921
+10922
+10923
+10924
+10925
+10926
+10927
+10928
+10929
+10930
+10931
+10932
+10933
+10934
+10935
+10936
+10937
+10938
+10939
+10940
+10941
+10942
+10943
+10944
+10945
+10946
+10947
+10948
+10949
+10950
+10951
+10952
+10953
+10954
+10955
+10956
+10957
+10958
+10959
+10960
+10961
+10962
+10963
+10964
+10965
+10966
+10967
+10968
+10969
+10970
+10971
+10972
+10973
+10974
+10975
+10976
+10977
+10978
+10979
+10980
+10981
+10982
+10983
+10984
+10985
+10986
+10987
+10988
+10989
+10990
+10991
+10992
+10993
+10994
+10995
+10996
+10997
+10998
+10999
+11000
+11001
+11002
+11003
+11004
+11005
+11006
+11007
+11008
+11009
+11010
+11011
+11012
+11013
+11014
+11015
+11016
+11017
+11018
+11019
+11020
+11021
+11022
+11023
+11024
+11025
+11026
+11027
+11028
+11029
+11030
+11031
+11032
+11033
+11034
+11035
+11036
+11037
+11038
+11039
+11040
+11041
+11042
+11043
+11044
+11045
+11046
+11047
+11048
+11049
+11050
+11051
+11052
+11053
+11054
+11055
+11056
+11057
+11058
+11059
+11060
+11061
+11062
+11063
+11064
+11065
+11066
+11067
+11068
+11069
+11070
+11071
+11072
+11073
+11074
+11075
+11076
+11077
+11078
+11079
+11080
+11081
+11082
+11083
+11084
+11085
+11086
+11087
+11088
+11089
+11090
+11091
+11092
+11093
+11094
+11095
+11096
+11097
+11098
+11099
+11100
+11101
+11102
+11103
+11104
+11105
+11106
+11107
+11108
+11109
+11110
+11111
+11112
+11113
+11114
+11115
+11116
+11117
+11118
+11119
+11120
+11121
+11122
+11123
+11124
+11125
+11126
+11127
+11128
+11129
+11130
+11131
+11132
+11133
+11134
+11135
+11136
+11137
+11138
+11139
+11140
+11141
+11142
+11143
+11144
+11145
+11146
+11147
+11148
+11149
+11150
+11151
+11152
+11153
+11154
+11155
+11156
+11157
+11158
+11159
+11160
+11161
+11162
+11163
+11164
+11165
+11166
+11167
+11168
+11169
+11170
+11171
+11172
+11173
+11174
+11175
+11176
+11177
+11178
+11179
+11180
+11181
+11182
+11183
+11184
+11185
+11186
+11187
+11188
+11189
+11190
+11191
+11192
+11193
+11194
+11195
+11196
+11197
+11198
+11199
+11200
+11201
+11202
+11203
+11204
+11205
+11206
+11207
+11208
+11209
+11210
+11211
+11212
+11213
+11214
+11215
+11216
+11217
+11218
+11219
+11220
+11221
+11222
+11223
+11224
+11225
+11226
+11227
+11228
+11229
+11230
+11231
+11232
+11233
+11234
+11235
+11236
+11237
+11238
+11239
+11240
+11241
+11242
+11243
+11244
+11245
+11246
+11247
+11248
+11249
+11250
+11251
+11252
+11253
+11254
+11255
+11256
+11257
+11258
+11259
+11260
+11261
+11262
+11263
+11264
+11265
+11266
+11267
+11268
+11269
+11270
+11271
+11272
+11273
+11274
+11275
+11276
+11277
+11278
+11279
+11280
+11281
+11282
+11283
+11284
+11285
+11286
+11287
+11288
+11289
+11290
+11291
+11292
+11293
+11294
+11295
+11296
+11297
+11298
+11299
+11300
+11301
+11302
+11303
+11304
+11305
+11306
+11307
+11308
+11309
+11310
+11311
+11312
+11313
+11314
+11315
+11316
+11317
+11318
+11319
+11320
+11321
+11322
+11323
+11324
+11325
+11326
+11327
+11328
+11329
+11330
+11331
+11332
+11333
+11334
+11335
+11336
+11337
+11338
+11339
+11340
+11341
+11342
+11343
+11344
+11345
+11346
+11347
+11348
+11349
+11350
+11351
+11352
+11353
+11354
+11355
+11356
+11357
+11358
+11359
+11360
+11361
+11362
+11363
+11364
+11365
+11366
+11367
+11368
+11369
+11370
+11371
+11372
+11373
+11374
+11375
+11376
+11377
+11378
+11379
+11380
+11381
+11382
+11383
+11384
+11385
+11386
+11387
+11388
+11389
+11390
+11391
+11392
+11393
+11394
+11395
+11396
+11397
+11398
+11399
+11400
+11401
+11402
+11403
+11404
+11405
+11406
+11407
+11408
+11409
+11410
+11411
+11412
+11413
+11414
+11415
+11416
+11417
+11418
+11419
+11420
+11421
+11422
+11423
+11424
+11425
+11426
+11427
+11428
+11429
+11430
+11431
+11432
+11433
+11434
+11435
+11436
+11437
+11438
+11439
+11440
+11441
+11442
+11443
+11444
+11445
+11446
+11447
+11448
+11449
+11450
+11451
+11452
+11453
+11454
+11455
+11456
+11457
+11458
+11459
+11460
+11461
+11462
+11463
+11464
+11465
+11466
+11467
+11468
+11469
+11470
+11471
+11472
+11473
+11474
+11475
+11476
+11477
+11478
+11479
+11480
+11481
+11482
+11483
+11484
+11485
+11486
+11487
+11488
+11489
+11490
+11491
+11492
+11493
+11494
+11495
+11496
+11497
+11498
+11499
+11500
+11501
+11502
+11503
+11504
+11505
+11506
+11507
+11508
+11509
+11510
+11511
+11512
+11513
+11514
+11515
+11516
+11517
+11518
+11519
+11520
+11521
+11522
+11523
+11524
+11525
+11526
+11527
+11528
+11529
+11530
+11531
+11532
+11533
+11534
+11535
+11536
+11537
+11538
+11539
+11540
+11541
+11542
+11543
+11544
+11545
+11546
+11547
+11548
+11549
+11550
+11551
+11552
+11553
+11554
+11555
+11556
+11557
+11558
+11559
+11560
+11561
+11562
+11563
+11564
+11565
+11566
+11567
+11568
+11569
+11570
+11571
+11572
+11573
+11574
+11575
+11576
+11577
+11578
+11579
+11580
+11581
+11582
+11583
+11584
+11585
+11586
+11587
+11588
+11589
+11590
+11591
+11592
+11593
+11594
+11595
+11596
+11597
+11598
+11599
+11600
+11601
+11602
+11603
+11604
+11605
+11606
+11607
+11608
+11609
+11610
+11611
+11612
+11613
+11614
+11615
+11616
+11617
+11618
+11619
+11620
+11621
+11622
+11623
+11624
+11625
+11626
+11627
+11628
+11629
+11630
+11631
+11632
+11633
+11634
+11635
+11636
+11637
+11638
+11639
+11640
+11641
+11642
+11643
+11644
+11645
+11646
+11647
+11648
+11649
+11650
+11651
+11652
+11653
+11654
+11655
+11656
+11657
+11658
+11659
+11660
+11661
+11662
+11663
+11664
+11665
+11666
+11667
+11668
+11669
+11670
+11671
+11672
+11673
+11674
+11675
+11676
+11677
+11678
+11679
+11680
+11681
+11682
+11683
+11684
+11685
+11686
+11687
+11688
+11689
+11690
+11691
+11692
+11693
+11694
+11695
+11696
+11697
+11698
+11699
+11700
+11701
+11702
+11703
+11704
+11705
+11706
+11707
+11708
+11709
+11710
+11711
+11712
+11713
+11714
+11715
+11716
+11717
+11718
+11719
+11720
+11721
+11722
+11723
+11724
+11725
+11726
+11727
+11728
+11729
+11730
+11731
+11732
+11733
+11734
+11735
+11736
+11737
+11738
+11739
+11740
+11741
+11742
+11743
+11744
+11745
+11746
+11747
+11748
+11749
+11750
+11751
+11752
+11753
+11754
+11755
+11756
+11757
+11758
+11759
+11760
+11761
+11762
+11763
+11764
+11765
+11766
+11767
+11768
+11769
+11770
+11771
+11772
+11773
+11774
+11775
+11776
+11777
+11778
+11779
+11780
+11781
+11782
+11783
+11784
+11785
+11786
+11787
+11788
+11789
+11790
+11791
+11792
+11793
+11794
+11795
+11796
+11797
+11798
+11799
+11800
+11801
+11802
+11803
+11804
+11805
+11806
+11807
+11808
+11809
+11810
+11811
+11812
+11813
+11814
+11815
+11816
+11817
+11818
+11819
+11820
+11821
+11822
+11823
+11824
+11825
+11826
+11827
+11828
+11829
+11830
+11831
+11832
+11833
+11834
+11835
+11836
+11837
+11838
+11839
+11840
+11841
+11842
+11843
+11844
+11845
+11846
+11847
+11848
+11849
+11850
+11851
+11852
+11853
+11854
+11855
+11856
+11857
+11858
+11859
+11860
+11861
+11862
+11863
+11864
+11865
+11866
+11867
+11868
+11869
+11870
+11871
+11872
+11873
+11874
+11875
+11876
+11877
+11878
+11879
+11880
+11881
+11882
+11883
+11884
+11885
+11886
+11887
+11888
+11889
+11890
+11891
+11892
+11893
+11894
+11895
+11896
+11897
+11898
+11899
+11900
+11901
+11902
+11903
+11904
+11905
+11906
+11907
+11908
+11909
+11910
+11911
+11912
+11913
+11914
+11915
+11916
+11917
+11918
+11919
+11920
+11921
+11922
+11923
+11924
+11925
+11926
+11927
+11928
+11929
+11930
+11931
+11932
+11933
+11934
+11935
+11936
+11937
+11938
+11939
+11940
+11941
+11942
+11943
+11944
+11945
+11946
+11947
+11948
+11949
+11950
+11951
+11952
+11953
+11954
+11955
+11956
+11957
+11958
+11959
+11960
+11961
+11962
+11963
+11964
+11965
+11966
+11967
+11968
+11969
+11970
+11971
+11972
+11973
+11974
+11975
+11976
+11977
+11978
+11979
+11980
+11981
+11982
+11983
+11984
+11985
+11986
+11987
+11988
+11989
+11990
+11991
+11992
+11993
+11994
+11995
+11996
+11997
+11998
+11999
+12000
+12001
+12002
+12003
+12004
+12005
+12006
+12007
+12008
+12009
+12010
+12011
+12012
+12013
+12014
+12015
+12016
+12017
+12018
+12019
+12020
+12021
+12022
+12023
+12024
+12025
+12026
+12027
+12028
+12029
+12030
+12031
+12032
+12033
+12034
+12035
+12036
+12037
+12038
+12039
+12040
+12041
+12042
+12043
+12044
+12045
+12046
+12047
+12048
+12049
+12050
+12051
+12052
+12053
+12054
+12055
+12056
+12057
+12058
+12059
+12060
+12061
+12062
+12063
+12064
+12065
+12066
+12067
+12068
+12069
+12070
+12071
+12072
+12073
+12074
+12075
+12076
+12077
+12078
+12079
+12080
+12081
+12082
+12083
+12084
+12085
+12086
+12087
+12088
+12089
+12090
+12091
+12092
+12093
+12094
+12095
+12096
+12097
+12098
+12099
+12100
+12101
+12102
+12103
+12104
+12105
+12106
+12107
+12108
+12109
+12110
+12111
+12112
+12113
+12114
+12115
+12116
+12117
+12118
+12119
+12120
+12121
+12122
+12123
+12124
+12125
+12126
+12127
+12128
+12129
+12130
+12131
+12132
+12133
+12134
+12135
+12136
+12137
+12138
+12139
+12140
+12141
+12142
+12143
+12144
+12145
+12146
+12147
+12148
+12149
+12150
+12151
+12152
+12153
+12154
+12155
+12156
+12157
+12158
+12159
+12160
+12161
+12162
+12163
+12164
+12165
+12166
+12167
+12168
+12169
+12170
+12171
+12172
+12173
+12174
+12175
+12176
+12177
+12178
+12179
+12180
+12181
+12182
+12183
+12184
+12185
+12186
+12187
+12188
+12189
+12190
+12191
+12192
+12193
+12194
+12195
+12196
+12197
+12198
+12199
+12200
+12201
+12202
+12203
+12204
+12205
+12206
+12207
+12208
+12209
+12210
+12211
+12212
+12213
+12214
+12215
+12216
+12217
+12218
+12219
+12220
+12221
+12222
+12223
+12224
+12225
+12226
+12227
+12228
+12229
+12230
+12231
+12232
+12233
+12234
+12235
+12236
+12237
+12238
+12239
+12240
+12241
+12242
+12243
+12244
+12245
+12246
+12247
+12248
+12249
+12250
+12251
+12252
+12253
+12254
+12255
+12256
+12257
+12258
+12259
+12260
+12261
+12262
+12263
+12264
+12265
+12266
+12267
+12268
+12269
+12270
+12271
+12272
+12273
+12274
+12275
+12276
+12277
+12278
+12279
+12280
+12281
+12282
+12283
+12284
+12285
+12286
+12287
+12288
+12289
+12290
+12291
+12292
+12293
+12294
+12295
+12296
+12297
+12298
+12299
+12300
+12301
+12302
+12303
+12304
+12305
+12306
+12307
+12308
+12309
+12310
+12311
+12312
+12313
+12314
+12315
+12316
+12317
+12318
+12319
+12320
+12321
+12322
+12323
+12324
+12325
+12326
+12327
+12328
+12329
+12330
+12331
+12332
+12333
+12334
+12335
+12336
+12337
+12338
+12339
+12340
+12341
+12342
+12343
+12344
+12345
+12346
+12347
+12348
+12349
+12350
+12351
+12352
+12353
+12354
+12355
+12356
+12357
+12358
+12359
+12360
+12361
+12362
+12363
+12364
+12365
+12366
+12367
+12368
+12369
+12370
+12371
+12372
+12373
+12374
+12375
+12376
+12377
+12378
+12379
+12380
+12381
+12382
+12383
+12384
+12385
+12386
+12387
+12388
+12389
+12390
+12391
+12392
+12393
+12394
+12395
+12396
+12397
+12398
+12399
+12400
+12401
+12402
+12403
+12404
+12405
+12406
+12407
+12408
+12409
+12410
+12411
+12412
+12413
+12414
+12415
+12416
+12417
+12418
+12419
+12420
+12421
+12422
+12423
+12424
+12425
+12426
+12427
+12428
+12429
+12430
+12431
+12432
+12433
+12434
+12435
+12436
+12437
+12438
+12439
+12440
+12441
+12442
+12443
+12444
+12445
+12446
+12447
+12448
+12449
+12450
+12451
+12452
+12453
+12454
+12455
+12456
+12457
+12458
+12459
+12460
+12461
+12462
+12463
+12464
+12465
+12466
+12467
+12468
+12469
+12470
+12471
+12472
+12473
+12474
+12475
+12476
+12477
+12478
+12479
+12480
+12481
+12482
+12483
+12484
+12485
+12486
+12487
+12488
+12489
+12490
+12491
+12492
+12493
+12494
+12495
+12496
+12497
+12498
+12499
+12500
+12501
+12502
+12503
+12504
+12505
+12506
+12507
+12508
+12509
+12510
+12511
+12512
+12513
+12514
+12515
+12516
+12517
+12518
+12519
+12520
+12521
+12522
+12523
+12524
+12525
+12526
+12527
+12528
+12529
+12530
+12531
+12532
+12533
+12534
+12535
+12536
+12537
+12538
+12539
+12540
+12541
+12542
+12543
+12544
+12545
+12546
+12547
+12548
+12549
+12550
+12551
+12552
+12553
+12554
+12555
+12556
+12557
+12558
+12559
+12560
+12561
+12562
+12563
+12564
+12565
+12566
+12567
+12568
+12569
+12570
+12571
+12572
+12573
+12574
+12575
+12576
+12577
+12578
+12579
+12580
+12581
+12582
+12583
+12584
+12585
+12586
+12587
+12588
+12589
+12590
+12591
+12592
+12593
+12594
+12595
+12596
+12597
+12598
+12599
+12600
+12601
+12602
+12603
+12604
+12605
+12606
+12607
+12608
+12609
+12610
+12611
+12612
+12613
+12614
+12615
+12616
+12617
+12618
+12619
+12620
+12621
+12622
+12623
+12624
+12625
+12626
+12627
+12628
+12629
+12630
+12631
+12632
+12633
+12634
+12635
+12636
+12637
+12638
+12639
+12640
+12641
+12642
+12643
+12644
+12645
+12646
+12647
+12648
+12649
+12650
+12651
+12652
+12653
+12654
+12655
+12656
+12657
+12658
+12659
+12660
+12661
+12662
+12663
+12664
+12665
+12666
+12667
+12668
+12669
+12670
+12671
+12672
+12673
+12674
+12675
+12676
+12677
+12678
+12679
+12680
+12681
+12682
+12683
+12684
+12685
+12686
+12687
+12688
+12689
+12690
+12691
+12692
+12693
+12694
+12695
+12696
+12697
+12698
+12699
+12700
+12701
+12702
+12703
+12704
+12705
+12706
+12707
+12708
+12709
+12710
+12711
+12712
+12713
+12714
+12715
+12716
+12717
+12718
+12719
+12720
+12721
+12722
+12723
+12724
+12725
+12726
+12727
+12728
+12729
+12730
+12731
+12732
+12733
+12734
+12735
+12736
+12737
+12738
+12739
+12740
+12741
+12742
+12743
+12744
+12745
+12746
+12747
+12748
+12749
+12750
+12751
+12752
+12753
+12754
+12755
+12756
+12757
+12758
+12759
+12760
+12761
+12762
+12763
+12764
+12765
+12766
+12767
+12768
+12769
+12770
+12771
+12772
+12773
+12774
+12775
+12776
+12777
+12778
+12779
+12780
+12781
+12782
+12783
+12784
+12785
+12786
+12787
+12788
+12789
+12790
+12791
+12792
+12793
+12794
+12795
+12796
+12797
+12798
+12799
+12800
+12801
+12802
+12803
+12804
+12805
+12806
+12807
+12808
+12809
+12810
+12811
+12812
+12813
+12814
+12815
+12816
+12817
+12818
+12819
+12820
+12821
+12822
+12823
+12824
+12825
+12826
+12827
+12828
+12829
+12830
+12831
+12832
+12833
+12834
+12835
+12836
+12837
+12838
+12839
+12840
+12841
+12842
+12843
+12844
+12845
+12846
+12847
+12848
+12849
+12850
+12851
+12852
+12853
+12854
+12855
+12856
+12857
+12858
+12859
+12860
+12861
+12862
+12863
+12864
+12865
+12866
+12867
+12868
+12869
+12870
+12871
+12872
+12873
+12874
+12875
+12876
+12877
+12878
+12879
+12880
+12881
+12882
+12883
+12884
+12885
+12886
+12887
+12888
+12889
+12890
+12891
+12892
+12893
+12894
+12895
+12896
+12897
+12898
+12899
+12900
+12901
+12902
+12903
+12904
+12905
+12906
+12907
+12908
+12909
+12910
+12911
+12912
+12913
+12914
+12915
+12916
+12917
+12918
+12919
+12920
+12921
+12922
+12923
+12924
+12925
+12926
+12927
+12928
+12929
+12930
+12931
+12932
+12933
+12934
+12935
+12936
+12937
+12938
+12939
+12940
+12941
+12942
+12943
+12944
+12945
+12946
+12947
+12948
+12949
+12950
+12951
+12952
+12953
+12954
+12955
+12956
+12957
+12958
+12959
+12960
+12961
+12962
+12963
+12964
+12965
+12966
+12967
+12968
+12969
+12970
+12971
+12972
+12973
+12974
+12975
+12976
+12977
+12978
+12979
+12980
+12981
+12982
+12983
+12984
+12985
+12986
+12987
+12988
+12989
+12990
+12991
+12992
+12993
+12994
+12995
+12996
+12997
+12998
+12999
+13000
+13001
+13002
+13003
+13004
+13005
+13006
+13007
+13008
+13009
+13010
+13011
+13012
+13013
+13014
+13015
+13016
+13017
+13018
+13019
+13020
+13021
+13022
+13023
+13024
+13025
+13026
+13027
+13028
+13029
+13030
+13031
+13032
+13033
+13034
+13035
+13036
+13037
+13038
+13039
+13040
+13041
+13042
+13043
+13044
+13045
+13046
+13047
+13048
+13049
+13050
+13051
+13052
+13053
+13054
+13055
+13056
+13057
+13058
+13059
+13060
+13061
+13062
+13063
+13064
+13065
+13066
+13067
+13068
+13069
+13070
+13071
+13072
+13073
+13074
+13075
+13076
+13077
+13078
+13079
+13080
+13081
+13082
+13083
+13084
+13085
+13086
+13087
+13088
+13089
+13090
+13091
+13092
+13093
+13094
+13095
+13096
+13097
+13098
+13099
+13100
+13101
+13102
+13103
+13104
+13105
+13106
+13107
+13108
+13109
+13110
+13111
+13112
+13113
+13114
+13115
+13116
+13117
+13118
+13119
+13120
+13121
+13122
+13123
+13124
+13125
+13126
+13127
+13128
+13129
+13130
+13131
+13132
+13133
+13134
+13135
+13136
+13137
+13138
+13139
+13140
+13141
+13142
+13143
+13144
+13145
+13146
+13147
+13148
+13149
+13150
+13151
+13152
+13153
+13154
+13155
+13156
+13157
+13158
+13159
+13160
+13161
+13162
+13163
+13164
+13165
+13166
+13167
+13168
+13169
+13170
+13171
+13172
+13173
+13174
+13175
+13176
+13177
+13178
+13179
+13180
+13181
+13182
+13183
+13184
+13185
+13186
+13187
+13188
+13189
+13190
+13191
+13192
+13193
+13194
+13195
+13196
+13197
+13198
+13199
+13200
+13201
+13202
+13203
+13204
+13205
+13206
+13207
+13208
+13209
+13210
+13211
+13212
+13213
+13214
+13215
+13216
+13217
+13218
+13219
+13220
+13221
+13222
+13223
+13224
+13225
+13226
+13227
+13228
+13229
+13230
+13231
+13232
+13233
+13234
+13235
+13236
+13237
+13238
+13239
+13240
+13241
+13242
+13243
+13244
+13245
+13246
+13247
+13248
+13249
+13250
+13251
+13252
+13253
+13254
+13255
+13256
+13257
+13258
+13259
+13260
+13261
+13262
+13263
+13264
+13265
+13266
+13267
+13268
+13269
+13270
+13271
+13272
+13273
+13274
+13275
+13276
+13277
+13278
+13279
+13280
+13281
+13282
+13283
+13284
+13285
+13286
+13287
+13288
+13289
+13290
+13291
+13292
+13293
+13294
+13295
+13296
+13297
+13298
+13299
+13300
+13301
+13302
+13303
+13304
+13305
+13306
+13307
+13308
+13309
+13310
+13311
+13312
+13313
+13314
+13315
+13316
+13317
+13318
+13319
+13320
+13321
+13322
+13323
+13324
+13325
+13326
+13327
+13328
+13329
+13330
+13331
+13332
+13333
+13334
+13335
+13336
+13337
+13338
+13339
+13340
+13341
+13342
+13343
+13344
+13345
+13346
+13347
+13348
+13349
+13350
+13351
+13352
+13353
+13354
+13355
+13356
+13357
+13358
+13359
+13360
+13361
+13362
+13363
+13364
+13365
+13366
+13367
+13368
+13369
+13370
+13371
+13372
+13373
+13374
+13375
+13376
+13377
+13378
+13379
+13380
+13381
+13382
+13383
+13384
+13385
+13386
+13387
+13388
+13389
+13390
+13391
+13392
+13393
+13394
+13395
+13396
+13397
+13398
+13399
+13400
+13401
+13402
+13403
+13404
+13405
+13406
+13407
+13408
+13409
+13410
+13411
+13412
+13413
+13414
+13415
+13416
+13417
+13418
+13419
+13420
+13421
+13422
+13423
+13424
+13425
+13426
+13427
+13428
+13429
+13430
+13431
+13432
+13433
+13434
+13435
+13436
+13437
+13438
+13439
+13440
+13441
+13442
+13443
+13444
+13445
+13446
+13447
+13448
+13449
+13450
+13451
+13452
+13453
+13454
+13455
+13456
+13457
+13458
+13459
+13460
+13461
+13462
+13463
+13464
+13465
+13466
+13467
+13468
+13469
+13470
+13471
+13472
+13473
+13474
+13475
+13476
+13477
+13478
+13479
+13480
+13481
+13482
+13483
+13484
+13485
+13486
+13487
+13488
+13489
+13490
+13491
+13492
+13493
+13494
+13495
+13496
+13497
+13498
+13499
+13500
+13501
+13502
+13503
+13504
+13505
+13506
+13507
+13508
+13509
+13510
+13511
+13512
+13513
+13514
+13515
+13516
+13517
+13518
+13519
+13520
+13521
+13522
+13523
+13524
+13525
+13526
+13527
+13528
+13529
+13530
+13531
+13532
+13533
+13534
+13535
+13536
+13537
+13538
+13539
+13540
+13541
+13542
+13543
+13544
+13545
+13546
+13547
+13548
+13549
+13550
+13551
+13552
+13553
+13554
+13555
+13556
+13557
+13558
+13559
+13560
+13561
+13562
+13563
+13564
+13565
+13566
+13567
+13568
+13569
+13570
+13571
+13572
+13573
+13574
+13575
+13576
+13577
+13578
+13579
+13580
+13581
+13582
+13583
+13584
+13585
+13586
+13587
+13588
+13589
+13590
+13591
+13592
+13593
+13594
+13595
+13596
+13597
+13598
+13599
+13600
+13601
+13602
+13603
+13604
+13605
+13606
+13607
+13608
+13609
+13610
+13611
+13612
+13613
+13614
+13615
+13616
+13617
+13618
+13619
+13620
+13621
+13622
+13623
+13624
+13625
+13626
+13627
+13628
+13629
+13630
+13631
+13632
+13633
+13634
+13635
+13636
+13637
+13638
+13639
+13640
+13641
+13642
+13643
+13644
+13645
+13646
+13647
+13648
+13649
+13650
+13651
+13652
+13653
+13654
+13655
+13656
+13657
+13658
+13659
+13660
+13661
+13662
+13663
+13664
+13665
+13666
+13667
+13668
+13669
+13670
+13671
+13672
+13673
+13674
+13675
+13676
+13677
+13678
+13679
+13680
+13681
+13682
+13683
+13684
+13685
+13686
+13687
+13688
+13689
+13690
+13691
+13692
+13693
+13694
+13695
+13696
+13697
+13698
+13699
+13700
+13701
+13702
+13703
+13704
+13705
+13706
+13707
+13708
+13709
+13710
+13711
+13712
+13713
+13714
+13715
+13716
+13717
+13718
+13719
+13720
+13721
+13722
+13723
+13724
+13725
+13726
+13727
+13728
+13729
+13730
+13731
+13732
+13733
+13734
+13735
+13736
+13737
+13738
+13739
+13740
+13741
+13742
+13743
+13744
+13745
+13746
+13747
+13748
+13749
+13750
+13751
+13752
+13753
+13754
+13755
+13756
+13757
+13758
+13759
+13760
+13761
+13762
+13763
+13764
+13765
+13766
+13767
+13768
+13769
+13770
+13771
+13772
+13773
+13774
+13775
+13776
+13777
+13778
+13779
+13780
+13781
+13782
+13783
+13784
+13785
+13786
+13787
+13788
+13789
+13790
+13791
+13792
+13793
+13794
+13795
+13796
+13797
+13798
+13799
+13800
+13801
+13802
+13803
+13804
+13805
+13806
+13807
+13808
+13809
+13810
+13811
+13812
+13813
+13814
+13815
+13816
+13817
+13818
+13819
+13820
+13821
+13822
+13823
+13824
+13825
+13826
+13827
+13828
+13829
+13830
+13831
+13832
+13833
+13834
+13835
+13836
+13837
+13838
+13839
+13840
+13841
+13842
+13843
+13844
+13845
+13846
+13847
+13848
+13849
+13850
+13851
+13852
+13853
+13854
+13855
+13856
+13857
+13858
+13859
+13860
+13861
+13862
+13863
+13864
+13865
+13866
+13867
+13868
+13869
+13870
+13871
+13872
+13873
+13874
+13875
+13876
+13877
+13878
+13879
+13880
+13881
+13882
+13883
+13884
+13885
+13886
+13887
+13888
+13889
+13890
+13891
+13892
+13893
+13894
+13895
+13896
+13897
+13898
+13899
+13900
+13901
+13902
+13903
+13904
+13905
+13906
+13907
+13908
+13909
+13910
+13911
+13912
+13913
+13914
+13915
+13916
+13917
+13918
+13919
+13920
+13921
+13922
+13923
+13924
+13925
+13926
+13927
+13928
+13929
+13930
+13931
+13932
+13933
+13934
+13935
+13936
+13937
+13938
+13939
+13940
+13941
+13942
+13943
+13944
+13945
+13946
+13947
+13948
+13949
+13950
+13951
+13952
+13953
+13954
+13955
+13956
+13957
+13958
+13959
+13960
+13961
+13962
+13963
+13964
+13965
+13966
+13967
+13968
+13969
+13970
+13971
+13972
+13973
+13974
+13975
+13976
+13977
+13978
+13979
+13980
+13981
+13982
+13983
+13984
+13985
+13986
+13987
+13988
+13989
+13990
+13991
+13992
+13993
+13994
+13995
+13996
+13997
+13998
+13999
+14000
+14001
+14002
+14003
+14004
+14005
+14006
+14007
+14008
+14009
+14010
+14011
+14012
+14013
+14014
+14015
+14016
+14017
+14018
+14019
+14020
+14021
+14022
+14023
+14024
+14025
+14026
+14027
+14028
+14029
+14030
+14031
+14032
+14033
+14034
+14035
+14036
+14037
+14038
+14039
+14040
+14041
+14042
+14043
+14044
+14045
+14046
+14047
+14048
+14049
+14050
+14051
+14052
+14053
+14054
+14055
+14056
+14057
+14058
+14059
+14060
+14061
+14062
+14063
+14064
+14065
+14066
+14067
+14068
+14069
+14070
+14071
+14072
+14073
+14074
+14075
+14076
+14077
+14078
+14079
+14080
+14081
+14082
+14083
+14084
+14085
+14086
+14087
+14088
+14089
+14090
+14091
+14092
+14093
+14094
+14095
+14096
+14097
+14098
+14099
+14100
+14101
+14102
+14103
+14104
+14105
+14106
+14107
+14108
+14109
+14110
+14111
+14112
+14113
+14114
+14115
+14116
+14117
+14118
+14119
+14120
+14121
+14122
+14123
+14124
+14125
+14126
+14127
+14128
+14129
+14130
+14131
+14132
+14133
+14134
+14135
+14136
+14137
+14138
+14139
+14140
+14141
+14142
+14143
+14144
+14145
+14146
+14147
+14148
+14149
+14150
+14151
+14152
+14153
+14154
+14155
+14156
+14157
+14158
+14159
+14160
+14161
+14162
+14163
+14164
+14165
+14166
+14167
+14168
+14169
+14170
+14171
+14172
+14173
+14174
+14175
+14176
+14177
+14178
+14179
+14180
+14181
+14182
+14183
+14184
+14185
+14186
+14187
+14188
+14189
+14190
+14191
+14192
+14193
+14194
+14195
+14196
+14197
+14198
+14199
+14200
+14201
+14202
+14203
+14204
+14205
+14206
+14207
+14208
+14209
+14210
+14211
+14212
+14213
+14214
+14215
+14216
+14217
+14218
+14219
+14220
+14221
+14222
+14223
+14224
+14225
+14226
+14227
+14228
+14229
+14230
+14231
+14232
+14233
+14234
+14235
+14236
+14237
+14238
+14239
+14240
+14241
+14242
+14243
+14244
+14245
+14246
+14247
+14248
+14249
+14250
+14251
+14252
+14253
+14254
+14255
+14256
+14257
+14258
+14259
+14260
+14261
+14262
+14263
+14264
+14265
+14266
+14267
+14268
+14269
+14270
+14271
+14272
+14273
+14274
+14275
+14276
+14277
+14278
+14279
+14280
+14281
+14282
+14283
+14284
+14285
+14286
+14287
+14288
+14289
+14290
+14291
+14292
+14293
+14294
+14295
+14296
+14297
+14298
+14299
+14300
+14301
+14302
+14303
+14304
+14305
+14306
+14307
+14308
+14309
+14310
+14311
+14312
+14313
+14314
+14315
+14316
+14317
+14318
+14319
+14320
+14321
+14322
+14323
+14324
+14325
+14326
+14327
+14328
+14329
+14330
+14331
+14332
+14333
+14334
+14335
+14336
+14337
+14338
+14339
+14340
+14341
+14342
+14343
+14344
+14345
+14346
+14347
+14348
+14349
+14350
+14351
+14352
+14353
+14354
+14355
+14356
+14357
+14358
+14359
+14360
+14361
+14362
+14363
+14364
+14365
+14366
+14367
+14368
+14369
+14370
+14371
+14372
+14373
+14374
+14375
+14376
+14377
+14378
+14379
+14380
+14381
+14382
+14383
+14384
+14385
+14386
+14387
+14388
+14389
+14390
+14391
+14392
+14393
+14394
+14395
+14396
+14397
+14398
+14399
+14400
+14401
+14402
+14403
+14404
+14405
+14406
+14407
+14408
+14409
+14410
+14411
+14412
+14413
+14414
+14415
+14416
+14417
+14418
+14419
+14420
+14421
+14422
+14423
+14424
+14425
+14426
+14427
+14428
+14429
+14430
+14431
+14432
+14433
+14434
+14435
+14436
+14437
+14438
+14439
+14440
+14441
+14442
+14443
+14444
+14445
+14446
+14447
+14448
+14449
+14450
+14451
+14452
+14453
+14454
+14455
+14456
+14457
+14458
+14459
+14460
+14461
+14462
+14463
+14464
+14465
+14466
+14467
+14468
+14469
+14470
+14471
+14472
+14473
+14474
+14475
+14476
+14477
+14478
+14479
+14480
+14481
+14482
+14483
+14484
+14485
+14486
+14487
+14488
+14489
+14490
+14491
+14492
+14493
+14494
+14495
+14496
+14497
+14498
+14499
+14500
+14501
+14502
+14503
+14504
+14505
+14506
+14507
+14508
+14509
+14510
+14511
+14512
+14513
+14514
+14515
+14516
+14517
+14518
+14519
+14520
+14521
+14522
+14523
+14524
+14525
+14526
+14527
+14528
+14529
+14530
+14531
+14532
+14533
+14534
+14535
+14536
+14537
+14538
+14539
+14540
+14541
+14542
+14543
+14544
+14545
+14546
+14547
+14548
+14549
+14550
+14551
+14552
+14553
+14554
+14555
+14556
+14557
+14558
+14559
+14560
+14561
+14562
+14563
+14564
+14565
+14566
+14567
+14568
+14569
+14570
+14571
+14572
+14573
+14574
+14575
+14576
+14577
+14578
+14579
+14580
+14581
+14582
+14583
+14584
+14585
+14586
+14587
+14588
+14589
+14590
+14591
+14592
+14593
+14594
+14595
+14596
+14597
+14598
+14599
+14600
+14601
+14602
+14603
+14604
+14605
+14606
+14607
+14608
+14609
+14610
+14611
+14612
+14613
+14614
+14615
+14616
+14617
+14618
+14619
+14620
+14621
+14622
+14623
+14624
+14625
+14626
+14627
+14628
+14629
+14630
+14631
+14632
+14633
+14634
+14635
+14636
+14637
+14638
+14639
+14640
+14641
+14642
+14643
+14644
+14645
+14646
+14647
+14648
+14649
+14650
+14651
+14652
+14653
+14654
+14655
+14656
+14657
+14658
+14659
+14660
+14661
+14662
+14663
+14664
+14665
+14666
+14667
+14668
+14669
+14670
+14671
+14672
+14673
+14674
+14675
+14676
+14677
+14678
+14679
+14680
+14681
+14682
+14683
+14684
+14685
+14686
+14687
+14688
+14689
+14690
+14691
+14692
+14693
+14694
+14695
+14696
+14697
+14698
+14699
+14700
+14701
+14702
+14703
+14704
+14705
+14706
+14707
+14708
+14709
+14710
+14711
+14712
+14713
+14714
+14715
+14716
+14717
+14718
+14719
+14720
+14721
+14722
+14723
+14724
+14725
+14726
+14727
+14728
+14729
+14730
+14731
+14732
+14733
+14734
+14735
+14736
+14737
+14738
+14739
+14740
+14741
+14742
+14743
+14744
+14745
+14746
+14747
+14748
+14749
+14750
+14751
+14752
+14753
+14754
+14755
+14756
+14757
+14758
+14759
+14760
+14761
+14762
+14763
+14764
+14765
+14766
+14767
+14768
+14769
+14770
+14771
+14772
+14773
+14774
+14775
+14776
+14777
+14778
+14779
+14780
+14781
+14782
+14783
+14784
+14785
+14786
+14787
+14788
+14789
+14790
+14791
+14792
+14793
+14794
+14795
+14796
+14797
+14798
+14799
+14800
+14801
+14802
+14803
+14804
+14805
+14806
+14807
+14808
+14809
+14810
+14811
+14812
+14813
+14814
+14815
+14816
+14817
+14818
+14819
+14820
+14821
+14822
+14823
+14824
+14825
+14826
+14827
+14828
+14829
+14830
+14831
+14832
+14833
+14834
+14835
+14836
+14837
+14838
+14839
+14840
+14841
+14842
+14843
+14844
+14845
+14846
+14847
+14848
+14849
+14850
+14851
+14852
+14853
+14854
+14855
+14856
+14857
+14858
+14859
+14860
+14861
+14862
+14863
+14864
+14865
+14866
+14867
+14868
+14869
+14870
+14871
+14872
+14873
+14874
+14875
+14876
+14877
+14878
+14879
+14880
+14881
+14882
+14883
+14884
+14885
+14886
+14887
+14888
+14889
+14890
+14891
+14892
+14893
+14894
+14895
+14896
+14897
+14898
+14899
+14900
+14901
+14902
+14903
+14904
+14905
+14906
+14907
+14908
+14909
+14910
+14911
+14912
+14913
+14914
+14915
+14916
+14917
+14918
+14919
+14920
+14921
+14922
+14923
+14924
+14925
+14926
+14927
+14928
+14929
+14930
+14931
+14932
+14933
+14934
+14935
+14936
+14937
+14938
+14939
+14940
+14941
+14942
+14943
+14944
+14945
+14946
+14947
+14948
+14949
+14950
+14951
+14952
+14953
+14954
+14955
+14956
+14957
+14958
+14959
+14960
+14961
+14962
+14963
+14964
+14965
+14966
+14967
+14968
+14969
+14970
+14971
+14972
+14973
+14974
+14975
+14976
+14977
+14978
+14979
+14980
+14981
+14982
+14983
+14984
+14985
+14986
+14987
+14988
+14989
+14990
+14991
+14992
+14993
+14994
+14995
+14996
+14997
+14998
+14999
+15000
+15001
+15002
+15003
+15004
+15005
+15006
+15007
+15008
+15009
+15010
+15011
+15012
+15013
+15014
+15015
+15016
+15017
+15018
+15019
+15020
+15021
+15022
+15023
+15024
+15025
+15026
+15027
+15028
+15029
+15030
+15031
+15032
+15033
+15034
+15035
+15036
+15037
+15038
+15039
+15040
+15041
+15042
+15043
+15044
+15045
+15046
+15047
+15048
+15049
+15050
+15051
+15052
+15053
+15054
+15055
+15056
+15057
+15058
+15059
+15060
+15061
+15062
+15063
+15064
+15065
+15066
+15067
+15068
+15069
+15070
+15071
+15072
+15073
+15074
+15075
+15076
+15077
+15078
+15079
+15080
+15081
+15082
+15083
+15084
+15085
+15086
+15087
+15088
+15089
+15090
+15091
+15092
+15093
+15094
+15095
+15096
+15097
+15098
+15099
+15100
+15101
+15102
+15103
+15104
+15105
+15106
+15107
+15108
+15109
+15110
+15111
+15112
+15113
+15114
+15115
+15116
+15117
+15118
+15119
+15120
+15121
+15122
+15123
+15124
+15125
+15126
+15127
+15128
+15129
+15130
+15131
+15132
+15133
+15134
+15135
+15136
+15137
+15138
+15139
+15140
+15141
+15142
+15143
+15144
+15145
+15146
+15147
+15148
+15149
+15150
+15151
+15152
+15153
+15154
+15155
+15156
+15157
+15158
+15159
+15160
+15161
+15162
+15163
+15164
+15165
+15166
+15167
+15168
+15169
+15170
+15171
+15172
+15173
+15174
+15175
+15176
+15177
+15178
+15179
+15180
+15181
+15182
+15183
+15184
+15185
+15186
+15187
+15188
+15189
+15190
+15191
+15192
+15193
+15194
+15195
+15196
+15197
+15198
+15199
+15200
+15201
+15202
+15203
+15204
+15205
+15206
+15207
+15208
+15209
+15210
+15211
+15212
+15213
+15214
+15215
+15216
+15217
+15218
+15219
+15220
+15221
+15222
+15223
+15224
+15225
+15226
+15227
+15228
+15229
+15230
+15231
+15232
+15233
+15234
+15235
+15236
+15237
+15238
+15239
+15240
+15241
+15242
+15243
+15244
+15245
+15246
+15247
+15248
+15249
+15250
+15251
+15252
+15253
+15254
+15255
+15256
+15257
+15258
+15259
+15260
+15261
+15262
+15263
+15264
+15265
+15266
+15267
+15268
+15269
+15270
+15271
+15272
+15273
+15274
+15275
+15276
+15277
+15278
+15279
+15280
+15281
+15282
+15283
+15284
+15285
+15286
+15287
+15288
+15289
+15290
+15291
+15292
+15293
+15294
+15295
+15296
+15297
+15298
+15299
+15300
+15301
+15302
+15303
+15304
+15305
+15306
+15307
+15308
+15309
+15310
+15311
+15312
+15313
+15314
+15315
+15316
+15317
+15318
+15319
+15320
+15321
+15322
+15323
+15324
+15325
+15326
+15327
+15328
+15329
+15330
+15331
+15332
+15333
+15334
+15335
+15336
+15337
+15338
+15339
+15340
+15341
+15342
+15343
+15344
+15345
+15346
+15347
+15348
+15349
+15350
+15351
+15352
+15353
+15354
+15355
+15356
+15357
+15358
+15359
+15360
+15361
+15362
+15363
+15364
+15365
+15366
+15367
+15368
+15369
+15370
+15371
+15372
+15373
+15374
+15375
+15376
+15377
+15378
+15379
+15380
+15381
+15382
+15383
+15384
+15385
+15386
+15387
+15388
+15389
+15390
+15391
+15392
+15393
+15394
+15395
+15396
+15397
+15398
+15399
+15400
+15401
+15402
+15403
+15404
+15405
+15406
+15407
+15408
+15409
+15410
+15411
+15412
+15413
+15414
+15415
+15416
+15417
+15418
+15419
+15420
+15421
+15422
+15423
+15424
+15425
+15426
+15427
+15428
+15429
+15430
+15431
+15432
+15433
+15434
+15435
+15436
+15437
+15438
+15439
+15440
+15441
+15442
+15443
+15444
+15445
+15446
+15447
+15448
+15449
+15450
+15451
+15452
+15453
+15454
+15455
+15456
+15457
+15458
+15459
+15460
+15461
+15462
+15463
+15464
+15465
+15466
+15467
+15468
+15469
+15470
+15471
+15472
+15473
+15474
+15475
+15476
+15477
+15478
+15479
+15480
+15481
+15482
+15483
+15484
+15485
+15486
+15487
+15488
+15489
+15490
+15491
+15492
+15493
+15494
+15495
+15496
+15497
+15498
+15499
+15500
+15501
+15502
+15503
+15504
+15505
+15506
+15507
+15508
+15509
+15510
+15511
+15512
+15513
+15514
+15515
+15516
+15517
+15518
+15519
+15520
+15521
+15522
+15523
+15524
+15525
+15526
+15527
+15528
+15529
+15530
+15531
+15532
+15533
+15534
+15535
+15536
+15537
+15538
+15539
+15540
+15541
+15542
+15543
+15544
+15545
+15546
+15547
+15548
+15549
+15550
+15551
+15552
+15553
+15554
+15555
+15556
+15557
+15558
+15559
+15560
+15561
+15562
+15563
+15564
+15565
+15566
+15567
+15568
+15569
+15570
+15571
+15572
+15573
+15574
+15575
+15576
+15577
+15578
+15579
+15580
+15581
+15582
+15583
+15584
+15585
+15586
+15587
+15588
+15589
+15590
+15591
+15592
+15593
+15594
+15595
+15596
+15597
+15598
+15599
+15600
+15601
+15602
+15603
+15604
+15605
+15606
+15607
+15608
+15609
+15610
+15611
+15612
+15613
+15614
+15615
+15616
+15617
+15618
+15619
+15620
+15621
+15622
+15623
+15624
+15625
+15626
+15627
+15628
+15629
+15630
+15631
+15632
+15633
+15634
+15635
+15636
+15637
+15638
+15639
+15640
+15641
+15642
+15643
+15644
+15645
+15646
+15647
+15648
+15649
+15650
+15651
+15652
+15653
+15654
+15655
+15656
+15657
+15658
+15659
+15660
+15661
+15662
+15663
+15664
+15665
+15666
+15667
+15668
+15669
+15670
+15671
+15672
+15673
+15674
+15675
+15676
+15677
+15678
+15679
+15680
+15681
+15682
+15683
+15684
+15685
+15686
+15687
+15688
+15689
+15690
+15691
+15692
+15693
+15694
+15695
+15696
+15697
+15698
+15699
+15700
+15701
+15702
+15703
+15704
+15705
+15706
+15707
+15708
+15709
+15710
+15711
+15712
+15713
+15714
+15715
+15716
+15717
+15718
+15719
+15720
+15721
+15722
+15723
+15724
+15725
+15726
+15727
+15728
+15729
+15730
+15731
+15732
+15733
+15734
+15735
+15736
+15737
+15738
+15739
+15740
+15741
+15742
+15743
+15744
+15745
+15746
+15747
+15748
+15749
+15750
+15751
+15752
+15753
+15754
+15755
+15756
+15757
+15758
+15759
+15760
+15761
+15762
+15763
+15764
+15765
+15766
+15767
+15768
+15769
+15770
+15771
+15772
+15773
+15774
+15775
+15776
+15777
+15778
+15779
+15780
+15781
+15782
+15783
+15784
+15785
+15786
+15787
+15788
+15789
+15790
+15791
+15792
+15793
+15794
+15795
+15796
+15797
+15798
+15799
+15800
+15801
+15802
+15803
+15804
+15805
+15806
+15807
+15808
+15809
+15810
+15811
+15812
+15813
+15814
+15815
+15816
+15817
+15818
+15819
+15820
+15821
+15822
+15823
+15824
+15825
+15826
+15827
+15828
+15829
+15830
+15831
+15832
+15833
+15834
+15835
+15836
+15837
+15838
+15839
+15840
+15841
+15842
+15843
+15844
+15845
+15846
+15847
+15848
+15849
+15850
+15851
+15852
+15853
+15854
+15855
+15856
+15857
+15858
+15859
+15860
+15861
+15862
+15863
+15864
+15865
+15866
+15867
+15868
+15869
+15870
+15871
+15872
+15873
+15874
+15875
+15876
+15877
+15878
+15879
+15880
+15881
+15882
+15883
+15884
+15885
+15886
+15887
+15888
+15889
+15890
+15891
+15892
+15893
+15894
+15895
+15896
+15897
+15898
+15899
+15900
+15901
+15902
+15903
+15904
+15905
+15906
+15907
+15908
+15909
+15910
+15911
+15912
+15913
+15914
+15915
+15916
+15917
+15918
+15919
+15920
+15921
+15922
+15923
+15924
+15925
+15926
+15927
+15928
+15929
+15930
+15931
+15932
+15933
+15934
+15935
+15936
+15937
+15938
+15939
+15940
+15941
+15942
+15943
+15944
+15945
+15946
+15947
+15948
+15949
+15950
+15951
+15952
+15953
+15954
+15955
+15956
+15957
+15958
+15959
+15960
+15961
+15962
+15963
+15964
+15965
+15966
+15967
+15968
+15969
+15970
+15971
+15972
+15973
+15974
+15975
+15976
+15977
+15978
+15979
+15980
+15981
+15982
+15983
+15984
+15985
+15986
+15987
+15988
+15989
+15990
+15991
+15992
+15993
+15994
+15995
+15996
+15997
+15998
+15999
+16000
+16001
+16002
+16003
+16004
+16005
+16006
+16007
+16008
+16009
+16010
+16011
+16012
+16013
+16014
+16015
+16016
+16017
+16018
+16019
+16020
+16021
+16022
+16023
+16024
+16025
+16026
+16027
+16028
+16029
+16030
+16031
+16032
+16033
+16034
+16035
+16036
+16037
+16038
+16039
+16040
+16041
+16042
+16043
+16044
+16045
+16046
+16047
+16048
+16049
+16050
+16051
+16052
+16053
+16054
+16055
+16056
+16057
+16058
+16059
+16060
+16061
+16062
+16063
+16064
+16065
+16066
+16067
+16068
+16069
+16070
+16071
+16072
+16073
+16074
+16075
+16076
+16077
+16078
+16079
+16080
+16081
+16082
+16083
+16084
+16085
+16086
+16087
+16088
+16089
+16090
+16091
+16092
+16093
+16094
+16095
+16096
+16097
+16098
+16099
+16100
+16101
+16102
+16103
+16104
+16105
+16106
+16107
+16108
+16109
+16110
+16111
+16112
+16113
+16114
+16115
+16116
+16117
+16118
+16119
+16120
+16121
+16122
+16123
+16124
+16125
+16126
+16127
+16128
+16129
+16130
+16131
+16132
+16133
+16134
+16135
+16136
+16137
+16138
+16139
+16140
+16141
+16142
+16143
+16144
+16145
+16146
+16147
+16148
+16149
+16150
+16151
+16152
+16153
+16154
+16155
+16156
+16157
+16158
+16159
+16160
+16161
+16162
+16163
+16164
+16165
+16166
+16167
+16168
+16169
+16170
+16171
+16172
+16173
+16174
+16175
+16176
+16177
+16178
+16179
+16180
+16181
+16182
+16183
+16184
+16185
+16186
+16187
+16188
+16189
+16190
+16191
+16192
+16193
+16194
+16195
+16196
+16197
+16198
+16199
+16200
+16201
+16202
+16203
+16204
+16205
+16206
+16207
+16208
+16209
+16210
+16211
+16212
+16213
+16214
+16215
+16216
+16217
+16218
+16219
+16220
+16221
+16222
+16223
+16224
+16225
+16226
+16227
+16228
+16229
+16230
+16231
+16232
+16233
+16234
+16235
+16236
+16237
+16238
+16239
+16240
+16241
+16242
+16243
+16244
+16245
+16246
+16247
+16248
+16249
+16250
+16251
+16252
+16253
+16254
+16255
+16256
+16257
+16258
+16259
+16260
+16261
+16262
+16263
+16264
+16265
+16266
+16267
+16268
+16269
+16270
+16271
+16272
+16273
+16274
+16275
+16276
+16277
+16278
+16279
+16280
+16281
+16282
+16283
+16284
+16285
+16286
+16287
+16288
+16289
+16290
+16291
+16292
+16293
+16294
+16295
+16296
+16297
+16298
+16299
+16300
+16301
+16302
+16303
+16304
+16305
+16306
+16307
+16308
+16309
+16310
+16311
+16312
+16313
+16314
+16315
+16316
+16317
+16318
+16319
+16320
+16321
+16322
+16323
+16324
+16325
+16326
+16327
+16328
+16329
+16330
+16331
+16332
+16333
+16334
+16335
+16336
+16337
+16338
+16339
+16340
+16341
+16342
+16343
+16344
+16345
+16346
+16347
+16348
+16349
+16350
+16351
+16352
+16353
+16354
+16355
+16356
+16357
+16358
+16359
+16360
+16361
+16362
+16363
+16364
+16365
+16366
+16367
+16368
+16369
+16370
+16371
+16372
+16373
+16374
+16375
+16376
+16377
+16378
+16379
+16380
+16381
+16382
+16383
+16384
+16385
+16386
+16387
+16388
+16389
+16390
+16391
+16392
+16393
+16394
+16395
+16396
+16397
+16398
+16399
+16400
+16401
+16402
+16403
+16404
+16405
+16406
+16407
+16408
+16409
+16410
+16411
+16412
+16413
+16414
+16415
+16416
+16417
+16418
+16419
+16420
+16421
+16422
+16423
+16424
+16425
+16426
+16427
+16428
+16429
+16430
+16431
+16432
+16433
+16434
+16435
+16436
+16437
+16438
+16439
+16440
+16441
+16442
+16443
+16444
+16445
+16446
+16447
+16448
+16449
+16450
+16451
+16452
+16453
+16454
+16455
+16456
+16457
+16458
+16459
+16460
+16461
+16462
+16463
+16464
+16465
+16466
+16467
+16468
+16469
+16470
+16471
+16472
+16473
+16474
+16475
+16476
+16477
+16478
+16479
+16480
+16481
+16482
+16483
+16484
+16485
+16486
+16487
+16488
+16489
+16490
+16491
+16492
+16493
+16494
+16495
+16496
+16497
+16498
+16499
+16500
+16501
+16502
+16503
+16504
+16505
+16506
+16507
+16508
+16509
+16510
+16511
+16512
+16513
+16514
+16515
+16516
+16517
+16518
+16519
+16520
+16521
+16522
+16523
+16524
+16525
+16526
+16527
+16528
+16529
+16530
+16531
+16532
+16533
+16534
+16535
+16536
+16537
+16538
+16539
+16540
+16541
+16542
+16543
+16544
+16545
+16546
+16547
+16548
+16549
+16550
+16551
+16552
+16553
+16554
+16555
+16556
+16557
+16558
+16559
+16560
+16561
+16562
+16563
+16564
+16565
+16566
+16567
+16568
+16569
+16570
+16571
+16572
+16573
+16574
+16575
+16576
+16577
+16578
+16579
+16580
+16581
+16582
+16583
+16584
+16585
+16586
+16587
+16588
+16589
+16590
+16591
+16592
+16593
+16594
+16595
+16596
+16597
+16598
+16599
+16600
+16601
+16602
+16603
+16604
+16605
+16606
+16607
+16608
+16609
+16610
+16611
+16612
+16613
+16614
+16615
+16616
+16617
+16618
+16619
+16620
+16621
+16622
+16623
+16624
+16625
+16626
+16627
+16628
+16629
+16630
+16631
+16632
+16633
+16634
+16635
+16636
+16637
+16638
+16639
+16640
+16641
+16642
+16643
+16644
+16645
+16646
+16647
+16648
+16649
+16650
+16651
+16652
+16653
+16654
+16655
+16656
+16657
+16658
+16659
+16660
+16661
+16662
+16663
+16664
+16665
+16666
+16667
+16668
+16669
+16670
+16671
+16672
+16673
+16674
+16675
+16676
+16677
+16678
+16679
+16680
+16681
+16682
+16683
+16684
+16685
+16686
+16687
+16688
+16689
+16690
+16691
+16692
+16693
+16694
+16695
+16696
+16697
+16698
+16699
+16700
+16701
+16702
+16703
+16704
+16705
+16706
+16707
+16708
+16709
+16710
+16711
+16712
+16713
+16714
+16715
+16716
+16717
+16718
+16719
+16720
+16721
+16722
+16723
+16724
+16725
+16726
+16727
+16728
+16729
+16730
+16731
+16732
+16733
+16734
+16735
+16736
+16737
+16738
+16739
+16740
+16741
+16742
+16743
+16744
+16745
+16746
+16747
+16748
+16749
+16750
+16751
+16752
+16753
+16754
+16755
+16756
+16757
+16758
+16759
+16760
+16761
+16762
+16763
+16764
+16765
+16766
+16767
+16768
+16769
+16770
+16771
+16772
+16773
+16774
+16775
+16776
+16777
+16778
+16779
+16780
+16781
+16782
+16783
+16784
+16785
+16786
+16787
+16788
+16789
+16790
+16791
+16792
+16793
+16794
+16795
+16796
+16797
+16798
+16799
+16800
+16801
+16802
+16803
+16804
+16805
+16806
+16807
+16808
+16809
+16810
+16811
+16812
+16813
+16814
+16815
+16816
+16817
+16818
+16819
+16820
+16821
+16822
+16823
+16824
+16825
+16826
+16827
+16828
+16829
+16830
+16831
+16832
+16833
+16834
+16835
+16836
+16837
+16838
+16839
+16840
+16841
+16842
+16843
+16844
+16845
+16846
+16847
+16848
+16849
+16850
+16851
+16852
+16853
+16854
+16855
+16856
+16857
+16858
+16859
+16860
+16861
+16862
+16863
+16864
+16865
+16866
+16867
+16868
+16869
+16870
+16871
+16872
+16873
+16874
+16875
+16876
+16877
+16878
+16879
+16880
+16881
+16882
+16883
+16884
+16885
+16886
+16887
+16888
+16889
+16890
+16891
+16892
+16893
+16894
+16895
+16896
+16897
+16898
+16899
+16900
+16901
+16902
+16903
+16904
+16905
+16906
+16907
+16908
+16909
+16910
+16911
+16912
+16913
+16914
+16915
+16916
+16917
+16918
+16919
+16920
+16921
+16922
+16923
+16924
+16925
+16926
+16927
+16928
+16929
+16930
+16931
+16932
+16933
+16934
+16935
+16936
+16937
+16938
+16939
+16940
+16941
+16942
+16943
+16944
+16945
+16946
+16947
+16948
+16949
+16950
+16951
+16952
+16953
+16954
+16955
+16956
+16957
+16958
+16959
+16960
+16961
+16962
+16963
+16964
+16965
+16966
+16967
+16968
+16969
+16970
+16971
+16972
+16973
+16974
+16975
+16976
+16977
+16978
+16979
+16980
+16981
+16982
+16983
+16984
+16985
+16986
+16987
+16988
+16989
+16990
+16991
+16992
+16993
+16994
+16995
+16996
+16997
+16998
+16999
+17000
+17001
+17002
+17003
+17004
+17005
+17006
+17007
+17008
+17009
+17010
+17011
+17012
+17013
+17014
+17015
+17016
+17017
+17018
+17019
+17020
+17021
+17022
+17023
+17024
+17025
+17026
+17027
+17028
+17029
+17030
+17031
+17032
+17033
+17034
+17035
+17036
+17037
+17038
+17039
+17040
+17041
+17042
+17043
+17044
+17045
+17046
+17047
+17048
+17049
+17050
+17051
+17052
+17053
+17054
+17055
+17056
+17057
+17058
+17059
+17060
+17061
+17062
+17063
+17064
+17065
+17066
+17067
+17068
+17069
+17070
+17071
+17072
+17073
+17074
+17075
+17076
+17077
+17078
+17079
+17080
+17081
+17082
+17083
+17084
+17085
+17086
+17087
+17088
+17089
+17090
+17091
+17092
+17093
+17094
+17095
+17096
+17097
+17098
+17099
+17100
+17101
+17102
+17103
+17104
+17105
+17106
+17107
+17108
+17109
+17110
+17111
+17112
+17113
+17114
+17115
+17116
+17117
+17118
+17119
+17120
+17121
+17122
+17123
+17124
+17125
+17126
+17127
+17128
+17129
+17130
+17131
+17132
+17133
+17134
+17135
+17136
+17137
+17138
+17139
+17140
+17141
+17142
+17143
+17144
+17145
+17146
+17147
+17148
+17149
+17150
+17151
+17152
+17153
+17154
+17155
+17156
+17157
+17158
+17159
+17160
+17161
+17162
+17163
+17164
+17165
+17166
+17167
+17168
+17169
+17170
+17171
+17172
+17173
+17174
+17175
+17176
+17177
+17178
+17179
+17180
+17181
+17182
+17183
+17184
+17185
+17186
+17187
+17188
+17189
+17190
+17191
+17192
+17193
+17194
+17195
+17196
+17197
+17198
+17199
+17200
+17201
+17202
+17203
+17204
+17205
+17206
+17207
+17208
+17209
+17210
+17211
+17212
+17213
+17214
+17215
+17216
+17217
+17218
+17219
+17220
+17221
+17222
+17223
+17224
+17225
+17226
+17227
+17228
+17229
+17230
+17231
+17232
+17233
+17234
+17235
+17236
+17237
+17238
+17239
+17240
+17241
+17242
+17243
+17244
+17245
+17246
+17247
+17248
+17249
+17250
+17251
+17252
+17253
+17254
+17255
+17256
+17257
+17258
+17259
+17260
+17261
+17262
+17263
+17264
+17265
+17266
+17267
+17268
+17269
+17270
+17271
+17272
+17273
+17274
+17275
+17276
+17277
+17278
+17279
+17280
+17281
+17282
+17283
+17284
+17285
+17286
+17287
+17288
+17289
+17290
+17291
+17292
+17293
+17294
+17295
+17296
+17297
+17298
+17299
+17300
+17301
+17302
+17303
+17304
+17305
+17306
+17307
+17308
+17309
+17310
+17311
+17312
+17313
+17314
+17315
+17316
+17317
+17318
+17319
+17320
+17321
+17322
+17323
+17324
+17325
+17326
+17327
+17328
+17329
+17330
+17331
+17332
+17333
+17334
+17335
+17336
+17337
+17338
+17339
+17340
+17341
+17342
+17343
+17344
+17345
+17346
+17347
+17348
+17349
+17350
+17351
+17352
+17353
+17354
+17355
+17356
+17357
+17358
+17359
+17360
+17361
+17362
+17363
+17364
+17365
+17366
+17367
+17368
+17369
+17370
+17371
+17372
+17373
+17374
+17375
+17376
+17377
+17378
+17379
+17380
+17381
+17382
+17383
+17384
+17385
+17386
+17387
+17388
+17389
+17390
+17391
+17392
+17393
+17394
+17395
+17396
+17397
+17398
+17399
+17400
+17401
+17402
+17403
+17404
+17405
+17406
+17407
+17408
+17409
+17410
+17411
+17412
+17413
+17414
+17415
+17416
+17417
+17418
+17419
+17420
+17421
+17422
+17423
+17424
+17425
+17426
+17427
+17428
+17429
+17430
+17431
+17432
+17433
+17434
+17435
+17436
+17437
+17438
+17439
+17440
+17441
+17442
+17443
+17444
+17445
+17446
+17447
+17448
+17449
+17450
+17451
+17452
+17453
+17454
+17455
+17456
+17457
+17458
+17459
+17460
+17461
+17462
+17463
+17464
+17465
+17466
+17467
+17468
+17469
+17470
+17471
+17472
+17473
+17474
+17475
+17476
+17477
+17478
+17479
+17480
+17481
+17482
+17483
+17484
+17485
+17486
+17487
+17488
+17489
+17490
+17491
+17492
+17493
+17494
+17495
+17496
+17497
+17498
+17499
+17500
+17501
+17502
+17503
+17504
+17505
+17506
+17507
+17508
+17509
+17510
+17511
+17512
+17513
+17514
+17515
+17516
+17517
+17518
+17519
+17520
+17521
+17522
+17523
+17524
+17525
+17526
+17527
+17528
+17529
+17530
+17531
+17532
+17533
+17534
+17535
+17536
+17537
+17538
+17539
+17540
+17541
+17542
+17543
+17544
+17545
+17546
+17547
+17548
+17549
+17550
+17551
+17552
+17553
+17554
+17555
+17556
+17557
+17558
+17559
+17560
+17561
+17562
+17563
+17564
+17565
+17566
+17567
+17568
+17569
+17570
+17571
+17572
+17573
+17574
+17575
+17576
+17577
+17578
+17579
+17580
+17581
+17582
+17583
+17584
+17585
+17586
+17587
+17588
+17589
+17590
+17591
+17592
+17593
+17594
+17595
+17596
+17597
+17598
+17599
+17600
+17601
+17602
+17603
+17604
+17605
+17606
+17607
+17608
+17609
+17610
+17611
+17612
+17613
+17614
+17615
+17616
+17617
+17618
+17619
+17620
+17621
+17622
+17623
+17624
+17625
+17626
+17627
+17628
+17629
+17630
+17631
+17632
+17633
+17634
+17635
+17636
+17637
+17638
+17639
+17640
+17641
+17642
+17643
+17644
+17645
+17646
+17647
+17648
+17649
+17650
+17651
+17652
+17653
+17654
+17655
+17656
+17657
+17658
+17659
+17660
+17661
+17662
+17663
+17664
+17665
+17666
+17667
+17668
+17669
+17670
+17671
+17672
+17673
+17674
+17675
+17676
+17677
+17678
+17679
+17680
+17681
+17682
+17683
+17684
+17685
+17686
+17687
+17688
+17689
+17690
+17691
+17692
+17693
+17694
+17695
+17696
+17697
+17698
+17699
+17700
+17701
+17702
+17703
+17704
+17705
+17706
+17707
+17708
+17709
+17710
+17711
+17712
+17713
+17714
+17715
+17716
+17717
+17718
+17719
+17720
+17721
+17722
+17723
+17724
+17725
+17726
+17727
+17728
+17729
+17730
+17731
+17732
+17733
+17734
+17735
+17736
+17737
+17738
+17739
+17740
+17741
+17742
+17743
+17744
+17745
+17746
+17747
+17748
+17749
+17750
+17751
+17752
+17753
+17754
+17755
+17756
+17757
+17758
+17759
+17760
+17761
+17762
+17763
+17764
+17765
+17766
+17767
+17768
+17769
+17770
+17771
+17772
+17773
+17774
+17775
+17776
+17777
+17778
+17779
+17780
+17781
+17782
+17783
+17784
+17785
+17786
+17787
+17788
+17789
+17790
+17791
+17792
+17793
+17794
+17795
+17796
+17797
+17798
+17799
+17800
+17801
+17802
+17803
+17804
+17805
+17806
+17807
+17808
+17809
+17810
+17811
+17812
+17813
+17814
+17815
+17816
+17817
+17818
+17819
+17820
+17821
+17822
+17823
+17824
+17825
+17826
+17827
+17828
+17829
+17830
+17831
+17832
+17833
+17834
+17835
+17836
+17837
+17838
+17839
+17840
+17841
+17842
+17843
+17844
+17845
+17846
+17847
+17848
+17849
+17850
+17851
+17852
+17853
+17854
+17855
+17856
+17857
+17858
+17859
+17860
+17861
+17862
+17863
+17864
+17865
+17866
+17867
+17868
+17869
+17870
+17871
+17872
+17873
+17874
+17875
+17876
+17877
+17878
+17879
+17880
+17881
+17882
+17883
+17884
+17885
+17886
+17887
+17888
+17889
+17890
+17891
+17892
+17893
+17894
+17895
+17896
+17897
+17898
+17899
+17900
+17901
+17902
+17903
+17904
+17905
+17906
+17907
+17908
+17909
+17910
+17911
+17912
+17913
+17914
+17915
+17916
+17917
+17918
+17919
+17920
+17921
+17922
+17923
+17924
+17925
+17926
+17927
+17928
+17929
+17930
+17931
+17932
+17933
+17934
+17935
+17936
+17937
+17938
+17939
+17940
+17941
+17942
+17943
+17944
+17945
+17946
+17947
+17948
+17949
+17950
+17951
+17952
+17953
+17954
+17955
+17956
+17957
+17958
+17959
+17960
+17961
+17962
+17963
+17964
+17965
+17966
+17967
+17968
+17969
+17970
+17971
+17972
+17973
+17974
+17975
+17976
+17977
+17978
+17979
+17980
+17981
+17982
+17983
+17984
+17985
+17986
+17987
+17988
+17989
+17990
+17991
+17992
+17993
+17994
+17995
+17996
+17997
+17998
+17999
+18000
+18001
+18002
+18003
+18004
+18005
+18006
+18007
+18008
+18009
+18010
+18011
+18012
+18013
+18014
+18015
+18016
+18017
+18018
+18019
+18020
+18021
+18022
+18023
+18024
+18025
+18026
+18027
+18028
+18029
+18030
+18031
+18032
+18033
+18034
+18035
+18036
+18037
+18038
+18039
+18040
+18041
+18042
+18043
+18044
+18045
+18046
+18047
+18048
+18049
+18050
+18051
+18052
+18053
+18054
+18055
+18056
+18057
+18058
+18059
+18060
+18061
+18062
+18063
+18064
+18065
+18066
+18067
+18068
+18069
+18070
+18071
+18072
+18073
+18074
+18075
+18076
+18077
+18078
+18079
+18080
+18081
+18082
+18083
+18084
+18085
+18086
+18087
+18088
+18089
+18090
+18091
+18092
+18093
+18094
+18095
+18096
+18097
+18098
+18099
+18100
+18101
+18102
+18103
+18104
+18105
+18106
+18107
+18108
+18109
+18110
+18111
+18112
+18113
+18114
+18115
+18116
+18117
+18118
+18119
+18120
+18121
+18122
+18123
+18124
+18125
+18126
+18127
+18128
+18129
+18130
+18131
+18132
+18133
+18134
+18135
+18136
+18137
+18138
+18139
+18140
+18141
+18142
+18143
+18144
+18145
+18146
+18147
+18148
+18149
+18150
+18151
+18152
+18153
+18154
+18155
+18156
+18157
+18158
+18159
+18160
+18161
+18162
+18163
+18164
+18165
+18166
+18167
+18168
+18169
+18170
+18171
+18172
+18173
+18174
+18175
+18176
+18177
+18178
+18179
+18180
+18181
+18182
+18183
+18184
+18185
+18186
+18187
+18188
+18189
+18190
+18191
+18192
+18193
+18194
+18195
+18196
+18197
+18198
+18199
+18200
+18201
+18202
+18203
+18204
+18205
+18206
+18207
+18208
+18209
+18210
+18211
+18212
+18213
+18214
+18215
+18216
+18217
+18218
+18219
+18220
+18221
+18222
+18223
+18224
+18225
+18226
+18227
+18228
+18229
+18230
+18231
+18232
+18233
+18234
+18235
+18236
+18237
+18238
+18239
+18240
+18241
+18242
+18243
+18244
+18245
+18246
+18247
+18248
+18249
+18250
+18251
+18252
+18253
+18254
+18255
+18256
+18257
+18258
+18259
+18260
+18261
+18262
+18263
+18264
+18265
+18266
+18267
+18268
+18269
+18270
+18271
+18272
+18273
+18274
+18275
+18276
+18277
+18278
+18279
+18280
+18281
+18282
+18283
+18284
+18285
+18286
+18287
+18288
+18289
+18290
+18291
+18292
+18293
+18294
+18295
+18296
+18297
+18298
+18299
+18300
+18301
+18302
+18303
+18304
+18305
+18306
+18307
+18308
+18309
+18310
+18311
+18312
+18313
+18314
+18315
+18316
+18317
+18318
+18319
+18320
+18321
+18322
+18323
+18324
+18325
+18326
+18327
+18328
+18329
+18330
+18331
+18332
+18333
+18334
+18335
+18336
+18337
+18338
+18339
+18340
+18341
+18342
+18343
+18344
+18345
+18346
+18347
+18348
+18349
+18350
+18351
+18352
+18353
+18354
+18355
+18356
+18357
+18358
+18359
+18360
+18361
+18362
+18363
+18364
+18365
+18366
+18367
+18368
+18369
+18370
+18371
+18372
+18373
+18374
+18375
+18376
+18377
+18378
+18379
+18380
+18381
+18382
+18383
+18384
+18385
+18386
+18387
+18388
+18389
+18390
+18391
+18392
+18393
+18394
+18395
+18396
+18397
+18398
+18399
+18400
+18401
+18402
+18403
+18404
+18405
+18406
+18407
+18408
+18409
+18410
+18411
+18412
+18413
+18414
+18415
+18416
+18417
+18418
+18419
+18420
+18421
+18422
+18423
+18424
+18425
+18426
+18427
+18428
+18429
+18430
+18431
+18432
+18433
+18434
+18435
+18436
+18437
+18438
+18439
+18440
+18441
+18442
+18443
+18444
+18445
+18446
+18447
+18448
+18449
+18450
+18451
+18452
+18453
+18454
+18455
+18456
+18457
+18458
+18459
+18460
+18461
+18462
+18463
+18464
+18465
+18466
+18467
+18468
+18469
+18470
+18471
+18472
+18473
+18474
+18475
+18476
+18477
+18478
+18479
+18480
+18481
+18482
+18483
+18484
+18485
+18486
+18487
+18488
+18489
+18490
+18491
+18492
+18493
+18494
+18495
+18496
+18497
+18498
+18499
+18500
+18501
+18502
+18503
+18504
+18505
+18506
+18507
+18508
+18509
+18510
+18511
+18512
+18513
+18514
+18515
+18516
+18517
+18518
+18519
+18520
+18521
+18522
+18523
+18524
+18525
+18526
+18527
+18528
+18529
+18530
+18531
+18532
+18533
+18534
+18535
+18536
+18537
+18538
+18539
+18540
+18541
+18542
+18543
+18544
+18545
+18546
+18547
+18548
+18549
+18550
+18551
+18552
+18553
+18554
+18555
+18556
+18557
+18558
+18559
+18560
+18561
+18562
+18563
+18564
+18565
+18566
+18567
+18568
+18569
+18570
+18571
+18572
+18573
+18574
+18575
+18576
+18577
+18578
+18579
+18580
+18581
+18582
+18583
+18584
+18585
+18586
+18587
+18588
+18589
+18590
+18591
+18592
+18593
+18594
+18595
+18596
+18597
+18598
+18599
+18600
+18601
+18602
+18603
+18604
+18605
+18606
+18607
+18608
+18609
+18610
+18611
+18612
+18613
+18614
+18615
+18616
+18617
+18618
+18619
+18620
+18621
+18622
+18623
+18624
+18625
+18626
+18627
+18628
+18629
+18630
+18631
+18632
+18633
+18634
+18635
+18636
+18637
+18638
+18639
+18640
+18641
+18642
+18643
+18644
+18645
+18646
+18647
+18648
+18649
+18650
+18651
+18652
+18653
+18654
+18655
+18656
+18657
+18658
+18659
+18660
+18661
+18662
+18663
+18664
+18665
+18666
+18667
+18668
+18669
+18670
+18671
+18672
+18673
+18674
+18675
+18676
+18677
+18678
+18679
+18680
+18681
+18682
+18683
+18684
+18685
+18686
+18687
+18688
+18689
+18690
+18691
+18692
+18693
+18694
+18695
+18696
+18697
+18698
+18699
+18700
+18701
+18702
+18703
+18704
+18705
+18706
+18707
+18708
+18709
+18710
+18711
+18712
+18713
+18714
+18715
+18716
+18717
+18718
+18719
+18720
+18721
+18722
+18723
+18724
+18725
+18726
+18727
+18728
+18729
+18730
+18731
+18732
+18733
+18734
+18735
+18736
+18737
+18738
+18739
+18740
+18741
+18742
+18743
+18744
+18745
+18746
+18747
+18748
+18749
+18750
+18751
+18752
+18753
+18754
+18755
+18756
+18757
+18758
+18759
+18760
+18761
+18762
+18763
+18764
+18765
+18766
+18767
+18768
+18769
+18770
+18771
+18772
+18773
+18774
+18775
+18776
+18777
+18778
+18779
+18780
+18781
+18782
+18783
+18784
+18785
+18786
+18787
+18788
+18789
+18790
+18791
+18792
+18793
+18794
+18795
+18796
+18797
+18798
+18799
+18800
+18801
+18802
+18803
+18804
+18805
+18806
+18807
+18808
+18809
+18810
+18811
+18812
+18813
+18814
+18815
+18816
+18817
+18818
+18819
+18820
+18821
+18822
+18823
+18824
+18825
+18826
+18827
+18828
+18829
+18830
+18831
+18832
+18833
+18834
+18835
+18836
+18837
+18838
+18839
+18840
+18841
+18842
+18843
+18844
+18845
+18846
+18847
+18848
+18849
+18850
+18851
+18852
+18853
+18854
+18855
+18856
+18857
+18858
+18859
+18860
+18861
+18862
+18863
+18864
+18865
+18866
+18867
+18868
+18869
+18870
+18871
+18872
+18873
+18874
+18875
+18876
+18877
+18878
+18879
+18880
+18881
+18882
+18883
+18884
+18885
+18886
+18887
+18888
+18889
+18890
+18891
+18892
+18893
+18894
+18895
+18896
+18897
+18898
+18899
+18900
+18901
+18902
+18903
+18904
+18905
+18906
+18907
+18908
+18909
+18910
+18911
+18912
+18913
+18914
+18915
+18916
+18917
+18918
+18919
+18920
+18921
+18922
+18923
+18924
+18925
+18926
+18927
+18928
+18929
+18930
+18931
+18932
+18933
+18934
+18935
+18936
+18937
+18938
+18939
+18940
+18941
+18942
+18943
+18944
+18945
+18946
+18947
+18948
+18949
+18950
+18951
+18952
+18953
+18954
+18955
+18956
+18957
+18958
+18959
+18960
+18961
+18962
+18963
+18964
+18965
+18966
+18967
+18968
+18969
+18970
+18971
+18972
+18973
+18974
+18975
+18976
+18977
+18978
+18979
+18980
+18981
+18982
+18983
+18984
+18985
+18986
+18987
+18988
+18989
+18990
+18991
+18992
+18993
+18994
+18995
+18996
+18997
+18998
+18999
+19000
+19001
+19002
+19003
+19004
+19005
+19006
+19007
+19008
+19009
+19010
+19011
+19012
+19013
+19014
+19015
+19016
+19017
+19018
+19019
+19020
+19021
+19022
+19023
+19024
+19025
+19026
+19027
+19028
+19029
+19030
+19031
+19032
+19033
+19034
+19035
+19036
+19037
+19038
+19039
+19040
+19041
+19042
+19043
+19044
+19045
+19046
+19047
+19048
+19049
+19050
+19051
+19052
+19053
+19054
+19055
+19056
+19057
+19058
+19059
+19060
+19061
+19062
+19063
+19064
+19065
+19066
+19067
+19068
+19069
+19070
+19071
+19072
+19073
+19074
+19075
+19076
+19077
+19078
+19079
+19080
+19081
+19082
+19083
+19084
+19085
+19086
+19087
+19088
+19089
+19090
+19091
+19092
+19093
+19094
+19095
+19096
+19097
+19098
+19099
+19100
+19101
+19102
+19103
+19104
+19105
+19106
+19107
+19108
+19109
+19110
+19111
+19112
+19113
+19114
+19115
+19116
+19117
+19118
+19119
+19120
+19121
+19122
+19123
+19124
+19125
+19126
+19127
+19128
+19129
+19130
+19131
+19132
+19133
+19134
+19135
+19136
+19137
+19138
+19139
+19140
+19141
+19142
+19143
+19144
+19145
+19146
+19147
+19148
+19149
+19150
+19151
+19152
+19153
+19154
+19155
+19156
+19157
+19158
+19159
+19160
+19161
+19162
+19163
+19164
+19165
+19166
+19167
+19168
+19169
+19170
+19171
+19172
+19173
+19174
+19175
+19176
+19177
+19178
+19179
+19180
+19181
+19182
+19183
+19184
+19185
+19186
+19187
+19188
+19189
+19190
+19191
+19192
+19193
+19194
+19195
+19196
+19197
+19198
+19199
+19200
+19201
+19202
+19203
+19204
+19205
+19206
+19207
+19208
+19209
+19210
+19211
+19212
+19213
+19214
+19215
+19216
+19217
+19218
+19219
+19220
+19221
+19222
+19223
+19224
+19225
+19226
+19227
+19228
+19229
+19230
+19231
+19232
+19233
+19234
+19235
+19236
+19237
+19238
+19239
+19240
+19241
+19242
+19243
+19244
+19245
+19246
+19247
+19248
+19249
+19250
+19251
+19252
+19253
+19254
+19255
+19256
+19257
+19258
+19259
+19260
+19261
+19262
+19263
+19264
+19265
+19266
+19267
+19268
+19269
+19270
+19271
+19272
+19273
+19274
+19275
+19276
+19277
+19278
+19279
+19280
+19281
+19282
+19283
+19284
+19285
+19286
+19287
+19288
+19289
+19290
+19291
+19292
+19293
+19294
+19295
+19296
+19297
+19298
+19299
+19300
+19301
+19302
+19303
+19304
+19305
+19306
+19307
+19308
+19309
+19310
+19311
+19312
+19313
+19314
+19315
+19316
+19317
+19318
+19319
+19320
+19321
+19322
+19323
+19324
+19325
+19326
+19327
+19328
+19329
+19330
+19331
+19332
+19333
+19334
+19335
+19336
+19337
+19338
+19339
+19340
+19341
+19342
+19343
+19344
+19345
+19346
+19347
+19348
+19349
+19350
+19351
+19352
+19353
+19354
+19355
+19356
+19357
+19358
+19359
+19360
+19361
+19362
+19363
+19364
+19365
+19366
+19367
+19368
+19369
+19370
+19371
+19372
+19373
+19374
+19375
+19376
+19377
+19378
+19379
+19380
+19381
+19382
+19383
+19384
+19385
+19386
+19387
+19388
+19389
+19390
+19391
+19392
+19393
+19394
+19395
+19396
+19397
+19398
+19399
+19400
+19401
+19402
+19403
+19404
+19405
+19406
+19407
+19408
+19409
+19410
+19411
+19412
+19413
+19414
+19415
+19416
+19417
+19418
+19419
+19420
+19421
+19422
+19423
+19424
+19425
+19426
+19427
+19428
+19429
+19430
+19431
+19432
+19433
+19434
+19435
+19436
+19437
+19438
+19439
+19440
+19441
+19442
+19443
+19444
+19445
+19446
+19447
+19448
+19449
+19450
+19451
+19452
+19453
+19454
+19455
+19456
+19457
+19458
+19459
+19460
+19461
+19462
+19463
+19464
+19465
+19466
+19467
+19468
+19469
+19470
+19471
+19472
+19473
+19474
+19475
+19476
+19477
+19478
+19479
+19480
+19481
+19482
+19483
+19484
+19485
+19486
+19487
+19488
+19489
+19490
+19491
+19492
+19493
+19494
+19495
+19496
+19497
+19498
+19499
+19500
+19501
+19502
+19503
+19504
+19505
+19506
+19507
+19508
+19509
+19510
+19511
+19512
+19513
+19514
+19515
+19516
+19517
+19518
+19519
+19520
+19521
+19522
+19523
+19524
+19525
+19526
+19527
+19528
+19529
+19530
+19531
+19532
+19533
+19534
+19535
+19536
+19537
+19538
+19539
+19540
+19541
+19542
+19543
+19544
+19545
+19546
+19547
+19548
+19549
+19550
+19551
+19552
+19553
+19554
+19555
+19556
+19557
+19558
+19559
+19560
+19561
+19562
+19563
+19564
+19565
+19566
+19567
+19568
+19569
+19570
+19571
+19572
+19573
+19574
+19575
+19576
+19577
+19578
+19579
+19580
+19581
+19582
+19583
+19584
+19585
+19586
+19587
+19588
+19589
+19590
+19591
+19592
+19593
+19594
+19595
+19596
+19597
+19598
+19599
+19600
+19601
+19602
+19603
+19604
+19605
+19606
+19607
+19608
+19609
+19610
+19611
+19612
+19613
+19614
+19615
+19616
+19617
+19618
+19619
+19620
+19621
+19622
+19623
+19624
+19625
+19626
+19627
+19628
+19629
+19630
+19631
+19632
+19633
+19634
+19635
+19636
+19637
+19638
+19639
+19640
+19641
+19642
+19643
+19644
+19645
+19646
+19647
+19648
+19649
+19650
+19651
+19652
+19653
+19654
+19655
+19656
+19657
+19658
+19659
+19660
+19661
+19662
+19663
+19664
+19665
+19666
+19667
+19668
+19669
+19670
+19671
+19672
+19673
+19674
+19675
+19676
+19677
+19678
+19679
+19680
+19681
+19682
+19683
+19684
+19685
+19686
+19687
+19688
+19689
+19690
+19691
+19692
+19693
+19694
+19695
+19696
+19697
+19698
+19699
+19700
+19701
+19702
+19703
+19704
+19705
+19706
+19707
+19708
+19709
+19710
+19711
+19712
+19713
+19714
+19715
+19716
+19717
+19718
+19719
+19720
+19721
+19722
+19723
+19724
+19725
+19726
+19727
+19728
+19729
+19730
+19731
+19732
+19733
+19734
+19735
+19736
+19737
+19738
+19739
+19740
+19741
+19742
+19743
+19744
+19745
+19746
+19747
+19748
+19749
+19750
+19751
+19752
+19753
+19754
+19755
+19756
+19757
+19758
+19759
+19760
+19761
+19762
+19763
+19764
+19765
+19766
+19767
+19768
+19769
+19770
+19771
+19772
+19773
+19774
+19775
+19776
+19777
+19778
+19779
+19780
+19781
+19782
+19783
+19784
+19785
+19786
+19787
+19788
+19789
+19790
+19791
+19792
+19793
+19794
+19795
+19796
+19797
+19798
+19799
+19800
+19801
+19802
+19803
+19804
+19805
+19806
+19807
+19808
+19809
+19810
+19811
+19812
+19813
+19814
+19815
+19816
+19817
+19818
+19819
+19820
+19821
+19822
+19823
+19824
+19825
+19826
+19827
+19828
+19829
+19830
+19831
+19832
+19833
+19834
+19835
+19836
+19837
+19838
+19839
+19840
+19841
+19842
+19843
+19844
+19845
+19846
+19847
+19848
+19849
+19850
+19851
+19852
+19853
+19854
+19855
+19856
+19857
+19858
+19859
+19860
+19861
+19862
+19863
+19864
+19865
+19866
+19867
+19868
+19869
+19870
+19871
+19872
+19873
+19874
+19875
+19876
+19877
+19878
+19879
+19880
+19881
+19882
+19883
+19884
+19885
+19886
+19887
+19888
+19889
+19890
+19891
+19892
+19893
+19894
+19895
+19896
+19897
+19898
+19899
+19900
+19901
+19902
+19903
+19904
+19905
+19906
+19907
+19908
+19909
+19910
+19911
+19912
+19913
+19914
+19915
+19916
+19917
+19918
+19919
+19920
+19921
+19922
+19923
+19924
+19925
+19926
+19927
+19928
+19929
+19930
+19931
+19932
+19933
+19934
+19935
+19936
+19937
+19938
+19939
+19940
+19941
+19942
+19943
+19944
+19945
+19946
+19947
+19948
+19949
+19950
+19951
+19952
+19953
+19954
+19955
+19956
+19957
+19958
+19959
+19960
+19961
+19962
+19963
+19964
+19965
+19966
+19967
+19968
+19969
+19970
+19971
+19972
+19973
+19974
+19975
+19976
+19977
+19978
+19979
+19980
+19981
+19982
+19983
+19984
+19985
+19986
+19987
+19988
+19989
+19990
+19991
+19992
+19993
+19994
+19995
+19996
+19997
+19998
+19999
+20000
+20001
+20002
+20003
+20004
+20005
+20006
+20007
+20008
+20009
+20010
+20011
+20012
+20013
+20014
+20015
+20016
+20017
+20018
+20019
+20020
+20021
+20022
+20023
+20024
+20025
+20026
+20027
+20028
+20029
+20030
+20031
+20032
+20033
+20034
+20035
+20036
+20037
+20038
+20039
+20040
+20041
+20042
+20043
+20044
+20045
+20046
+20047
+20048
+20049
+20050
+20051
+20052
+20053
+20054
+20055
+20056
+20057
+20058
+20059
+20060
+20061
+20062
+20063
+20064
+20065
+20066
+20067
+20068
+20069
+20070
+20071
+20072
+20073
+20074
+20075
+20076
+20077
+20078
+20079
+20080
+20081
+20082
+20083
+20084
+20085
+20086
+20087
+20088
+20089
+20090
+20091
+20092
+20093
+20094
+20095
+20096
+20097
+20098
+20099
+20100
+20101
+20102
+20103
+20104
+20105
+20106
+20107
+20108
+20109
+20110
+20111
+20112
+20113
+20114
+20115
+20116
+20117
+20118
+20119
+20120
+20121
+20122
+20123
+20124
+20125
+20126
+20127
+20128
+20129
+20130
+20131
+20132
+20133
+20134
+20135
+20136
+20137
+20138
+20139
+20140
+20141
+20142
+20143
+20144
+20145
+20146
+20147
+20148
+20149
+20150
+20151
+20152
+20153
+20154
+20155
+20156
+20157
+20158
+20159
+20160
+20161
+20162
+20163
+20164
+20165
+20166
+20167
+20168
+20169
+20170
+20171
+20172
+20173
+20174
+20175
+20176
+20177
+20178
+20179
+20180
+20181
+20182
+20183
+20184
+20185
+20186
+20187
+20188
+20189
+20190
+20191
+20192
+20193
+20194
+20195
+20196
+20197
+20198
+20199
+20200
+20201
+20202
+20203
+20204
+20205
+20206
+20207
+20208
+20209
+20210
+20211
+20212
+20213
+20214
+20215
+20216
+20217
+20218
+20219
+20220
+20221
+20222
+20223
+20224
+20225
+20226
+20227
+20228
+20229
+20230
+20231
+20232
+20233
+20234
+20235
+20236
+20237
+20238
+20239
+20240
+20241
+20242
+20243
+20244
+20245
+20246
+20247
+20248
+20249
+20250
+20251
+20252
+20253
+20254
+20255
+20256
+20257
+20258
+20259
+20260
+20261
+20262
+20263
+20264
+20265
+20266
+20267
+20268
+20269
+20270
+20271
+20272
+20273
+20274
+20275
+20276
+20277
+20278
+20279
+20280
+20281
+20282
+20283
+20284
+20285
+20286
+20287
+20288
+20289
+20290
+20291
+20292
+20293
+20294
+20295
+20296
+20297
+20298
+20299
+20300
+20301
+20302
+20303
+20304
+20305
+20306
+20307
+20308
+20309
+20310
+20311
+20312
+20313
+20314
+20315
+20316
+20317
+20318
+20319
+20320
+20321
+20322
+20323
+20324
+20325
+20326
+20327
+20328
+20329
+20330
+20331
+20332
+20333
+20334
+20335
+20336
+20337
+20338
+20339
+20340
+20341
+20342
+20343
+20344
+20345
+20346
+20347
+20348
+20349
+20350
+20351
+20352
+20353
+20354
+20355
+20356
+20357
+20358
+20359
+20360
+20361
+20362
+20363
+20364
+20365
+20366
+20367
+20368
+20369
+20370
+20371
+20372
+20373
+20374
+20375
+20376
+20377
+20378
+20379
+20380
+20381
+20382
+20383
+20384
+20385
+20386
+20387
+20388
+20389
+20390
+20391
+20392
+20393
+20394
+20395
+20396
+20397
+20398
+20399
+20400
+20401
+20402
+20403
+20404
+20405
+20406
+20407
+20408
+20409
+20410
+20411
+20412
+20413
+20414
+20415
+20416
+20417
+20418
+20419
+20420
+20421
+20422
+20423
+20424
+20425
+20426
+20427
+20428
+20429
+20430
+20431
+20432
+20433
+20434
+20435
+20436
+20437
+20438
+20439
+20440
+20441
+20442
+20443
+20444
+20445
+20446
+20447
+20448
+20449
+20450
+20451
+20452
+20453
+20454
+20455
+20456
+20457
+20458
+20459
+20460
+20461
+20462
+20463
+20464
+20465
+20466
+20467
+20468
+20469
+20470
+20471
+20472
+20473
+20474
+20475
+20476
+20477
+20478
+20479
+20480
+20481
+20482
+20483
+20484
+20485
+20486
+20487
+20488
+20489
+20490
+20491
+20492
+20493
+20494
+20495
+20496
+20497
+20498
+20499
+20500
+20501
+20502
+20503
+20504
+20505
+20506
+20507
+20508
+20509
+20510
+20511
+20512
+20513
+20514
+20515
+20516
+20517
+20518
+20519
+20520
+20521
+20522
+20523
+20524
+20525
+20526
+20527
+20528
+20529
+20530
+20531
+20532
+20533
+20534
+20535
+20536
+20537
+20538
+20539
+20540
+20541
+20542
+20543
+20544
+20545
+20546
+20547
+20548
+20549
+20550
+20551
+20552
+20553
+20554
+20555
+20556
+20557
+20558
+20559
+20560
+20561
+20562
+20563
+20564
+20565
+20566
+20567
+20568
+20569
+20570
+20571
+20572
+20573
+20574
+20575
+20576
+20577
+20578
+20579
+20580
+20581
+20582
+20583
+20584
+20585
+20586
+20587
+20588
+20589
+20590
+20591
+20592
+20593
+20594
+20595
+20596
+20597
+20598
+20599
+20600
+20601
+20602
+20603
+20604
+20605
+20606
+20607
+20608
+20609
+20610
+20611
+20612
+20613
+20614
+20615
+20616
+20617
+20618
+20619
+20620
+20621
+20622
+20623
+20624
+20625
+20626
+20627
+20628
+20629
+20630
+20631
+20632
+20633
+20634
+20635
+20636
+20637
+20638
+20639
+20640
+20641
+20642
+20643
+20644
+20645
+20646
+20647
+20648
+20649
+20650
+20651
+20652
+20653
+20654
+20655
+20656
+20657
+20658
+20659
+20660
+20661
+20662
+20663
+20664
+20665
+20666
+20667
+20668
+20669
+20670
+20671
+20672
+20673
+20674
+20675
+20676
+20677
+20678
+20679
+20680
+20681
+20682
+20683
+20684
+20685
+20686
+20687
+20688
+20689
+20690
+20691
+20692
+20693
+20694
+20695
+20696
+20697
+20698
+20699
+20700
+20701
+20702
+20703
+20704
+20705
+20706
+20707
+20708
+20709
+20710
+20711
+20712
+20713
+20714
+20715
+20716
+20717
+20718
+20719
+20720
+20721
+20722
+20723
+20724
+20725
+20726
+20727
+20728
+20729
+20730
+20731
+20732
+20733
+20734
+20735
+20736
+20737
+20738
+20739
+20740
+20741
+20742
+20743
+20744
+20745
+20746
+20747
+20748
+20749
+20750
+20751
+20752
+20753
+20754
+20755
+20756
+20757
+20758
+20759
+20760
+20761
+20762
+20763
+20764
+20765
+20766
+20767
+20768
+20769
+20770
+20771
+20772
+20773
+20774
+20775
+20776
+20777
+20778
+20779
+20780
+20781
+20782
+20783
+20784
+20785
+20786
+20787
+20788
+20789
+20790
+20791
+20792
+20793
+20794
+20795
+20796
+20797
+20798
+20799
+20800
+20801
+20802
+20803
+20804
+20805
+20806
+20807
+20808
+20809
+20810
+20811
+20812
+20813
+20814
+20815
+20816
+20817
+20818
+20819
+20820
+20821
+20822
+20823
+20824
+20825
+20826
+20827
+20828
+20829
+20830
+20831
+20832
+20833
+20834
+20835
+20836
+20837
+20838
+20839
+20840
+20841
+20842
+20843
+20844
+20845
+20846
+20847
+20848
+20849
+20850
+20851
+20852
+20853
+20854
+20855
+20856
+20857
+20858
+20859
+20860
+20861
+20862
+20863
+20864
+20865
+20866
+20867
+20868
+20869
+20870
+20871
+20872
+20873
+20874
+20875
+20876
+20877
+20878
+20879
+20880
+20881
+20882
+20883
+20884
+20885
+20886
+20887
+20888
+20889
+20890
+20891
+20892
+20893
+20894
+20895
+20896
+20897
+20898
+20899
+20900
+20901
+20902
+20903
+20904
+20905
+20906
+20907
+20908
+20909
+20910
+20911
+20912
+20913
+20914
+20915
+20916
+20917
+20918
+20919
+20920
+20921
+20922
+20923
+20924
+20925
+20926
+20927
+20928
+20929
+20930
+20931
+20932
+20933
+20934
+20935
+20936
+20937
+20938
+20939
+20940
+20941
+20942
+20943
+20944
+20945
+20946
+20947
+20948
+20949
+20950
+20951
+20952
+20953
+20954
+20955
+20956
+20957
+20958
+20959
+20960
+20961
+20962
+20963
+20964
+20965
+20966
+20967
+20968
+20969
+20970
+20971
+20972
+20973
+20974
+20975
+20976
+20977
+20978
+20979
+20980
+20981
+20982
+20983
+20984
+20985
+20986
+20987
+20988
+20989
+20990
+20991
+20992
+20993
+20994
+20995
+20996
+20997
+20998
+20999
+21000
+21001
+21002
+21003
+21004
+21005
+21006
+21007
+21008
+21009
+21010
+21011
+21012
+21013
+21014
+21015
+21016
+21017
+21018
+21019
+21020
+21021
+21022
+21023
+21024
+21025
+21026
+21027
+21028
+21029
+21030
+21031
+21032
+21033
+21034
+21035
+21036
+21037
+21038
+21039
+21040
+21041
+21042
+21043
+21044
+21045
+21046
+21047
+21048
+21049
+21050
+21051
+21052
+21053
+21054
+21055
+21056
+21057
+21058
+21059
+21060
+21061
+21062
+21063
+21064
+21065
+21066
+21067
+21068
+21069
+21070
+21071
+21072
+21073
+21074
+21075
+21076
+21077
+21078
+21079
+21080
+21081
+21082
+21083
+21084
+21085
+21086
+21087
+21088
+21089
+21090
+21091
+21092
+21093
+21094
+21095
+21096
+21097
+21098
+21099
+21100
+21101
+21102
+21103
+21104
+21105
+21106
+21107
+21108
+21109
+21110
+21111
+21112
+21113
+21114
+21115
+21116
+21117
+21118
+21119
+21120
+21121
+21122
+21123
+21124
+21125
+21126
+21127
+21128
+21129
+21130
+21131
+21132
+21133
+21134
+21135
+21136
+21137
+21138
+21139
+21140
+21141
+21142
+21143
+21144
+21145
+21146
+21147
+21148
+21149
+21150
+21151
+21152
+21153
+21154
+21155
+21156
+21157
+21158
+21159
+21160
+21161
+21162
+21163
+21164
+21165
+21166
+21167
+21168
+21169
+21170
+21171
+21172
+21173
+21174
+21175
+21176
+21177
+21178
+21179
+21180
+21181
+21182
+21183
+21184
+21185
+21186
+21187
+21188
+21189
+21190
+21191
+21192
+21193
+21194
+21195
+21196
+21197
+21198
+21199
+21200
+21201
+21202
+21203
+21204
+21205
+21206
+21207
+21208
+21209
+21210
+21211
+21212
+21213
+21214
+21215
+21216
+21217
+21218
+21219
+21220
+21221
+21222
+21223
+21224
+21225
+21226
+21227
+21228
+21229
+21230
+21231
+21232
+21233
+21234
+21235
+21236
+21237
+21238
+21239
+21240
+21241
+21242
+21243
+21244
+21245
+21246
+21247
+21248
+21249
+21250
+21251
+21252
+21253
+21254
+21255
+21256
+21257
+21258
+21259
+21260
+21261
+21262
+21263
+21264
+21265
+21266
+21267
+21268
+21269
+21270
+21271
+21272
+21273
+21274
+21275
+21276
+21277
+21278
+21279
+21280
+21281
+21282
+21283
+21284
+21285
+21286
+21287
+21288
+21289
+21290
+21291
+21292
+21293
+21294
+21295
+21296
+21297
+21298
+21299
+21300
+21301
+21302
+21303
+21304
+21305
+21306
+21307
+21308
+21309
+21310
+21311
+21312
+21313
+21314
+21315
+21316
+21317
+21318
+21319
+21320
+21321
+21322
+21323
+21324
+21325
+21326
+21327
+21328
+21329
+21330
+21331
+21332
+21333
+21334
+21335
+21336
+21337
+21338
+21339
+21340
+21341
+21342
+21343
+21344
+21345
+21346
+21347
+21348
+21349
+21350
+21351
+21352
+21353
+21354
+21355
+21356
+21357
+21358
+21359
+21360
+21361
+21362
+21363
+21364
+21365
+21366
+21367
+21368
+21369
+21370
+21371
+21372
+21373
+21374
+21375
+21376
+21377
+21378
+21379
+21380
+21381
+21382
+21383
+21384
+21385
+21386
+21387
+21388
+21389
+21390
+21391
+21392
+21393
+21394
+21395
+21396
+21397
+21398
+21399
+21400
+21401
+21402
+21403
+21404
+21405
+21406
+21407
+21408
+21409
+21410
+21411
+21412
+21413
+21414
+21415
+21416
+21417
+21418
+21419
+21420
+21421
+21422
+21423
+21424
+21425
+21426
+21427
+21428
+21429
+21430
+21431
+21432
+21433
+21434
+21435
+21436
+21437
+21438
+21439
+21440
+21441
+21442
+21443
+21444
+21445
+21446
+21447
+21448
+21449
+21450
+21451
+21452
+21453
+21454
+21455
+21456
+21457
+21458
+21459
+21460
+21461
+21462
+21463
+21464
+21465
+21466
+21467
+21468
+21469
+21470
+21471
+21472
+21473
+21474
+21475
+21476
+21477
+21478
+21479
+21480
+21481
+21482
+21483
+21484
+21485
+21486
+21487
+21488
+21489
+21490
+21491
+21492
+21493
+21494
+21495
+21496
+21497
+21498
+21499
+21500
+21501
+21502
+21503
+21504
+21505
+21506
+21507
+21508
+21509
+21510
+21511
+21512
+21513
+21514
+21515
+21516
+21517
+21518
+21519
+21520
+21521
+21522
+21523
+21524
+21525
+21526
+21527
+21528
+21529
+21530
+21531
+21532
+21533
+21534
+21535
+21536
+21537
+21538
+21539
+21540
+21541
+21542
+21543
+21544
+21545
+21546
+21547
+21548
+21549
+21550
+21551
+21552
+21553
+21554
+21555
+21556
+21557
+21558
+21559
+21560
+21561
+21562
+21563
+21564
+21565
+21566
+21567
+21568
+21569
+21570
+21571
+21572
+21573
+21574
+21575
+21576
+21577
+21578
+21579
+21580
+21581
+21582
+21583
+21584
+21585
+21586
+21587
+21588
+21589
+21590
+21591
+21592
+21593
+21594
+21595
+21596
+21597
+21598
+21599
+21600
+21601
+21602
+21603
+21604
+21605
+21606
+21607
+21608
+21609
+21610
+21611
+21612
+21613
+21614
+21615
+21616
+21617
+21618
+21619
+21620
+21621
+21622
+21623
+21624
+21625
+21626
+21627
+21628
+21629
+21630
+21631
+21632
+21633
+21634
+21635
+21636
+21637
+21638
+21639
+21640
+21641
+21642
+21643
+21644
+21645
+21646
+21647
+21648
+21649
+21650
+21651
+21652
+21653
+21654
+21655
+21656
+21657
+21658
+21659
+21660
+21661
+21662
+21663
+21664
+21665
+21666
+21667
+21668
+21669
+21670
+21671
+21672
+21673
+21674
+21675
+21676
+21677
+21678
+21679
+21680
+21681
+21682
+21683
+21684
+21685
+21686
+21687
+21688
+21689
+21690
+21691
+21692
+21693
+21694
+21695
+21696
+21697
+21698
+21699
+21700
+21701
+21702
+21703
+21704
+21705
+21706
+21707
+21708
+21709
+21710
+21711
+21712
+21713
+21714
+21715
+21716
+21717
+21718
+21719
+21720
+21721
+21722
+21723
+21724
+21725
+21726
+21727
+21728
+21729
+21730
+21731
+21732
+21733
+21734
+21735
+21736
+21737
+21738
+21739
+21740
+21741
+21742
+21743
+21744
+21745
+21746
+21747
+21748
+21749
+21750
+21751
+21752
+21753
+21754
+21755
+21756
+21757
+21758
+21759
+21760
+21761
+21762
+21763
+21764
+21765
+21766
+21767
+21768
+21769
+21770
+21771
+21772
+21773
+21774
+21775
+21776
+21777
+21778
+21779
+21780
+21781
+21782
+21783
+21784
+21785
+21786
+21787
+21788
+21789
+21790
+21791
+21792
+21793
+21794
+21795
+21796
+21797
+21798
+21799
+21800
+21801
+21802
+21803
+21804
+21805
+21806
+21807
+21808
+21809
+21810
+21811
+21812
+21813
+21814
+21815
+21816
+21817
+21818
+21819
+21820
+21821
+21822
+21823
+21824
+21825
+21826
+21827
+21828
+21829
+21830
+21831
+21832
+21833
+21834
+21835
+21836
+21837
+21838
+21839
+21840
+21841
+21842
+21843
+21844
+21845
+21846
+21847
+21848
+21849
+21850
+21851
+21852
+21853
+21854
+21855
+21856
+21857
+21858
+21859
+21860
+21861
+21862
+21863
+21864
+21865
+21866
+21867
+21868
+21869
+21870
+21871
+21872
+21873
+21874
+21875
+21876
+21877
+21878
+21879
+21880
+21881
+21882
+21883
+21884
+21885
+21886
+21887
+21888
+21889
+21890
+21891
+21892
+21893
+21894
+21895
+21896
+21897
+21898
+21899
+21900
+21901
+21902
+21903
+21904
+21905
+21906
+21907
+21908
+21909
+21910
+21911
+21912
+21913
+21914
+21915
+21916
+21917
+21918
+21919
+21920
+21921
+21922
+21923
+21924
+21925
+21926
+21927
+21928
+21929
+21930
+21931
+21932
+21933
+21934
+21935
+21936
+21937
+21938
+21939
+21940
+21941
+21942
+21943
+21944
+21945
+21946
+21947
+21948
+21949
+21950
+21951
+21952
+21953
+21954
+21955
+21956
+21957
+21958
+21959
+21960
+21961
+21962
+21963
+21964
+21965
+21966
+21967
+21968
+21969
+21970
+21971
+21972
+21973
+21974
+21975
+21976
+21977
+21978
+21979
+21980
+21981
+21982
+21983
+21984
+21985
+21986
+21987
+21988
+21989
+21990
+21991
+21992
+21993
+21994
+21995
+21996
+21997
+21998
+21999
+22000
+22001
+22002
+22003
+22004
+22005
+22006
+22007
+22008
+22009
+22010
+22011
+22012
+22013
+22014
+22015
+22016
+22017
+22018
+22019
+22020
+22021
+22022
+22023
+22024
+22025
+22026
+22027
+22028
+22029
+22030
+22031
+22032
+22033
+22034
+22035
+22036
+22037
+22038
+22039
+22040
+22041
+22042
+22043
+22044
+22045
+22046
+22047
+22048
+22049
+22050
+22051
+22052
+22053
+22054
+22055
+22056
+22057
+22058
+22059
+22060
+22061
+22062
+22063
+22064
+22065
+22066
+22067
+22068
+22069
+22070
+22071
+22072
+22073
+22074
+22075
+22076
+22077
+22078
+22079
+22080
+22081
+22082
+22083
+22084
+22085
+22086
+22087
+22088
+22089
+22090
+22091
+22092
+22093
+22094
+22095
+22096
+22097
+22098
+22099
+22100
+22101
+22102
+22103
+22104
+22105
+22106
+22107
+22108
+22109
+22110
+22111
+22112
+22113
+22114
+22115
+22116
+22117
+22118
+22119
+22120
+22121
+22122
+22123
+22124
+22125
+22126
+22127
+22128
+22129
+22130
+22131
+22132
+22133
+22134
+22135
+22136
+22137
+22138
+22139
+22140
+22141
+22142
+22143
+22144
+22145
+22146
+22147
+22148
+22149
+22150
+22151
+22152
+22153
+22154
+22155
+22156
+22157
+22158
+22159
+22160
+22161
+22162
+22163
+22164
+22165
+22166
+22167
+22168
+22169
+22170
+22171
+22172
+22173
+22174
+22175
+22176
+22177
+22178
+22179
+22180
+22181
+22182
+22183
+22184
+22185
+22186
+22187
+22188
+22189
+22190
+22191
+22192
+22193
+22194
+22195
+22196
+22197
+22198
+22199
+22200
+22201
+22202
+22203
+22204
+22205
+22206
+22207
+22208
+22209
+22210
+22211
+22212
+22213
+22214
+22215
+22216
+22217
+22218
+22219
+22220
+22221
+22222
+22223
+22224
+22225
+22226
+22227
+22228
+22229
+22230
+22231
+22232
+22233
+22234
+22235
+22236
+22237
+22238
+22239
+22240
+22241
+22242
+22243
+22244
+22245
+22246
+22247
+22248
+22249
+22250
+22251
+22252
+22253
+22254
+22255
+22256
+22257
+22258
+22259
+22260
+22261
+22262
+22263
+22264
+22265
+22266
+22267
+22268
+22269
+22270
+22271
+22272
+22273
+22274
+22275
+22276
+22277
+22278
+22279
+22280
+22281
+22282
+22283
+22284
+22285
+22286
+22287
+22288
+22289
+22290
+22291
+22292
+22293
+22294
+22295
+22296
+22297
+22298
+22299
+22300
+22301
+22302
+22303
+22304
+22305
+22306
+22307
+22308
+22309
+22310
+22311
+22312
+22313
+22314
+22315
+22316
+22317
+22318
+22319
+22320
+22321
+22322
+22323
+22324
+22325
+22326
+22327
+22328
+22329
+22330
+22331
+22332
+22333
+22334
+22335
+22336
+22337
+22338
+22339
+22340
+22341
+22342
+22343
+22344
+22345
+22346
+22347
+22348
+22349
+22350
+22351
+22352
+22353
+22354
+22355
+22356
+22357
+22358
+22359
+22360
+22361
+22362
+22363
+22364
+22365
+22366
+22367
+22368
+22369
+22370
+22371
+22372
+22373
+22374
+22375
+22376
+22377
+22378
+22379
+22380
+22381
+22382
+22383
+22384
+22385
+22386
+22387
+22388
+22389
+22390
+22391
+22392
+22393
+22394
+22395
+22396
+22397
+22398
+22399
+22400
+22401
+22402
+22403
+22404
+22405
+22406
+22407
+22408
+22409
+22410
+22411
+22412
+22413
+22414
+22415
+22416
+22417
+22418
+22419
+22420
+22421
+22422
+22423
+22424
+22425
+22426
+22427
+22428
+22429
+22430
+22431
+22432
+22433
+22434
+22435
+22436
+22437
+22438
+22439
+22440
+22441
+22442
+22443
+22444
+22445
+22446
+22447
+22448
+22449
+22450
+22451
+22452
+22453
+22454
+22455
+22456
+22457
+22458
+22459
+22460
+22461
+22462
+22463
+22464
+22465
+22466
+22467
+22468
+22469
+22470
+22471
+22472
+22473
+22474
+22475
+22476
+22477
+22478
+22479
+22480
+22481
+22482
+22483
+22484
+22485
+22486
+22487
+22488
+22489
+22490
+22491
+22492
+22493
+22494
+22495
+22496
+22497
+22498
+22499
+22500
+22501
+22502
+22503
+22504
+22505
+22506
+22507
+22508
+22509
+22510
+22511
+22512
+22513
+22514
+22515
+22516
+22517
+22518
+22519
+22520
+22521
+22522
+22523
+22524
+22525
+22526
+22527
+22528
+22529
+22530
+22531
+22532
+22533
+22534
+22535
+22536
+22537
+22538
+22539
+22540
+22541
+22542
+22543
+22544
+22545
+22546
+22547
+22548
+22549
+22550
+22551
+22552
+22553
+22554
+22555
+22556
+22557
+22558
+22559
+22560
+22561
+22562
+22563
+22564
+22565
+22566
+22567
+22568
+22569
+22570
+22571
+22572
+22573
+22574
+22575
+22576
+22577
+22578
+22579
+22580
+22581
+22582
+22583
+22584
+22585
+22586
+22587
+22588
+22589
+22590
+22591
+22592
+22593
+22594
+22595
+22596
+22597
+22598
+22599
+22600
+22601
+22602
+22603
+22604
+22605
+22606
+22607
+22608
+22609
+22610
+22611
+22612
+22613
+22614
+22615
+22616
+22617
+22618
+22619
+22620
+22621
+22622
+22623
+22624
+22625
+22626
+22627
+22628
+22629
+22630
+22631
+22632
+22633
+22634
+22635
+22636
+22637
+22638
+22639
+22640
+22641
+22642
+22643
+22644
+22645
+22646
+22647
+22648
+22649
+22650
+22651
+22652
+22653
+22654
+22655
+22656
+22657
+22658
+22659
+22660
+22661
+22662
+22663
+22664
+22665
+22666
+22667
+22668
+22669
+22670
+22671
+22672
+22673
+22674
+22675
+22676
+22677
+22678
+22679
+22680
+22681
+22682
+22683
+22684
+22685
+22686
+22687
+22688
+22689
+22690
+22691
+22692
+22693
+22694
+22695
+22696
+22697
+22698
+22699
+22700
+22701
+22702
+22703
+22704
+22705
+22706
+22707
+22708
+22709
+22710
+22711
+22712
+22713
+22714
+22715
+22716
+22717
+22718
+22719
+22720
+22721
+22722
+22723
+22724
+22725
+22726
+22727
+22728
+22729
+22730
+22731
+22732
+22733
+22734
+22735
+22736
+22737
+22738
+22739
+22740
+22741
+22742
+22743
+22744
+22745
+22746
+22747
+22748
+22749
+22750
+22751
+22752
+22753
+22754
+22755
+22756
+22757
+22758
+22759
+22760
+22761
+22762
+22763
+22764
+22765
+22766
+22767
+22768
+22769
+22770
+22771
+22772
+22773
+22774
+22775
+22776
+22777
+22778
+22779
+22780
+22781
+22782
+22783
+22784
+22785
+22786
+22787
+22788
+22789
+22790
+22791
+22792
+22793
+22794
+22795
+22796
+22797
+22798
+22799
+22800
+22801
+22802
+22803
+22804
+22805
+22806
+22807
+22808
+22809
+22810
+22811
+22812
+22813
+22814
+22815
+22816
+22817
+22818
+22819
+22820
+22821
+22822
+22823
+22824
+22825
+22826
+22827
+22828
+22829
+22830
+22831
+22832
+22833
+22834
+22835
+22836
+22837
+22838
+22839
+22840
+22841
+22842
+22843
+22844
+22845
+22846
+22847
+22848
+22849
+22850
+22851
+22852
+22853
+22854
+22855
+22856
+22857
+22858
+22859
+22860
+22861
+22862
+22863
+22864
+22865
+22866
+22867
+22868
+22869
+22870
+22871
+22872
+22873
+22874
+22875
+22876
+22877
+22878
+22879
+22880
+22881
+22882
+22883
+22884
+22885
+22886
+22887
+22888
+22889
+22890
+22891
+22892
+22893
+22894
+22895
+22896
+22897
+22898
+22899
+22900
+22901
+22902
+22903
+22904
+22905
+22906
+22907
+22908
+22909
+22910
+22911
+22912
+22913
+22914
+22915
+22916
+22917
+22918
+22919
+22920
+22921
+22922
+22923
+22924
+22925
+22926
+22927
+22928
+22929
+22930
+22931
+22932
+22933
+22934
+22935
+22936
+22937
+22938
+22939
+22940
+22941
+22942
+22943
+22944
+22945
+22946
+22947
+22948
+22949
+22950
+22951
+22952
+22953
+22954
+22955
+22956
+22957
+22958
+22959
+22960
+22961
+22962
+22963
+22964
+22965
+22966
+22967
+22968
+22969
+22970
+22971
+22972
+22973
+22974
+22975
+22976
+22977
+22978
+22979
+22980
+22981
+22982
+22983
+22984
+22985
+22986
+22987
+22988
+22989
+22990
+22991
+22992
+22993
+22994
+22995
+22996
+22997
+22998
+22999
+23000
+23001
+23002
+23003
+23004
+23005
+23006
+23007
+23008
+23009
+23010
+23011
+23012
+23013
+23014
+23015
+23016
+23017
+23018
+23019
+23020
+23021
+23022
+23023
+23024
+23025
+23026
+23027
+23028
+23029
+23030
+23031
+23032
+23033
+23034
+23035
+23036
+23037
+23038
+23039
+23040
+23041
+23042
+23043
+23044
+23045
+23046
+23047
+23048
+23049
+23050
+23051
+23052
+23053
+23054
+23055
+23056
+23057
+23058
+23059
+23060
+23061
+23062
+23063
+23064
+23065
+23066
+23067
+23068
+23069
+23070
+23071
+23072
+23073
+23074
+23075
+23076
+23077
+23078
+23079
+23080
+23081
+23082
+23083
+23084
+23085
+23086
+23087
+23088
+23089
+23090
+23091
+23092
+23093
+23094
+23095
+23096
+23097
+23098
+23099
+23100
+23101
+23102
+23103
+23104
+23105
+23106
+23107
+23108
+23109
+23110
+23111
+23112
+23113
+23114
+23115
+23116
+23117
+23118
+23119
+23120
+23121
+23122
+23123
+23124
+23125
+23126
+23127
+23128
+23129
+23130
+23131
+23132
+23133
+23134
+23135
+23136
+23137
+23138
+23139
+23140
+23141
+23142
+23143
+23144
+23145
+23146
+23147
+23148
+23149
+23150
+23151
+23152
+23153
+23154
+23155
+23156
+23157
+23158
+23159
+23160
+23161
+23162
+23163
+23164
+23165
+23166
+23167
+23168
+23169
+23170
+23171
+23172
+23173
+23174
+23175
+23176
+23177
+23178
+23179
+23180
+23181
+23182
+23183
+23184
+23185
+23186
+23187
+23188
+23189
+23190
+23191
+23192
+23193
+23194
+23195
+23196
+23197
+23198
+23199
+23200
+23201
+23202
+23203
+23204
+23205
+23206
+23207
+23208
+23209
+23210
+23211
+23212
+23213
+23214
+23215
+23216
+23217
+23218
+23219
+23220
+23221
+23222
+23223
+23224
+23225
+23226
+23227
+23228
+23229
+23230
+23231
+23232
+23233
+23234
+23235
+23236
+23237
+23238
+23239
+23240
+23241
+23242
+23243
+23244
+23245
+23246
+23247
+23248
+23249
+23250
+23251
+23252
+23253
+23254
+23255
+23256
+23257
+23258
+23259
+23260
+23261
+23262
+23263
+23264
+23265
+23266
+23267
+23268
+23269
+23270
+23271
+23272
+23273
+23274
+23275
+23276
+23277
+23278
+23279
+23280
+23281
+23282
+23283
+23284
+23285
+23286
+23287
+23288
+23289
+23290
+23291
+23292
+23293
+23294
+23295
+23296
+23297
+23298
+23299
+23300
+23301
+23302
+23303
+23304
+23305
+23306
+23307
+23308
+23309
+23310
+23311
+23312
+23313
+23314
+23315
+23316
+23317
+23318
+23319
+23320
+23321
+23322
+23323
+23324
+23325
+23326
+23327
+23328
+23329
+23330
+23331
+23332
+23333
+23334
+23335
+23336
+23337
+23338
+23339
+23340
+23341
+23342
+23343
+23344
+23345
+23346
+23347
+23348
+23349
+23350
+23351
+23352
+23353
+23354
+23355
+23356
+23357
+23358
+23359
+23360
+23361
+23362
+23363
+23364
+23365
+23366
+23367
+23368
+23369
+23370
+23371
+23372
+23373
+23374
+23375
+23376
+23377
+23378
+23379
+23380
+23381
+23382
+23383
+23384
+23385
+23386
+23387
+23388
+23389
+23390
+23391
+23392
+23393
+23394
+23395
+23396
+23397
+23398
+23399
+23400
+23401
+23402
+23403
+23404
+23405
+23406
+23407
+23408
+23409
+23410
+23411
+23412
+23413
+23414
+23415
+23416
+23417
+23418
+23419
+23420
+23421
+23422
+23423
+23424
+23425
+23426
+23427
+23428
+23429
+23430
+23431
+23432
+23433
+23434
+23435
+23436
+23437
+23438
+23439
+23440
+23441
+23442
+23443
+23444
+23445
+23446
+23447
+23448
+23449
+23450
+23451
+23452
+23453
+23454
+23455
+23456
+23457
+23458
+23459
+23460
+23461
+23462
+23463
+23464
+23465
+23466
+23467
+23468
+23469
+23470
+23471
+23472
+23473
+23474
+23475
+23476
+23477
+23478
+23479
+23480
+23481
+23482
+23483
+23484
+23485
+23486
+23487
+23488
+23489
+23490
+23491
+23492
+23493
+23494
+23495
+23496
+23497
+23498
+23499
+23500
+23501
+23502
+23503
+23504
+23505
+23506
+23507
+23508
+23509
+23510
+23511
+23512
+23513
+23514
+23515
+23516
+23517
+23518
+23519
+23520
+23521
+23522
+23523
+23524
+23525
+23526
+23527
+23528
+23529
+23530
+23531
+23532
+23533
+23534
+23535
+23536
+23537
+23538
+23539
+23540
+23541
+23542
+23543
+23544
+23545
+23546
+23547
+23548
+23549
+23550
+23551
+23552
+23553
+23554
+23555
+23556
+23557
+23558
+23559
+23560
+23561
+23562
+23563
+23564
+23565
+23566
+23567
+23568
+23569
+23570
+23571
+23572
+23573
+23574
+23575
+23576
+23577
+23578
+23579
+23580
+23581
+23582
+23583
+23584
+23585
+23586
+23587
+23588
+23589
+23590
+23591
+23592
+23593
+23594
+23595
+23596
+23597
+23598
+23599
+23600
+23601
+23602
+23603
+23604
+23605
+23606
+23607
+23608
+23609
+23610
+23611
+23612
+23613
+23614
+23615
+23616
+23617
+23618
+23619
+23620
+23621
+23622
+23623
+23624
+23625
+23626
+23627
+23628
+23629
+23630
+23631
+23632
+23633
+23634
+23635
+23636
+23637
+23638
+23639
+23640
+23641
+23642
+23643
+23644
+23645
+23646
+23647
+23648
+23649
+23650
+23651
+23652
+23653
+23654
+23655
+23656
+23657
+23658
+23659
+23660
+23661
+23662
+23663
+23664
+23665
+23666
+23667
+23668
+23669
+23670
+23671
+23672
+23673
+23674
+23675
+23676
+23677
+23678
+23679
+23680
+23681
+23682
+23683
+23684
+23685
+23686
+23687
+23688
+23689
+23690
+23691
+23692
+23693
+23694
+23695
+23696
+23697
+23698
+23699
+23700
+23701
+23702
+23703
+23704
+23705
+23706
+23707
+23708
+23709
+23710
+23711
+23712
+23713
+23714
+23715
+23716
+23717
+23718
+23719
+23720
+23721
+23722
+23723
+23724
+23725
+23726
+23727
+23728
+23729
+23730
+23731
+23732
+23733
+23734
+23735
+23736
+23737
+23738
+23739
+23740
+23741
+23742
+23743
+23744
+23745
+23746
+23747
+23748
+23749
+23750
+23751
+23752
+23753
+23754
+23755
+23756
+23757
+23758
+23759
+23760
+23761
+23762
+23763
+23764
+23765
+23766
+23767
+23768
+23769
+23770
+23771
+23772
+23773
+23774
+23775
+23776
+23777
+23778
+23779
+23780
+23781
+23782
+23783
+23784
+23785
+23786
+23787
+23788
+23789
+23790
+23791
+23792
+23793
+23794
+23795
+23796
+23797
+23798
+23799
+23800
+23801
+23802
+23803
+23804
+23805
+23806
+23807
+23808
+23809
+23810
+23811
+23812
+23813
+23814
+23815
+23816
+23817
+23818
+23819
+23820
+23821
+23822
+23823
+23824
+23825
+23826
+23827
+23828
+23829
+23830
+23831
+23832
+23833
+23834
+23835
+23836
+23837
+23838
+23839
+23840
+23841
+23842
+23843
+23844
+23845
+23846
+23847
+23848
+23849
+23850
+23851
+23852
+23853
+23854
+23855
+23856
+23857
+23858
+23859
+23860
+23861
+23862
+23863
+23864
+23865
+23866
+23867
+23868
+23869
+23870
+23871
+23872
+23873
+23874
+23875
+23876
+23877
+23878
+23879
+23880
+23881
+23882
+23883
+23884
+23885
+23886
+23887
+23888
+23889
+23890
+23891
+23892
+23893
+23894
+23895
+23896
+23897
+23898
+23899
+23900
+23901
+23902
+23903
+23904
+23905
+23906
+23907
+23908
+23909
+23910
+23911
+23912
+23913
+23914
+23915
+23916
+23917
+23918
+23919
+23920
+23921
+23922
+23923
+23924
+23925
+23926
+23927
+23928
+23929
+23930
+23931
+23932
+23933
+23934
+23935
+23936
+23937
+23938
+23939
+23940
+23941
+23942
+23943
+23944
+23945
+23946
+23947
+23948
+23949
+23950
+23951
+23952
+23953
+23954
+23955
+23956
+23957
+23958
+23959
+23960
+23961
+23962
+23963
+23964
+23965
+23966
+23967
+23968
+23969
+23970
+23971
+23972
+23973
+23974
+23975
+23976
+23977
+23978
+23979
+23980
+23981
+23982
+23983
+23984
+23985
+23986
+23987
+23988
+23989
+23990
+23991
+23992
+23993
+23994
+23995
+23996
+23997
+23998
+23999
+24000
+24001
+24002
+24003
+24004
+24005
+24006
+24007
+24008
+24009
+24010
+24011
+24012
+24013
+24014
+24015
+24016
+24017
+24018
+24019
+24020
+24021
+24022
+24023
+24024
+24025
+24026
+24027
+24028
+24029
+24030
+24031
+24032
+24033
+24034
+24035
+24036
+24037
+24038
+24039
+24040
+24041
+24042
+24043
+24044
+24045
+24046
+24047
+24048
+24049
+24050
+24051
+24052
+24053
+24054
+24055
+24056
+24057
+24058
+24059
+24060
+24061
+24062
+24063
+24064
+24065
+24066
+24067
+24068
+24069
+24070
+24071
+24072
+24073
+24074
+24075
+24076
+24077
+24078
+24079
+24080
+24081
+24082
+24083
+24084
+24085
+24086
+24087
+24088
+24089
+24090
+24091
+24092
+24093
+24094
+24095
+24096
+24097
+24098
+24099
+24100
+24101
+24102
+24103
+24104
+24105
+24106
+24107
+24108
+24109
+24110
+24111
+24112
+24113
+24114
+24115
+24116
+24117
+24118
+24119
+24120
+24121
+24122
+24123
+24124
+24125
+24126
+24127
+24128
+24129
+24130
+24131
+24132
+24133
+24134
+24135
+24136
+24137
+24138
+24139
+24140
+24141
+24142
+24143
+24144
+24145
+24146
+24147
+24148
+24149
+24150
+24151
+24152
+24153
+24154
+24155
+24156
+24157
+24158
+24159
+24160
+24161
+24162
+24163
+24164
+24165
+24166
+24167
+24168
+24169
+24170
+24171
+24172
+24173
+24174
+24175
+24176
+24177
+24178
+24179
+24180
+24181
+24182
+24183
+24184
+24185
+24186
+24187
+24188
+24189
+24190
+24191
+24192
+24193
+24194
+24195
+24196
+24197
+24198
+24199
+24200
+24201
+24202
+24203
+24204
+24205
+24206
+24207
+24208
+24209
+24210
+24211
+24212
+24213
+24214
+24215
+24216
+24217
+24218
+24219
+24220
+24221
+24222
+24223
+24224
+24225
+24226
+24227
+24228
+24229
+24230
+24231
+24232
+24233
+24234
+24235
+24236
+24237
+24238
+24239
+24240
+24241
+24242
+24243
+24244
+24245
+24246
+24247
+24248
+24249
+24250
+24251
+24252
+24253
+24254
+24255
+24256
+24257
+24258
+24259
+24260
+24261
+24262
+24263
+24264
+24265
+24266
+24267
+24268
+24269
+24270
+24271
+24272
+24273
+24274
+24275
+24276
+24277
+24278
+24279
+24280
+24281
+24282
+24283
+24284
+24285
+24286
+24287
+24288
+24289
+24290
+24291
+24292
+24293
+24294
+24295
+24296
+24297
+24298
+24299
+24300
+24301
+24302
+24303
+24304
+24305
+24306
+24307
+24308
+24309
+24310
+24311
+24312
+24313
+24314
+24315
+24316
+24317
+24318
+24319
+24320
+24321
+24322
+24323
+24324
+24325
+24326
+24327
+24328
+24329
+24330
+24331
+24332
+24333
+24334
+24335
+24336
+24337
+24338
+24339
+24340
+24341
+24342
+24343
+24344
+24345
+24346
+24347
+24348
+24349
+24350
+24351
+24352
+24353
+24354
+24355
+24356
+24357
+24358
+24359
+24360
+24361
+24362
+24363
+24364
+24365
+24366
+24367
+24368
+24369
+24370
+24371
+24372
+24373
+24374
+24375
+24376
+24377
+24378
+24379
+24380
+24381
+24382
+24383
+24384
+24385
+24386
+24387
+24388
+24389
+24390
+24391
+24392
+24393
+24394
+24395
+24396
+24397
+24398
+24399
+24400
+24401
+24402
+24403
+24404
+24405
+24406
+24407
+24408
+24409
+24410
+24411
+24412
+24413
+24414
+24415
+24416
+24417
+24418
+24419
+24420
+24421
+24422
+24423
+24424
+24425
+24426
+24427
+24428
+24429
+24430
+24431
+24432
+24433
+24434
+24435
+24436
+24437
+24438
+24439
+24440
+24441
+24442
+24443
+24444
+24445
+24446
+24447
+24448
+24449
+24450
+24451
+24452
+24453
+24454
+24455
+24456
+24457
+24458
+24459
+24460
+24461
+24462
+24463
+24464
+24465
+24466
+24467
+24468
+24469
+24470
+24471
+24472
+24473
+24474
+24475
+24476
+24477
+24478
+24479
+24480
+24481
+24482
+24483
+24484
+24485
+24486
+24487
+24488
+24489
+24490
+24491
+24492
+24493
+24494
+24495
+24496
+24497
+24498
+24499
+24500
+24501
+24502
+24503
+24504
+24505
+24506
+24507
+24508
+24509
+24510
+24511
+24512
+24513
+24514
+24515
+24516
+24517
+24518
+24519
+24520
+24521
+24522
+24523
+24524
+24525
+24526
+24527
+24528
+24529
+24530
+24531
+24532
+24533
+24534
+24535
+24536
+24537
+24538
+24539
+24540
+24541
+24542
+24543
+24544
+24545
+24546
+24547
+24548
+24549
+24550
+24551
+24552
+24553
+24554
+24555
+24556
+24557
+24558
+24559
+24560
+24561
+24562
+24563
+24564
+24565
+24566
+24567
+24568
+24569
+24570
+24571
+24572
+24573
+24574
+24575
+24576
+24577
+24578
+24579
+24580
+24581
+24582
+24583
+24584
+24585
+24586
+24587
+24588
+24589
+24590
+24591
+24592
+24593
+24594
+24595
+24596
+24597
+24598
+24599
+24600
+24601
+24602
+24603
+24604
+24605
+24606
+24607
+24608
+24609
+24610
+24611
+24612
+24613
+24614
+24615
+24616
+24617
+24618
+24619
+24620
+24621
+24622
+24623
+24624
+24625
+24626
+24627
+24628
+24629
+24630
+24631
+24632
+24633
+24634
+24635
+24636
+24637
+24638
+24639
+24640
+24641
+24642
+24643
+24644
+24645
+24646
+24647
+24648
+24649
+24650
+24651
+24652
+24653
+24654
+24655
+24656
+24657
+24658
+24659
+24660
+24661
+24662
+24663
+24664
+24665
+24666
+24667
+24668
+24669
+24670
+24671
+24672
+24673
+24674
+24675
+24676
+24677
+24678
+24679
+24680
+24681
+24682
+24683
+24684
+24685
+24686
+24687
+24688
+24689
+24690
+24691
+24692
+24693
+24694
+24695
+24696
+24697
+24698
+24699
+24700
+24701
+24702
+24703
+24704
+24705
+24706
+24707
+24708
+24709
+24710
+24711
+24712
+24713
+24714
+24715
+24716
+24717
+24718
+24719
+24720
+24721
+24722
+24723
+24724
+24725
+24726
+24727
+24728
+24729
+24730
+24731
+24732
+24733
+24734
+24735
+24736
+24737
+24738
+24739
+24740
+24741
+24742
+24743
+24744
+24745
+24746
+24747
+24748
+24749
+24750
+24751
+24752
+24753
+24754
+24755
+24756
+24757
+24758
+24759
+24760
+24761
+24762
+24763
+24764
+24765
+24766
+24767
+24768
+24769
+24770
+24771
+24772
+24773
+24774
+24775
+24776
+24777
+24778
+24779
+24780
+24781
+24782
+24783
+24784
+24785
+24786
+24787
+24788
+24789
+24790
+24791
+24792
+24793
+24794
+24795
+24796
+24797
+24798
+24799
+24800
+24801
+24802
+24803
+24804
+24805
+24806
+24807
+24808
+24809
+24810
+24811
+24812
+24813
+24814
+24815
+24816
+24817
+24818
+24819
+24820
+24821
+24822
+24823
+24824
+24825
+24826
+24827
+24828
+24829
+24830
+24831
+24832
+24833
+24834
+24835
+24836
+24837
+24838
+24839
+24840
+24841
+24842
+24843
+24844
+24845
+24846
+24847
+24848
+24849
+24850
+24851
+24852
+24853
+24854
+24855
+24856
+24857
+24858
+24859
+24860
+24861
+24862
+24863
+24864
+24865
+24866
+24867
+24868
+24869
+24870
+24871
+24872
+24873
+24874
+24875
+24876
+24877
+24878
+24879
+24880
+24881
+24882
+24883
+24884
+24885
+24886
+24887
+24888
+24889
+24890
+24891
+24892
+24893
+24894
+24895
+24896
+24897
+24898
+24899
+24900
+24901
+24902
+24903
+24904
+24905
+24906
+24907
+24908
+24909
+24910
+24911
+24912
+24913
+24914
+24915
+24916
+24917
+24918
+24919
+24920
+24921
+24922
+24923
+24924
+24925
+24926
+24927
+24928
+24929
+24930
+24931
+24932
+24933
+24934
+24935
+24936
+24937
+24938
+24939
+24940
+24941
+24942
+24943
+24944
+24945
+24946
+24947
+24948
+24949
+24950
+24951
+24952
+24953
+24954
+24955
+24956
+24957
+24958
+24959
+24960
+24961
+24962
+24963
+24964
+24965
+24966
+24967
+24968
+24969
+24970
+24971
+24972
+24973
+24974
+24975
+24976
+24977
+24978
+24979
+24980
+24981
+24982
+24983
+24984
+24985
+24986
+24987
+24988
+24989
+24990
+24991
+24992
+24993
+24994
+24995
+24996
+24997
+24998
+24999
+25000
+25001
+25002
+25003
+25004
+25005
+25006
+25007
+25008
+25009
+25010
+25011
+25012
+25013
+25014
+25015
+25016
+25017
+25018
+25019
+25020
+25021
+25022
+25023
+25024
+25025
+25026
+25027
+25028
+25029
+25030
+25031
+25032
+25033
+25034
+25035
+25036
+25037
+25038
+25039
+25040
+25041
+25042
+25043
+25044
+25045
+25046
+25047
+25048
+25049
+25050
+25051
+25052
+25053
+25054
+25055
+25056
+25057
+25058
+25059
+25060
+25061
+25062
+25063
+25064
+25065
+25066
+25067
+25068
+25069
+25070
+25071
+25072
+25073
+25074
+25075
+25076
+25077
+25078
+25079
+25080
+25081
+25082
+25083
+25084
+25085
+25086
+25087
+25088
+25089
+25090
+25091
+25092
+25093
+25094
+25095
+25096
+25097
+25098
+25099
+25100
+25101
+25102
+25103
+25104
+25105
+25106
+25107
+25108
+25109
+25110
+25111
+25112
+25113
+25114
+25115
+25116
+25117
+25118
+25119
+25120
+25121
+25122
+25123
+25124
+25125
+25126
+25127
+25128
+25129
+25130
+25131
+25132
+25133
+25134
+25135
+25136
+25137
+25138
+25139
+25140
+25141
+25142
+25143
+25144
+25145
+25146
+25147
+25148
+25149
+25150
+25151
+25152
+25153
+25154
+25155
+25156
+25157
+25158
+25159
+25160
+25161
+25162
+25163
+25164
+25165
+25166
+25167
+25168
+25169
+25170
+25171
+25172
+25173
+25174
+25175
+25176
+25177
+25178
+25179
+25180
+25181
+25182
+25183
+25184
+25185
+25186
+25187
+25188
+25189
+25190
+25191
+25192
+25193
+25194
+25195
+25196
+25197
+25198
+25199
+25200
+25201
+25202
+25203
+25204
+25205
+25206
+25207
+25208
+25209
+25210
+25211
+25212
+25213
+25214
+25215
+25216
+25217
+25218
+25219
+25220
+25221
+25222
+25223
+25224
+25225
+25226
+25227
+25228
+25229
+25230
+25231
+25232
+25233
+25234
+25235
+25236
+25237
+25238
+25239
+25240
+25241
+25242
+25243
+25244
+25245
+25246
+25247
+25248
+25249
+25250
+25251
+25252
+25253
+25254
+25255
+25256
+25257
+25258
+25259
+25260
+25261
+25262
+25263
+25264
+25265
+25266
+25267
+25268
+25269
+25270
+25271
+25272
+25273
+25274
+25275
+25276
+25277
+25278
+25279
+25280
+25281
+25282
+25283
+25284
+25285
+25286
+25287
+25288
+25289
+25290
+25291
+25292
+25293
+25294
+25295
+25296
+25297
+25298
+25299
+25300
+25301
+25302
+25303
+25304
+25305
+25306
+25307
+25308
+25309
+25310
+25311
+25312
+25313
+25314
+25315
+25316
+25317
+25318
+25319
+25320
+25321
+25322
+25323
+25324
+25325
+25326
+25327
+25328
+25329
+25330
+25331
+25332
+25333
+25334
+25335
+25336
+25337
+25338
+25339
+25340
+25341
+25342
+25343
+25344
+25345
+25346
+25347
+25348
+25349
+25350
+25351
+25352
+25353
+25354
+25355
+25356
+25357
+25358
+25359
+25360
+25361
+25362
+25363
+25364
+25365
+25366
+25367
+25368
+25369
+25370
+25371
+25372
+25373
+25374
+25375
+25376
+25377
+25378
+25379
+25380
+25381
+25382
+25383
+25384
+25385
+25386
+25387
+25388
+25389
+25390
+25391
+25392
+25393
+25394
+25395
+25396
+25397
+25398
+25399
+25400
+25401
+25402
+25403
+25404
+25405
+25406
+25407
+25408
+25409
+25410
+25411
+25412
+25413
+25414
+25415
+25416
+25417
+25418
+25419
+25420
+25421
+25422
+25423
+25424
+25425
+25426
+25427
+25428
+25429
+25430
+25431
+25432
+25433
+25434
+25435
+25436
+25437
+25438
+25439
+25440
+25441
+25442
+25443
+25444
+25445
+25446
+25447
+25448
+25449
+25450
+25451
+25452
+25453
+25454
+25455
+25456
+25457
+25458
+25459
+25460
+25461
+25462
+25463
+25464
+25465
+25466
+25467
+25468
+25469
+25470
+25471
+25472
+25473
+25474
+25475
+25476
+25477
+25478
+25479
+25480
+25481
+25482
+25483
+25484
+25485
+25486
+25487
+25488
+25489
+25490
+25491
+25492
+25493
+25494
+25495
+25496
+25497
+25498
+25499
+25500
+25501
+25502
+25503
+25504
+25505
+25506
+25507
+25508
+25509
+25510
+25511
+25512
+25513
+25514
+25515
+25516
+25517
+25518
+25519
+25520
+25521
+25522
+25523
+25524
+25525
+25526
+25527
+25528
+25529
+25530
+25531
+25532
+25533
+25534
+25535
+25536
+25537
+25538
+25539
+25540
+25541
+25542
+25543
+25544
+25545
+25546
+25547
+25548
+25549
+25550
+25551
+25552
+25553
+25554
+25555
+25556
+25557
+25558
+25559
+25560
+25561
+25562
+25563
+25564
+25565
+25566
+25567
+25568
+25569
+25570
+25571
+25572
+25573
+25574
+25575
+25576
+25577
+25578
+25579
+25580
+25581
+25582
+25583
+25584
+25585
+25586
+25587
+25588
+25589
+25590
+25591
+25592
+25593
+25594
+25595
+25596
+25597
+25598
+25599
+25600
+25601
+25602
+25603
+25604
+25605
+25606
+25607
+25608
+25609
+25610
+25611
+25612
+25613
+25614
+25615
+25616
+25617
+25618
+25619
+25620
+25621
+25622
+25623
+25624
+25625
+25626
+25627
+25628
+25629
+25630
+25631
+25632
+25633
+25634
+25635
+25636
+25637
+25638
+25639
+25640
+25641
+25642
+25643
+25644
+25645
+25646
+25647
+25648
+25649
+25650
+25651
+25652
+25653
+25654
+25655
+25656
+25657
+25658
+25659
+25660
+25661
+25662
+25663
+25664
+25665
+25666
+25667
+25668
+25669
+25670
+25671
+25672
+25673
+25674
+25675
+25676
+25677
+25678
+25679
+25680
+25681
+25682
+25683
+25684
+25685
+25686
+25687
+25688
+25689
+25690
+25691
+25692
+25693
+25694
+25695
+25696
+25697
+25698
+25699
+25700
+25701
+25702
+25703
+25704
+25705
+25706
+25707
+25708
+25709
+25710
+25711
+25712
+25713
+25714
+25715
+25716
+25717
+25718
+25719
+25720
+25721
+25722
+25723
+25724
+25725
+25726
+25727
+25728
+25729
+25730
+25731
+25732
+25733
+25734
+25735
+25736
+25737
+25738
+25739
+25740
+25741
+25742
+25743
+25744
+25745
+25746
+25747
+25748
+25749
+25750
+25751
+25752
+25753
+25754
+25755
+25756
+25757
+25758
+25759
+25760
+25761
+25762
+25763
+25764
+25765
+25766
+25767
+25768
+25769
+25770
+25771
+25772
+25773
+25774
+25775
+25776
+25777
+25778
+25779
+25780
+25781
+25782
+25783
+25784
+25785
+25786
+25787
+25788
+25789
+25790
+25791
+25792
+25793
+25794
+25795
+25796
+25797
+25798
+25799
+25800
+25801
+25802
+25803
+25804
+25805
+25806
+25807
+25808
+25809
+25810
+25811
+25812
+25813
+25814
+25815
+25816
+25817
+25818
+25819
+25820
+25821
+25822
+25823
+25824
+25825
+25826
+25827
+25828
+25829
+25830
+25831
+25832
+25833
+25834
+25835
+25836
+25837
+25838
+25839
+25840
+25841
+25842
+25843
+25844
+25845
+25846
+25847
+25848
+25849
+25850
+25851
+25852
+25853
+25854
+25855
+25856
+25857
+25858
+25859
+25860
+25861
+25862
+25863
+25864
+25865
+25866
+25867
+25868
+25869
+25870
+25871
+25872
+25873
+25874
+25875
+25876
+25877
+25878
+25879
+25880
+25881
+25882
+25883
+25884
+25885
+25886
+25887
+25888
+25889
+25890
+25891
+25892
+25893
+25894
+25895
+25896
+25897
+25898
+25899
+25900
+25901
+25902
+25903
+25904
+25905
+25906
+25907
+25908
+25909
+25910
+25911
+25912
+25913
+25914
+25915
+25916
+25917
+25918
+25919
+25920
+25921
+25922
+25923
+25924
+25925
+25926
+25927
+25928
+25929
+25930
+25931
+25932
+25933
+25934
+25935
+25936
+25937
+25938
+25939
+25940
+25941
+25942
+25943
+25944
+25945
+25946
+25947
+25948
+25949
+25950
+25951
+25952
+25953
+25954
+25955
+25956
+25957
+25958
+25959
+25960
+25961
+25962
+25963
+25964
+25965
+25966
+25967
+25968
+25969
+25970
+25971
+25972
+25973
+25974
+25975
+25976
+25977
+25978
+25979
+25980
+25981
+25982
+25983
+25984
+25985
+25986
+25987
+25988
+25989
+25990
+25991
+25992
+25993
+25994
+25995
+25996
+25997
+25998
+25999
+26000
+26001
+26002
+26003
+26004
+26005
+26006
+26007
+26008
+26009
+26010
+26011
+26012
+26013
+26014
+26015
+26016
+26017
+26018
+26019
+26020
+26021
+26022
+26023
+26024
+26025
+26026
+26027
+26028
+26029
+26030
+26031
+26032
+26033
+26034
+26035
+26036
+26037
+26038
+26039
+26040
+26041
+26042
+26043
+26044
+26045
+26046
+26047
+26048
+26049
+26050
+26051
+26052
+26053
+26054
+26055
+26056
+26057
+26058
+26059
+26060
+26061
+26062
+26063
+26064
+26065
+26066
+26067
+26068
+26069
+26070
+26071
+26072
+26073
+26074
+26075
+26076
+26077
+26078
+26079
+26080
+26081
+26082
+26083
+26084
+26085
+26086
+26087
+26088
+26089
+26090
+26091
+26092
+26093
+26094
+26095
+26096
+26097
+26098
+26099
+26100
+26101
+26102
+26103
+26104
+26105
+26106
+26107
+26108
+26109
+26110
+26111
+26112
+26113
+26114
+26115
+26116
+26117
+26118
+26119
+26120
+26121
+26122
+26123
+26124
+26125
+26126
+26127
+26128
+26129
+26130
+26131
+26132
+26133
+26134
+26135
+26136
+26137
+26138
+26139
+26140
+26141
+26142
+26143
+26144
+26145
+26146
+26147
+26148
+26149
+26150
+26151
+26152
+26153
+26154
+26155
+26156
+26157
+26158
+26159
+26160
+26161
+26162
+26163
+26164
+26165
+26166
+26167
+26168
+26169
+26170
+26171
+26172
+26173
+26174
+26175
+26176
+26177
+26178
+26179
+26180
+26181
+26182
+26183
+26184
+26185
+26186
+26187
+26188
+26189
+26190
+26191
+26192
+26193
+26194
+26195
+26196
+26197
+26198
+26199
+26200
+26201
+26202
+26203
+26204
+26205
+26206
+26207
+26208
+26209
+26210
+26211
+26212
+26213
+26214
+26215
+26216
+26217
+26218
+26219
+26220
+26221
+26222
+26223
+26224
+26225
+26226
+26227
+26228
+26229
+26230
+26231
+26232
+26233
+26234
+26235
+26236
+26237
+26238
+26239
+26240
+26241
+26242
+26243
+26244
+26245
+26246
+26247
+26248
+26249
+26250
+26251
+26252
+26253
+26254
+26255
+26256
+26257
+26258
+26259
+26260
+26261
+26262
+26263
+26264
+26265
+26266
+26267
+26268
+26269
+26270
+26271
+26272
+26273
+26274
+26275
+26276
+26277
+26278
+26279
+26280
+26281
+26282
+26283
+26284
+26285
+26286
+26287
+26288
+26289
+26290
+26291
+26292
+26293
+26294
+26295
+26296
+26297
+26298
+26299
+26300
+26301
+26302
+26303
+26304
+26305
+26306
+26307
+26308
+26309
+26310
+26311
+26312
+26313
+26314
+26315
+26316
+26317
+26318
+26319
+26320
+26321
+26322
+26323
+26324
+26325
+26326
+26327
+26328
+26329
+26330
+26331
+26332
+26333
+26334
+26335
+26336
+26337
+26338
+26339
+26340
+26341
+26342
+26343
+26344
+26345
+26346
+26347
+26348
+26349
+26350
+26351
+26352
+26353
+26354
+26355
+26356
+26357
+26358
+26359
+26360
+26361
+26362
+26363
+26364
+26365
+26366
+26367
+26368
+26369
+26370
+26371
+26372
+26373
+26374
+26375
+26376
+26377
+26378
+26379
+26380
+26381
+26382
+26383
+26384
+26385
+26386
+26387
+26388
+26389
+26390
+26391
+26392
+26393
+26394
+26395
+26396
+26397
+26398
+26399
+26400
+26401
+26402
+26403
+26404
+26405
+26406
+26407
+26408
+26409
+26410
+26411
+26412
+26413
+26414
+26415
+26416
+26417
+26418
+26419
+26420
+26421
+26422
+26423
+26424
+26425
+26426
+26427
+26428
+26429
+26430
+26431
+26432
+26433
+26434
+26435
+26436
+26437
+26438
+26439
+26440
+26441
+26442
+26443
+26444
+26445
+26446
+26447
+26448
+26449
+26450
+26451
+26452
+26453
+26454
+26455
+26456
+26457
+26458
+26459
+26460
+26461
+26462
+26463
+26464
+26465
+26466
+26467
+26468
+26469
+26470
+26471
+26472
+26473
+26474
+26475
+26476
+26477
+26478
+26479
+26480
+26481
+26482
+26483
+26484
+26485
+26486
+26487
+26488
+26489
+26490
+26491
+26492
+26493
+26494
+26495
+26496
+26497
+26498
+26499
+26500
+26501
+26502
+26503
+26504
+26505
+26506
+26507
+26508
+26509
+26510
+26511
+26512
+26513
+26514
+26515
+26516
+26517
+26518
+26519
+26520
+26521
+26522
+26523
+26524
+26525
+26526
+26527
+26528
+26529
+26530
+26531
+26532
+26533
+26534
+26535
+26536
+26537
+26538
+26539
+26540
+26541
+26542
+26543
+26544
+26545
+26546
+26547
+26548
+26549
+26550
+26551
+26552
+26553
+26554
+26555
+26556
+26557
+26558
+26559
+26560
+26561
+26562
+26563
+26564
+26565
+26566
+26567
+26568
+26569
+26570
+26571
+26572
+26573
+26574
+26575
+26576
+26577
+26578
+26579
+26580
+26581
+26582
+26583
+26584
+26585
+26586
+26587
+26588
+26589
+26590
+26591
+26592
+26593
+26594
+26595
+26596
+26597
+26598
+26599
+26600
+26601
+26602
+26603
+26604
+26605
+26606
+26607
+26608
+26609
+26610
+26611
+26612
+26613
+26614
+26615
+26616
+26617
+26618
+26619
+26620
+26621
+26622
+26623
+26624
+26625
+26626
+26627
+26628
+26629
+26630
+26631
+26632
+26633
+26634
+26635
+26636
+26637
+26638
+26639
+26640
+26641
+26642
+26643
+26644
+26645
+26646
+26647
+26648
+26649
+26650
+26651
+26652
+26653
+26654
+26655
+26656
+26657
+26658
+26659
+26660
+26661
+26662
+26663
+26664
+26665
+26666
+26667
+26668
+26669
+26670
+26671
+26672
+26673
+26674
+26675
+26676
+26677
+26678
+26679
+26680
+26681
+26682
+26683
+26684
+26685
+26686
+26687
+26688
+26689
+26690
+26691
+26692
+26693
+26694
+26695
+26696
+26697
+26698
+26699
+26700
+26701
+26702
+26703
+26704
+26705
+26706
+26707
+26708
+26709
+26710
+26711
+26712
+26713
+26714
+26715
+26716
+26717
+26718
+26719
+26720
+26721
+26722
+26723
+26724
+26725
+26726
+26727
+26728
+26729
+26730
+26731
+26732
+26733
+26734
+26735
+26736
+26737
+26738
+26739
+26740
+26741
+26742
+26743
+26744
+26745
+26746
+26747
+26748
+26749
+26750
+26751
+26752
+26753
+26754
+26755
+26756
+26757
+26758
+26759
+26760
+26761
+26762
+26763
+26764
+26765
+26766
+26767
+26768
+26769
+26770
+26771
+26772
+26773
+26774
+26775
+26776
+26777
+26778
+26779
+26780
+26781
+26782
+26783
+26784
+26785
+26786
+26787
+26788
+26789
+26790
+26791
+26792
+26793
+26794
+26795
+26796
+26797
+26798
+26799
+26800
+26801
+26802
+26803
+26804
+26805
+26806
+26807
+26808
+26809
+26810
+26811
+26812
+26813
+26814
+26815
+26816
+26817
+26818
+26819
+26820
+26821
+26822
+26823
+26824
+26825
+26826
+26827
+26828
+26829
+26830
+26831
+26832
+26833
+26834
+26835
+26836
+26837
+26838
+26839
+26840
+26841
+26842
+26843
+26844
+26845
+26846
+26847
+26848
+26849
+26850
+26851
+26852
+26853
+26854
+26855
+26856
+26857
+26858
+26859
+26860
+26861
+26862
+26863
+26864
+26865
+26866
+26867
+26868
+26869
+26870
+26871
+26872
+26873
+26874
+26875
+26876
+26877
+26878
+26879
+26880
+26881
+26882
+26883
+26884
+26885
+26886
+26887
+26888
+26889
+26890
+26891
+26892
+26893
+26894
+26895
+26896
+26897
+26898
+26899
+26900
+26901
+26902
+26903
+26904
+26905
+26906
+26907
+26908
+26909
+26910
+26911
+26912
+26913
+26914
+26915
+26916
+26917
+26918
+26919
+26920
+26921
+26922
+26923
+26924
+26925
+26926
+26927
+26928
+26929
+26930
+26931
+26932
+26933
+26934
+26935
+26936
+26937
+26938
+26939
+26940
+26941
+26942
+26943
+26944
+26945
+26946
+26947
+26948
+26949
+26950
+26951
+26952
+26953
+26954
+26955
+26956
+26957
+26958
+26959
+26960
+26961
+26962
+26963
+26964
+26965
+26966
+26967
+26968
+26969
+26970
+26971
+26972
+26973
+26974
+26975
+26976
+26977
+26978
+26979
+26980
+26981
+26982
+26983
+26984
+26985
+26986
+26987
+26988
+26989
+26990
+26991
+26992
+26993
+26994
+26995
+26996
+26997
+26998
+26999
+27000
+27001
+27002
+27003
+27004
+27005
+27006
+27007
+27008
+27009
+27010
+27011
+27012
+27013
+27014
+27015
+27016
+27017
+27018
+27019
+27020
+27021
+27022
+27023
+27024
+27025
+27026
+27027
+27028
+27029
+27030
+27031
+27032
+27033
+27034
+27035
+27036
+27037
+27038
+27039
+27040
+27041
+27042
+27043
+27044
+27045
+27046
+27047
+27048
+27049
+27050
+27051
+27052
+27053
+27054
+27055
+27056
+27057
+27058
+27059
+27060
+27061
+27062
+27063
+27064
+27065
+27066
+27067
+27068
+27069
+27070
+27071
+27072
+27073
+27074
+27075
+27076
+27077
+27078
+27079
+27080
+27081
+27082
+27083
+27084
+27085
+27086
+27087
+27088
+27089
+27090
+27091
+27092
+27093
+27094
+27095
+27096
+27097
+27098
+27099
+27100
+27101
+27102
+27103
+27104
+27105
+27106
+27107
+27108
+27109
+27110
+27111
+27112
+27113
+27114
+27115
+27116
+27117
+27118
+27119
+27120
+27121
+27122
+27123
+27124
+27125
+27126
+27127
+27128
+27129
+27130
+27131
+27132
+27133
+27134
+27135
+27136
+27137
+27138
+27139
+27140
+27141
+27142
+27143
+27144
+27145
+27146
+27147
+27148
+27149
+27150
+27151
+27152
+27153
+27154
+27155
+27156
+27157
+27158
+27159
+27160
+27161
+27162
+27163
+27164
+27165
+27166
+27167
+27168
+27169
+27170
+27171
+27172
+27173
+27174
+27175
+27176
+27177
+27178
+27179
+27180
+27181
+27182
+27183
+27184
+27185
+27186
+27187
+27188
+27189
+27190
+27191
+27192
+27193
+27194
+27195
+27196
+27197
+27198
+27199
+27200
+27201
+27202
+27203
+27204
+27205
+27206
+27207
+27208
+27209
+27210
+27211
+27212
+27213
+27214
+27215
+27216
+27217
+27218
+27219
+27220
+27221
+27222
+27223
+27224
+27225
+27226
+27227
+27228
+27229
+27230
+27231
+27232
+27233
+27234
+27235
+27236
+27237
+27238
+27239
+27240
+27241
+27242
+27243
+27244
+27245
+27246
+27247
+27248
+27249
+27250
+27251
+27252
+27253
+27254
+27255
+27256
+27257
+27258
+27259
+27260
+27261
+27262
+27263
+27264
+27265
+27266
+27267
+27268
+27269
+27270
+27271
+27272
+27273
+27274
+27275
+27276
+27277
+27278
+27279
+27280
+27281
+27282
+27283
+27284
+27285
+27286
+27287
+27288
+27289
+27290
+27291
+27292
+27293
+27294
+27295
+27296
+27297
+27298
+27299
+27300
+27301
+27302
+27303
+27304
+27305
+27306
+27307
+27308
+27309
+27310
+27311
+27312
+27313
+27314
+27315
+27316
+27317
+27318
+27319
+27320
+27321
+27322
+27323
+27324
+27325
+27326
+27327
+27328
+27329
+27330
+27331
+27332
+27333
+27334
+27335
+27336
+27337
+27338
+27339
+27340
+27341
+27342
+27343
+27344
+27345
+27346
+27347
+27348
+27349
+27350
+27351
+27352
+27353
+27354
+27355
+27356
+27357
+27358
+27359
+27360
+27361
+27362
+27363
+27364
+27365
+27366
+27367
+27368
+27369
+27370
+27371
+27372
+27373
+27374
+27375
+27376
+27377
+27378
+27379
+27380
+27381
+27382
+27383
+27384
+27385
+27386
+27387
+27388
+27389
+27390
+27391
+27392
+27393
+27394
+27395
+27396
+27397
+27398
+27399
+27400
+27401
+27402
+27403
+27404
+27405
+27406
+27407
+27408
+27409
+27410
+27411
+27412
+27413
+27414
+27415
+27416
+27417
+27418
+27419
+27420
+27421
+27422
+27423
+27424
+27425
+27426
+27427
+27428
+27429
+27430
+27431
+27432
+27433
+27434
+27435
+27436
+27437
+27438
+27439
+27440
+27441
+27442
+27443
+27444
+27445
+27446
+27447
+27448
+27449
+27450
+27451
+27452
+27453
+27454
+27455
+27456
+27457
+27458
+27459
+27460
+27461
+27462
+27463
+27464
+27465
+27466
+27467
+27468
+27469
+27470
+27471
+27472
+27473
+27474
+27475
+27476
+27477
+27478
+27479
+27480
+27481
+27482
+27483
+27484
+27485
+27486
+27487
+27488
+27489
+27490
+27491
+27492
+27493
+27494
+27495
+27496
+27497
+27498
+27499
+27500
+27501
+27502
+27503
+27504
+27505
+27506
+27507
+27508
+27509
+27510
+27511
+27512
+27513
+27514
+27515
+27516
+27517
+27518
+27519
+27520
+27521
+27522
+27523
+27524
+27525
+27526
+27527
+27528
+27529
+27530
+27531
+27532
+27533
+27534
+27535
+27536
+27537
+27538
+27539
+27540
+27541
+27542
+27543
+27544
+27545
+27546
+27547
+27548
+27549
+27550
+27551
+27552
+27553
+27554
+27555
+27556
+27557
+27558
+27559
+27560
+27561
+27562
+27563
+27564
+27565
+27566
+27567
+27568
+27569
+27570
+27571
+27572
+27573
+27574
+27575
+27576
+27577
+27578
+27579
+27580
+27581
+27582
+27583
+27584
+27585
+27586
+27587
+27588
+27589
+27590
+27591
+27592
+27593
+27594
+27595
+27596
+27597
+27598
+27599
+27600
+27601
+27602
+27603
+27604
+27605
+27606
+27607
+27608
+27609
+27610
+27611
+27612
+27613
+27614
+27615
+27616
+27617
+27618
+27619
+27620
+27621
+27622
+27623
+27624
+27625
+27626
+27627
+27628
+27629
+27630
+27631
+27632
+27633
+27634
+27635
+27636
+27637
+27638
+27639
+27640
+27641
+27642
+27643
+27644
+27645
+27646
+27647
+27648
+27649
+27650
+27651
+27652
+27653
+27654
+27655
+27656
+27657
+27658
+27659
+27660
+27661
+27662
+27663
+27664
+27665
+27666
+27667
+27668
+27669
+27670
+27671
+27672
+27673
+27674
+27675
+27676
+27677
+27678
+27679
+27680
+27681
+27682
+27683
+27684
+27685
+27686
+27687
+27688
+27689
+27690
+27691
+27692
+27693
+27694
+27695
+27696
+27697
+27698
+27699
+27700
+27701
+27702
+27703
+27704
+27705
+27706
+27707
+27708
+27709
+27710
+27711
+27712
+27713
+27714
+27715
+27716
+27717
+27718
+27719
+27720
+27721
+27722
+27723
+27724
+27725
+27726
+27727
+27728
+27729
+27730
+27731
+27732
+27733
+27734
+27735
+27736
+27737
+27738
+27739
+27740
+27741
+27742
+27743
+27744
+27745
+27746
+27747
+27748
+27749
+27750
+27751
+27752
+27753
+27754
+27755
+27756
+27757
+27758
+27759
+27760
+27761
+27762
+27763
+27764
+27765
+27766
+27767
+27768
+27769
+27770
+27771
+27772
+27773
+27774
+27775
+27776
+27777
+27778
+27779
+27780
+27781
+27782
+27783
+27784
+27785
+27786
+27787
+27788
+27789
+27790
+27791
+27792
+27793
+27794
+27795
+27796
+27797
+27798
+27799
+27800
+27801
+27802
+27803
+27804
+27805
+27806
+27807
+27808
+27809
+27810
+27811
+27812
+27813
+27814
+27815
+27816
+27817
+27818
+27819
+27820
+27821
+27822
+27823
+27824
+27825
+27826
+27827
+27828
+27829
+27830
+27831
+27832
+27833
+27834
+27835
+27836
+27837
+27838
+27839
+27840
+27841
+27842
+27843
+27844
+27845
+27846
+27847
+27848
+27849
+27850
+27851
+27852
+27853
+27854
+27855
+27856
+27857
+27858
+27859
+27860
+27861
+27862
+27863
+27864
+27865
+27866
+27867
+27868
+27869
+27870
+27871
+27872
+27873
+27874
+27875
+27876
+27877
+27878
+27879
+27880
+27881
+27882
+27883
+27884
+27885
+27886
+27887
+27888
+27889
+27890
+27891
+27892
+27893
+27894
+27895
+27896
+27897
+27898
+27899
+27900
+27901
+27902
+27903
+27904
+27905
+27906
+27907
+27908
+27909
+27910
+27911
+27912
+27913
+27914
+27915
+27916
+27917
+27918
+27919
+27920
+27921
+27922
+27923
+27924
+27925
+27926
+27927
+27928
+27929
+27930
+27931
+27932
+27933
+27934
+27935
+27936
+27937
+27938
+27939
+27940
+27941
+27942
+27943
+27944
+27945
+27946
+27947
+27948
+27949
+27950
+27951
+27952
+27953
+27954
+27955
+27956
+27957
+27958
+27959
+27960
+27961
+27962
+27963
+27964
+27965
+27966
+27967
+27968
+27969
+27970
+27971
+27972
+27973
+27974
+27975
+27976
+27977
+27978
+27979
+27980
+27981
+27982
+27983
+27984
+27985
+27986
+27987
+27988
+27989
+27990
+27991
+27992
+27993
+27994
+27995
+27996
+27997
+27998
+27999
+28000
+28001
+28002
+28003
+28004
+28005
+28006
+28007
+28008
+28009
+28010
+28011
+28012
+28013
+28014
+28015
+28016
+28017
+28018
+28019
+28020
+28021
+28022
+28023
+28024
+28025
+28026
+28027
+28028
+28029
+28030
+28031
+28032
+28033
+28034
+28035
+28036
+28037
+28038
+28039
+28040
+28041
+28042
+28043
+28044
+28045
+28046
+28047
+28048
+28049
+28050
+28051
+28052
+28053
+28054
+28055
+28056
+28057
+28058
+28059
+28060
+28061
+28062
+28063
+28064
+28065
+28066
+28067
+28068
+28069
+28070
+28071
+28072
+28073
+28074
+28075
+28076
+28077
+28078
+28079
+28080
+28081
+28082
+28083
+28084
+28085
+28086
+28087
+28088
+28089
+28090
+28091
+28092
+28093
+28094
+28095
+28096
+28097
+28098
+28099
+28100
+28101
+28102
+28103
+28104
+28105
+28106
+28107
+28108
+28109
+28110
+28111
+28112
+28113
+28114
+28115
+28116
+28117
+28118
+28119
+28120
+28121
+28122
+28123
+28124
+28125
+28126
+28127
+28128
+28129
+28130
+28131
+28132
+28133
+28134
+28135
+28136
+28137
+28138
+28139
+28140
+28141
+28142
+28143
+28144
+28145
+28146
+28147
+28148
+28149
+28150
+28151
+28152
+28153
+28154
+28155
+28156
+28157
+28158
+28159
+28160
+28161
+28162
+28163
+28164
+28165
+28166
+28167
+28168
+28169
+28170
+28171
+28172
+28173
+28174
+28175
+28176
+28177
+28178
+28179
+28180
+28181
+28182
+28183
+28184
+28185
+28186
+28187
+28188
+28189
+28190
+28191
+28192
+28193
+28194
+28195
+28196
+28197
+28198
+28199
+28200
+28201
+28202
+28203
+28204
+28205
+28206
+28207
+28208
+28209
+28210
+28211
+28212
+28213
+28214
+28215
+28216
+28217
+28218
+28219
+28220
+28221
+28222
+28223
+28224
+28225
+28226
+28227
+28228
+28229
+28230
+28231
+28232
+28233
+28234
+28235
+28236
+28237
+28238
+28239
+28240
+28241
+28242
+28243
+28244
+28245
+28246
+28247
+28248
+28249
+28250
+28251
+28252
+28253
+28254
+28255
+28256
+28257
+28258
+28259
+28260
+28261
+28262
+28263
+28264
+28265
+28266
+28267
+28268
+28269
+28270
+28271
+28272
+28273
+28274
+28275
+28276
+28277
+28278
+28279
+28280
+28281
+28282
+28283
+28284
+28285
+28286
+28287
+28288
+28289
+28290
+28291
+28292
+28293
+28294
+28295
+28296
+28297
+28298
+28299
+28300
+28301
+28302
+28303
+28304
+28305
+28306
+28307
+28308
+28309
+28310
+28311
+28312
+28313
+28314
+28315
+28316
+28317
+28318
+28319
+28320
+28321
+28322
+28323
+28324
+28325
+28326
+28327
+28328
+28329
+28330
+28331
+28332
+28333
+28334
+28335
+28336
+28337
+28338
+28339
+28340
+28341
+28342
+28343
+28344
+28345
+28346
+28347
+28348
+28349
+28350
+28351
+28352
+28353
+28354
+28355
+28356
+28357
+28358
+28359
+28360
+28361
+28362
+28363
+28364
+28365
+28366
+28367
+28368
+28369
+28370
+28371
+28372
+28373
+28374
+28375
+28376
+28377
+28378
+28379
+28380
+28381
+28382
+28383
+28384
+28385
+28386
+28387
+28388
+28389
+28390
+28391
+28392
+28393
+28394
+28395
+28396
+28397
+28398
+28399
+28400
+28401
+28402
+28403
+28404
+28405
+28406
+28407
+28408
+28409
+28410
+28411
+28412
+28413
+28414
+28415
+28416
+28417
+28418
+28419
+28420
+28421
+28422
+28423
+28424
+28425
+28426
+28427
+28428
+28429
+28430
+28431
+28432
+28433
+28434
+28435
+28436
+28437
+28438
+28439
+28440
+28441
+28442
+28443
+28444
+28445
+28446
+28447
+28448
+28449
+28450
+28451
+28452
+28453
+28454
+28455
+28456
+28457
+28458
+28459
+28460
+28461
+28462
+28463
+28464
+28465
+28466
+28467
+28468
+28469
+28470
+28471
+28472
+28473
+28474
+28475
+28476
+28477
+28478
+28479
+28480
+28481
+28482
+28483
+28484
+28485
+28486
+28487
+28488
+28489
+28490
+28491
+28492
+28493
+28494
+28495
+28496
+28497
+28498
+28499
+28500
+28501
+28502
+28503
+28504
+28505
+28506
+28507
+28508
+28509
+28510
+28511
+28512
+28513
+28514
+28515
+28516
+28517
+28518
+28519
+28520
+28521
+28522
+28523
+28524
+28525
+28526
+28527
+28528
+28529
+28530
+28531
+28532
+28533
+28534
+28535
+28536
+28537
+28538
+28539
+28540
+28541
+28542
+28543
+28544
+28545
+28546
+28547
+28548
+28549
+28550
+28551
+28552
+28553
+28554
+28555
+28556
+28557
+28558
+28559
+28560
+28561
+28562
+28563
+28564
+28565
+28566
+28567
+28568
+28569
+28570
+28571
+28572
+28573
+28574
+28575
+28576
+28577
+28578
+28579
+28580
+28581
+28582
+28583
+28584
+28585
+28586
+28587
+28588
+28589
+28590
+28591
+28592
+28593
+28594
+28595
+28596
+28597
+28598
+28599
+28600
+28601
+28602
+28603
+28604
+28605
+28606
+28607
+28608
+28609
+28610
+28611
+28612
+28613
+28614
+28615
+28616
+28617
+28618
+28619
+28620
+28621
+28622
+28623
+28624
+28625
+28626
+28627
+28628
+28629
+28630
+28631
+28632
+28633
+28634
+28635
+28636
+28637
+28638
+28639
+28640
+28641
+28642
+28643
+28644
+28645
+28646
+28647
+28648
+28649
+28650
+28651
+28652
+28653
+28654
+28655
+28656
+28657
+28658
+28659
+28660
+28661
+28662
+28663
+28664
+28665
+28666
+28667
+28668
+28669
+28670
+28671
+28672
+28673
+28674
+28675
+28676
+28677
+28678
+28679
+28680
+28681
+28682
+28683
+28684
+28685
+28686
+28687
+28688
+28689
+28690
+28691
+28692
+28693
+28694
+28695
+28696
+28697
+28698
+28699
+28700
+28701
+28702
+28703
+28704
+28705
+28706
+28707
+28708
+28709
+28710
+28711
+28712
+28713
+28714
+28715
+28716
+28717
+28718
+28719
+28720
+28721
+28722
+28723
+28724
+28725
+28726
+28727
+28728
+28729
+28730
+28731
+28732
+28733
+28734
+28735
+28736
+28737
+28738
+28739
+28740
+28741
+28742
+28743
+28744
+28745
+28746
+28747
+28748
+28749
+28750
+28751
+28752
+28753
+28754
+28755
+28756
+28757
+28758
+28759
+28760
+28761
+28762
+28763
+28764
+28765
+28766
+28767
+28768
+28769
+28770
+28771
+28772
+28773
+28774
+28775
+28776
+28777
+28778
+28779
+28780
+28781
+28782
+28783
+28784
+28785
+28786
+28787
+28788
+28789
+28790
+28791
+28792
+28793
+28794
+28795
+28796
+28797
+28798
+28799
+28800
+28801
+28802
+28803
+28804
+28805
+28806
+28807
+28808
+28809
+28810
+28811
+28812
+28813
+28814
+28815
+28816
+28817
+28818
+28819
+28820
+28821
+28822
+28823
+28824
+28825
+28826
+28827
+28828
+28829
+28830
+28831
+28832
+28833
+28834
+28835
+28836
+28837
+28838
+28839
+28840
+28841
+28842
+28843
+28844
+28845
+28846
+28847
+28848
+28849
+28850
+28851
+28852
+28853
+28854
+28855
+28856
+28857
+28858
+28859
+28860
+28861
+28862
+28863
+28864
+28865
+28866
+28867
+28868
+28869
+28870
+28871
+28872
+28873
+28874
+28875
+28876
+28877
+28878
+28879
+28880
+28881
+28882
+28883
+28884
+28885
+28886
+28887
+28888
+28889
+28890
+28891
+28892
+28893
+28894
+28895
+28896
+28897
+28898
+28899
+28900
+28901
+28902
+28903
+28904
+28905
+28906
+28907
+28908
+28909
+28910
+28911
+28912
+28913
+28914
+28915
+28916
+28917
+28918
+28919
+28920
+28921
+28922
+28923
+28924
+28925
+28926
+28927
+28928
+28929
+28930
+28931
+28932
+28933
+28934
+28935
+28936
+28937
+28938
+28939
+28940
+28941
+28942
+28943
+28944
+28945
+28946
+28947
+28948
+28949
+28950
+28951
+28952
+28953
+28954
+28955
+28956
+28957
+28958
+28959
+28960
+28961
+28962
+28963
+28964
+28965
+28966
+28967
+28968
+28969
+28970
+28971
+28972
+28973
+28974
+28975
+28976
+28977
+28978
+28979
+28980
+28981
+28982
+28983
+28984
+28985
+28986
+28987
+28988
+28989
+28990
+28991
+28992
+28993
+28994
+28995
+28996
+28997
+28998
+28999
+29000
+29001
+29002
+29003
+29004
+29005
+29006
+29007
+29008
+29009
+29010
+29011
+29012
+29013
+29014
+29015
+29016
+29017
+29018
+29019
+29020
+29021
+29022
+29023
+29024
+29025
+29026
+29027
+29028
+29029
+29030
+29031
+29032
+29033
+29034
+29035
+29036
+29037
+29038
+29039
+29040
+29041
+29042
+29043
+29044
+29045
+29046
+29047
+29048
+29049
+29050
+29051
+29052
+29053
+29054
+29055
+29056
+29057
+29058
+29059
+29060
+29061
+29062
+29063
+29064
+29065
+29066
+29067
+29068
+29069
+29070
+29071
+29072
+29073
+29074
+29075
+29076
+29077
+29078
+29079
+29080
+29081
+29082
+29083
+29084
+29085
+29086
+29087
+29088
+29089
+29090
+29091
+29092
+29093
+29094
+29095
+29096
+29097
+29098
+29099
+29100
+29101
+29102
+29103
+29104
+29105
+29106
+29107
+29108
+29109
+29110
+29111
+29112
+29113
+29114
+29115
+29116
+29117
+29118
+29119
+29120
+29121
+29122
+29123
+29124
+29125
+29126
+29127
+29128
+29129
+29130
+29131
+29132
+29133
+29134
+29135
+29136
+29137
+29138
+29139
+29140
+29141
+29142
+29143
+29144
+29145
+29146
+29147
+29148
+29149
+29150
+29151
+29152
+29153
+29154
+29155
+29156
+29157
+29158
+29159
+29160
+29161
+29162
+29163
+29164
+29165
+29166
+29167
+29168
+29169
+29170
+29171
+29172
+29173
+29174
+29175
+29176
+29177
+29178
+29179
+29180
+29181
+29182
+29183
+29184
+29185
+29186
+29187
+29188
+29189
+29190
+29191
+29192
+29193
+29194
+29195
+29196
+29197
+29198
+29199
+29200
+29201
+29202
+29203
+29204
+29205
+29206
+29207
+29208
+29209
+29210
+29211
+29212
+29213
+29214
+29215
+29216
+29217
+29218
+29219
+29220
+29221
+29222
+29223
+29224
+29225
+29226
+29227
+29228
+29229
+29230
+29231
+29232
+29233
+29234
+29235
+29236
+29237
+29238
+29239
+29240
+29241
+29242
+29243
+29244
+29245
+29246
+29247
+29248
+29249
+29250
+29251
+29252
+29253
+29254
+29255
+29256
+29257
+29258
+29259
+29260
+29261
+29262
+29263
+29264
+29265
+29266
+29267
+29268
+29269
+29270
+29271
+29272
+29273
+29274
+29275
+29276
+29277
+29278
+29279
+29280
+29281
+29282
+29283
+29284
+29285
+29286
+29287
+29288
+29289
+29290
+29291
+29292
+29293
+29294
+29295
+29296
+29297
+29298
+29299
+29300
+29301
+29302
+29303
+29304
+29305
+29306
+29307
+29308
+29309
+29310
+29311
+29312
+29313
+29314
+29315
+29316
+29317
+29318
+29319
+29320
+29321
+29322
+29323
+29324
+29325
+29326
+29327
+29328
+29329
+29330
+29331
+29332
+29333
+29334
+29335
+29336
+29337
+29338
+29339
+29340
+29341
+29342
+29343
+29344
+29345
+29346
+29347
+29348
+29349
+29350
+29351
+29352
+29353
+29354
+29355
+29356
+29357
+29358
+29359
+29360
+29361
+29362
+29363
+29364
+29365
+29366
+29367
+29368
+29369
+29370
+29371
+29372
+29373
+29374
+29375
+29376
+29377
+29378
+29379
+29380
+29381
+29382
+29383
+29384
+29385
+29386
+29387
+29388
+29389
+29390
+29391
+29392
+29393
+29394
+29395
+29396
+29397
+29398
+29399
+29400
+29401
+29402
+29403
+29404
+29405
+29406
+29407
+29408
+29409
+29410
+29411
+29412
+29413
+29414
+29415
+29416
+29417
+29418
+29419
+29420
+29421
+29422
+29423
+29424
+29425
+29426
+29427
+29428
+29429
+29430
+29431
+29432
+29433
+29434
+29435
+29436
+29437
+29438
+29439
+29440
+29441
+29442
+29443
+29444
+29445
+29446
+29447
+29448
+29449
+29450
+29451
+29452
+29453
+29454
+29455
+29456
+29457
+29458
+29459
+29460
+29461
+29462
+29463
+29464
+29465
+29466
+29467
+29468
+29469
+29470
+29471
+29472
+29473
+29474
+29475
+29476
+29477
+29478
+29479
+29480
+29481
+29482
+29483
+29484
+29485
+29486
+29487
+29488
+29489
+29490
+29491
+29492
+29493
+29494
+29495
+29496
+29497
+29498
+29499
+29500
+29501
+29502
+29503
+29504
+29505
+29506
+29507
+29508
+29509
+29510
+29511
+29512
+29513
+29514
+29515
+29516
+29517
+29518
+29519
+29520
+29521
+29522
+29523
+29524
+29525
+29526
+29527
+29528
+29529
+29530
+29531
+29532
+29533
+29534
+29535
+29536
+29537
+29538
+29539
+29540
+29541
+29542
+29543
+29544
+29545
+29546
+29547
+29548
+29549
+29550
+29551
+29552
+29553
+29554
+29555
+29556
+29557
+29558
+29559
+29560
+29561
+29562
+29563
+29564
+29565
+29566
+29567
+29568
+29569
+29570
+29571
+29572
+29573
+29574
+29575
+29576
+29577
+29578
+29579
+29580
+29581
+29582
+29583
+29584
+29585
+29586
+29587
+29588
+29589
+29590
+29591
+29592
+29593
+29594
+29595
+29596
+29597
+29598
+29599
+29600
+29601
+29602
+29603
+29604
+29605
+29606
+29607
+29608
+29609
+29610
+29611
+29612
+29613
+29614
+29615
+29616
+29617
+29618
+29619
+29620
+29621
+29622
+29623
+29624
+29625
+29626
+29627
+29628
+29629
+29630
+29631
+29632
+29633
+29634
+29635
+29636
+29637
+29638
+29639
+29640
+29641
+29642
+29643
+29644
+29645
+29646
+29647
+29648
+29649
+29650
+29651
+29652
+29653
+29654
+29655
+29656
+29657
+29658
+29659
+29660
+29661
+29662
+29663
+29664
+29665
+29666
+29667
+29668
+29669
+29670
+29671
+29672
+29673
+29674
+29675
+29676
+29677
+29678
+29679
+29680
+29681
+29682
+29683
+29684
+29685
+29686
+29687
+29688
+29689
+29690
+29691
+29692
+29693
+29694
+29695
+29696
+29697
+29698
+29699
+29700
+29701
+29702
+29703
+29704
+29705
+29706
+29707
+29708
+29709
+29710
+29711
+29712
+29713
+29714
+29715
+29716
+29717
+29718
+29719
+29720
+29721
+29722
+29723
+29724
+29725
+29726
+29727
+29728
+29729
+29730
+29731
+29732
+29733
+29734
+29735
+29736
+29737
+29738
+29739
+29740
+29741
+29742
+29743
+29744
+29745
+29746
+29747
+29748
+29749
+29750
+29751
+29752
+29753
+29754
+29755
+29756
+29757
+29758
+29759
+29760
+29761
+29762
+29763
+29764
+29765
+29766
+29767
+29768
+29769
+29770
+29771
+29772
+29773
+29774
+29775
+29776
+29777
+29778
+29779
+29780
+29781
+29782
+29783
+29784
+29785
+29786
+29787
+29788
+29789
+29790
+29791
+29792
+29793
+29794
+29795
+29796
+29797
+29798
+29799
+29800
+29801
+29802
+29803
+29804
+29805
+29806
+29807
+29808
+29809
+29810
+29811
+29812
+29813
+29814
+29815
+29816
+29817
+29818
+29819
+29820
+29821
+29822
+29823
+29824
+29825
+29826
+29827
+29828
+29829
+29830
+29831
+29832
+29833
+29834
+29835
+29836
+29837
+29838
+29839
+29840
+29841
+29842
+29843
+29844
+29845
+29846
+29847
+29848
+29849
+29850
+29851
+29852
+29853
+29854
+29855
+29856
+29857
+29858
+29859
+29860
+29861
+29862
+29863
+29864
+29865
+29866
+29867
+29868
+29869
+29870
+29871
+29872
+29873
+29874
+29875
+29876
+29877
+29878
+29879
+29880
+29881
+29882
+29883
+29884
+29885
+29886
+29887
+29888
+29889
+29890
+29891
+29892
+29893
+29894
+29895
+29896
+29897
+29898
+29899
+29900
+29901
+29902
+29903
+29904
+29905
+29906
+29907
+29908
+29909
+29910
+29911
+29912
+29913
+29914
+29915
+29916
+29917
+29918
+29919
+29920
+29921
+29922
+29923
+29924
+29925
+29926
+29927
+29928
+29929
+29930
+29931
+29932
+29933
+29934
+29935
+29936
+29937
+29938
+29939
+29940
+29941
+29942
+29943
+29944
+29945
+29946
+29947
+29948
+29949
+29950
+29951
+29952
+29953
+29954
+29955
+29956
+29957
+29958
+29959
+29960
+29961
+29962
+29963
+29964
+29965
+29966
+29967
+29968
+29969
+29970
+29971
+29972
+29973
+29974
+29975
+29976
+29977
+29978
+29979
+29980
+29981
+29982
+29983
+29984
+29985
+29986
+29987
+29988
+29989
+29990
+29991
+29992
+29993
+29994
+29995
+29996
+29997
+29998
+29999
+30000
+30001
+30002
+30003
+30004
+30005
+30006
+30007
+30008
+30009
+30010
+30011
+30012
+30013
+30014
+30015
+30016
+30017
+30018
+30019
+30020
+30021
+30022
+30023
+30024
+30025
+30026
+30027
+30028
+30029
+30030
+30031
+30032
+30033
+30034
+30035
+30036
+30037
+30038
+30039
+30040
+30041
+30042
+30043
+30044
+30045
+30046
+30047
+30048
+30049
+30050
+30051
+30052
+30053
+30054
+30055
+30056
+30057
+30058
+30059
+30060
+30061
+30062
+30063
+30064
+30065
+30066
+30067
+30068
+30069
+30070
+30071
+30072
+30073
+30074
+30075
+30076
+30077
+30078
+30079
+30080
+30081
+30082
+30083
+30084
+30085
+30086
+30087
+30088
+30089
+30090
+30091
+30092
+30093
+30094
+30095
+30096
+30097
+30098
+30099
+30100
+30101
+30102
+30103
+30104
+30105
+30106
+30107
+30108
+30109
+30110
+30111
+30112
+30113
+30114
+30115
+30116
+30117
+30118
+30119
+30120
+30121
+30122
+30123
+30124
+30125
+30126
+30127
+30128
+30129
+30130
+30131
+30132
+30133
+30134
+30135
+30136
+30137
+30138
+30139
+30140
+30141
+30142
+30143
+30144
+30145
+30146
+30147
+30148
+30149
+30150
+30151
+30152
+30153
+30154
+30155
+30156
+30157
+30158
+30159
+30160
+30161
+30162
+30163
+30164
+30165
+30166
+30167
+30168
+30169
+30170
+30171
+30172
+30173
+30174
+30175
+30176
+30177
+30178
+30179
+30180
+30181
+30182
+30183
+30184
+30185
+30186
+30187
+30188
+30189
+30190
+30191
+30192
+30193
+30194
+30195
+30196
+30197
+30198
+30199
+30200
+30201
+30202
+30203
+30204
+30205
+30206
+30207
+30208
+30209
+30210
+30211
+30212
+30213
+30214
+30215
+30216
+30217
+30218
+30219
+30220
+30221
+30222
+30223
+30224
+30225
+30226
+30227
+30228
+30229
+30230
+30231
+30232
+30233
+30234
+30235
+30236
+30237
+30238
+30239
+30240
+30241
+30242
+30243
+30244
+30245
+30246
+30247
+30248
+30249
+30250
+30251
+30252
+30253
+30254
+30255
+30256
+30257
+30258
+30259
+30260
+30261
+30262
+30263
+30264
+30265
+30266
+30267
+30268
+30269
+30270
+30271
+30272
+30273
+30274
+30275
+30276
+30277
+30278
+30279
+30280
+30281
+30282
+30283
+30284
+30285
+30286
+30287
+30288
+30289
+30290
+30291
+30292
+30293
+30294
+30295
+30296
+30297
+30298
+30299
+30300
+30301
+30302
+30303
+30304
+30305
+30306
+30307
+30308
+30309
+30310
+30311
+30312
+30313
+30314
+30315
+30316
+30317
+30318
+30319
+30320
+30321
+30322
+30323
+30324
+30325
+30326
+30327
+30328
+30329
+30330
+30331
+30332
+30333
+30334
+30335
+30336
+30337
+30338
+30339
+30340
+30341
+30342
+30343
+30344
+30345
+30346
+30347
+30348
+30349
+30350
+30351
+30352
+30353
+30354
+30355
+30356
+30357
+30358
+30359
+30360
+30361
+30362
+30363
+30364
+30365
+30366
+30367
+30368
+30369
+30370
+30371
+30372
+30373
+30374
+30375
+30376
+30377
+30378
+30379
+30380
+30381
+30382
+30383
+30384
+30385
+30386
+30387
+30388
+30389
+30390
+30391
+30392
+30393
+30394
+30395
+30396
+30397
+30398
+30399
+30400
+30401
+30402
+30403
+30404
+30405
+30406
+30407
+30408
+30409
+30410
+30411
+30412
+30413
+30414
+30415
+30416
+30417
+30418
+30419
+30420
+30421
+30422
+30423
+30424
+30425
+30426
+30427
+30428
+30429
+30430
+30431
+30432
+30433
+30434
+30435
+30436
+30437
+30438
+30439
+30440
+30441
+30442
+30443
+30444
+30445
+30446
+30447
+30448
+30449
+30450
+30451
+30452
+30453
+30454
+30455
+30456
+30457
+30458
+30459
+30460
+30461
+30462
+30463
+30464
+30465
+30466
+30467
+30468
+30469
+30470
+30471
+30472
+30473
+30474
+30475
+30476
+30477
+30478
+30479
+30480
+30481
+30482
+30483
+30484
+30485
+30486
+30487
+30488
+30489
+30490
+30491
+30492
+30493
+30494
+30495
+30496
+30497
+30498
+30499
+30500
+30501
+30502
+30503
+30504
+30505
+30506
+30507
+30508
+30509
+30510
+30511
+30512
+30513
+30514
+30515
+30516
+30517
+30518
+30519
+30520
+30521
+30522
+30523
+30524
+30525
+30526
+30527
+30528
+30529
+30530
+30531
+30532
+30533
+30534
+30535
+30536
+30537
+30538
+30539
+30540
+30541
+30542
+30543
+30544
+30545
+30546
+30547
+30548
+30549
+30550
+30551
+30552
+30553
+30554
+30555
+30556
+30557
+30558
+30559
+30560
+30561
+30562
+30563
+30564
+30565
+30566
+30567
+30568
+30569
+30570
+30571
+30572
+30573
+30574
+30575
+30576
+30577
+30578
+30579
+30580
+30581
+30582
+30583
+30584
+30585
+30586
+30587
+30588
+30589
+30590
+30591
+30592
+30593
+30594
+30595
+30596
+30597
+30598
+30599
+30600
+30601
+30602
+30603
+30604
+30605
+30606
+30607
+30608
+30609
+30610
+30611
+30612
+30613
+30614
+30615
+30616
+30617
+30618
+30619
+30620
+30621
+30622
+30623
+30624
+30625
+30626
+30627
+30628
+30629
+30630
+30631
+30632
+30633
+30634
+30635
+30636
+30637
+30638
+30639
+30640
+30641
+30642
+30643
+30644
+30645
+30646
+30647
+30648
+30649
+30650
+30651
+30652
+30653
+30654
+30655
+30656
+30657
+30658
+30659
+30660
+30661
+30662
+30663
+30664
+30665
+30666
+30667
+30668
+30669
+30670
+30671
+30672
+30673
+30674
+30675
+30676
+30677
+30678
+30679
+30680
+30681
+30682
+30683
+30684
+30685
+30686
+30687
+30688
+30689
+30690
+30691
+30692
+30693
+30694
+30695
+30696
+30697
+30698
+30699
+30700
+30701
+30702
+30703
+30704
+30705
+30706
+30707
+30708
+30709
+30710
+30711
+30712
+30713
+30714
+30715
+30716
+30717
+30718
+30719
+30720
+30721
+30722
+30723
+30724
+30725
+30726
+30727
+30728
+30729
+30730
+30731
+30732
+30733
+30734
+30735
+30736
+30737
+30738
+30739
+30740
+30741
+30742
+30743
+30744
+30745
+30746
+30747
+30748
+30749
+30750
+30751
+30752
+30753
+30754
+30755
+30756
+30757
+30758
+30759
+30760
+30761
+30762
+30763
+30764
+30765
+30766
+30767
+30768
+30769
+30770
+30771
+30772
+30773
+30774
+30775
+30776
+30777
+30778
+30779
+30780
+30781
+30782
+30783
+30784
+30785
+30786
+30787
+30788
+30789
+30790
+30791
+30792
+30793
+30794
+30795
+30796
+30797
+30798
+30799
+30800
+30801
+30802
+30803
+30804
+30805
+30806
+30807
+30808
+30809
+30810
+30811
+30812
+30813
+30814
+30815
+30816
+30817
+30818
+30819
+30820
+30821
+30822
+30823
+30824
+30825
+30826
+30827
+30828
+30829
+30830
+30831
+30832
+30833
+30834
+30835
+30836
+30837
+30838
+30839
+30840
+30841
+30842
+30843
+30844
+30845
+30846
+30847
+30848
+30849
+30850
+30851
+30852
+30853
+30854
+30855
+30856
+30857
+30858
+30859
+30860
+30861
+30862
+30863
+30864
+30865
+30866
+30867
+30868
+30869
+30870
+30871
+30872
+30873
+30874
+30875
+30876
+30877
+30878
+30879
+30880
+30881
+30882
+30883
+30884
+30885
+30886
+30887
+30888
+30889
+30890
+30891
+30892
+30893
+30894
+30895
+30896
+30897
+30898
+30899
+30900
+30901
+30902
+30903
+30904
+30905
+30906
+30907
+30908
+30909
+30910
+30911
+30912
+30913
+30914
+30915
+30916
+30917
+30918
+30919
+30920
+30921
+30922
+30923
+30924
+30925
+30926
+30927
+30928
+30929
+30930
+30931
+30932
+30933
+30934
+30935
+30936
+30937
+30938
+30939
+30940
+30941
+30942
+30943
+30944
+30945
+30946
+30947
+30948
+30949
+30950
+30951
+30952
+30953
+30954
+30955
+30956
+30957
+30958
+30959
+30960
+30961
+30962
+30963
+30964
+30965
+30966
+30967
+30968
+30969
+30970
+30971
+30972
+30973
+30974
+30975
+30976
+30977
+30978
+30979
+30980
+30981
+30982
+30983
+30984
+30985
+30986
+30987
+30988
+30989
+30990
+30991
+30992
+30993
+30994
+30995
+30996
+30997
+30998
+30999
+31000
+31001
+31002
+31003
+31004
+31005
+31006
+31007
+31008
+31009
+31010
+31011
+31012
+31013
+31014
+31015
+31016
+31017
+31018
+31019
+31020
+31021
+31022
+31023
+31024
+31025
+31026
+31027
+31028
+31029
+31030
+31031
+31032
+31033
+31034
+31035
+31036
+31037
+31038
+31039
+31040
+31041
+31042
+31043
+31044
+31045
+31046
+31047
+31048
+31049
+31050
+31051
+31052
+31053
+31054
+31055
+31056
+31057
+31058
+31059
+31060
+31061
+31062
+31063
+31064
+31065
+31066
+31067
+31068
+31069
+31070
+31071
+31072
+31073
+31074
+31075
+31076
+31077
+31078
+31079
+31080
+31081
+31082
+31083
+31084
+31085
+31086
+31087
+31088
+31089
+31090
+31091
+31092
+31093
+31094
+31095
+31096
+31097
+31098
+31099
+31100
+31101
+31102
+31103
+31104
+31105
+31106
+31107
+31108
+31109
+31110
+31111
+31112
+31113
+31114
+31115
+31116
+31117
+31118
+31119
+31120
+31121
+31122
+31123
+31124
+31125
+31126
+31127
+31128
+31129
+31130
+31131
+31132
+31133
+31134
+31135
+31136
+31137
+31138
+31139
+31140
+31141
+31142
+31143
+31144
+31145
+31146
+31147
+31148
+31149
+31150
+31151
+31152
+31153
+31154
+31155
+31156
+31157
+31158
+31159
+31160
+31161
+31162
+31163
+31164
+31165
+31166
+31167
+31168
+31169
+31170
+31171
+31172
+31173
+31174
+31175
+31176
+31177
+31178
+31179
+31180
+31181
+31182
+31183
+31184
+31185
+31186
+31187
+31188
+31189
+31190
+31191
+31192
+31193
+31194
+31195
+31196
+31197
+31198
+31199
+31200
+31201
+31202
+31203
+31204
+31205
+31206
+31207
+31208
+31209
+31210
+31211
+31212
+31213
+31214
+31215
+31216
+31217
+31218
+31219
+31220
+31221
+31222
+31223
+31224
+31225
+31226
+31227
+31228
+31229
+31230
+31231
+31232
+31233
+31234
+31235
+31236
+31237
+31238
+31239
+31240
+31241
+31242
+31243
+31244
+31245
+31246
+31247
+31248
+31249
+31250
+31251
+31252
+31253
+31254
+31255
+31256
+31257
+31258
+31259
+31260
+31261
+31262
+31263
+31264
+31265
+31266
+31267
+31268
+31269
+31270
+31271
+31272
+31273
+31274
+31275
+31276
+31277
+31278
+31279
+31280
+31281
+31282
+31283
+31284
+31285
+31286
+31287
+31288
+31289
+31290
+31291
+31292
+31293
+31294
+31295
+31296
+31297
+31298
+31299
+31300
+31301
+31302
+31303
+31304
+31305
+31306
+31307
+31308
+31309
+31310
+31311
+31312
+31313
+31314
+31315
+31316
+31317
+31318
+31319
+31320
+31321
+31322
+31323
+31324
+31325
+31326
+31327
+31328
+31329
+31330
+31331
+31332
+31333
+31334
+31335
+31336
+31337
+31338
+31339
+31340
+31341
+31342
+31343
+31344
+31345
+31346
+31347
+31348
+31349
+31350
+31351
+31352
+31353
+31354
+31355
+31356
+31357
+31358
+31359
+31360
+31361
+31362
+31363
+31364
+31365
+31366
+31367
+31368
+31369
+31370
+31371
+31372
+31373
+31374
+31375
+31376
+31377
+31378
+31379
+31380
+31381
+31382
+31383
+31384
+31385
+31386
+31387
+31388
+31389
+31390
+31391
+31392
+31393
+31394
+31395
+31396
+31397
+31398
+31399
+31400
+31401
+31402
+31403
+31404
+31405
+31406
+31407
+31408
+31409
+31410
+31411
+31412
+31413
+31414
+31415
+31416
+31417
+31418
+31419
+31420
+31421
+31422
+31423
+31424
+31425
+31426
+31427
+31428
+31429
+31430
+31431
+31432
+31433
+31434
+31435
+31436
+31437
+31438
+31439
+31440
+31441
+31442
+31443
+31444
+31445
+31446
+31447
+31448
+31449
+31450
+31451
+31452
+31453
+31454
+31455
+31456
+31457
+31458
+31459
+31460
+31461
+31462
+31463
+31464
+31465
+31466
+31467
+31468
+31469
+31470
+31471
+31472
+31473
+31474
+31475
+31476
+31477
+31478
+31479
+31480
+31481
+31482
+31483
+31484
+31485
+31486
+31487
+31488
+31489
+31490
+31491
+31492
+31493
+31494
+31495
+31496
+31497
+31498
+31499
+31500
+31501
+31502
+31503
+31504
+31505
+31506
+31507
+31508
+31509
+31510
+31511
+31512
+31513
+31514
+31515
+31516
+31517
+31518
+31519
+31520
+31521
+31522
+31523
+31524
+31525
+31526
+31527
+31528
+31529
+31530
+31531
+31532
+31533
+31534
+31535
+31536
+31537
+31538
+31539
+31540
+31541
+31542
+31543
+31544
+31545
+31546
+31547
+31548
+31549
+31550
+31551
+31552
+31553
+31554
+31555
+31556
+31557
+31558
+31559
+31560
+31561
+31562
+31563
+31564
+31565
+31566
+31567
+31568
+31569
+31570
+31571
+31572
+31573
+31574
+31575
+31576
+31577
+31578
+31579
+31580
+31581
+31582
+31583
+31584
+31585
+31586
+31587
+31588
+31589
+31590
+31591
+31592
+31593
+31594
+31595
+31596
+31597
+31598
+31599
+31600
+31601
+31602
+31603
+31604
+31605
+31606
+31607
+31608
+31609
+31610
+31611
+31612
+31613
+31614
+31615
+31616
+31617
+31618
+31619
+31620
+31621
+31622
+31623
+31624
+31625
+31626
+31627
+31628
+31629
+31630
+31631
+31632
+31633
+31634
+31635
+31636
+31637
+31638
+31639
+31640
+31641
+31642
+31643
+31644
+31645
+31646
+31647
+31648
+31649
+31650
+31651
+31652
+31653
+31654
+31655
+31656
+31657
+31658
+31659
+31660
+31661
+31662
+31663
+31664
+31665
+31666
+31667
+31668
+31669
+31670
+31671
+31672
+31673
+31674
+31675
+31676
+31677
+31678
+31679
+31680
+31681
+31682
+31683
+31684
+31685
+31686
+31687
+31688
+31689
+31690
+31691
+31692
+31693
+31694
+31695
+31696
+31697
+31698
+31699
+31700
+31701
+31702
+31703
+31704
+31705
+31706
+31707
+31708
+31709
+31710
+31711
+31712
+31713
+31714
+31715
+31716
+31717
+31718
+31719
+31720
+31721
+31722
+31723
+31724
+31725
+31726
+31727
+31728
+31729
+31730
+31731
+31732
+31733
+31734
+31735
+31736
+31737
+31738
+31739
+31740
+31741
+31742
+31743
+31744
+31745
+31746
+31747
+31748
+31749
+31750
+31751
+31752
+31753
+31754
+31755
+31756
+31757
+31758
+31759
+31760
+31761
+31762
+31763
+31764
+31765
+31766
+31767
+31768
+31769
+31770
+31771
+31772
+31773
+31774
+31775
+31776
+31777
+31778
+31779
+31780
+31781
+31782
+31783
+31784
+31785
+31786
+31787
+31788
+31789
+31790
+31791
+31792
+31793
+31794
+31795
+31796
+31797
+31798
+31799
+31800
+31801
+31802
+31803
+31804
+31805
+31806
+31807
+31808
+31809
+31810
+31811
+31812
+31813
+31814
+31815
+31816
+31817
+31818
+31819
+31820
+31821
+31822
+31823
+31824
+31825
+31826
+31827
+31828
+31829
+31830
+31831
+31832
+31833
+31834
+31835
+31836
+31837
+31838
+31839
+31840
+31841
+31842
+31843
+31844
+31845
+31846
+31847
+31848
+31849
+31850
+31851
+31852
+31853
+31854
+31855
+31856
+31857
+31858
+31859
+31860
+31861
+31862
+31863
+31864
+31865
+31866
+31867
+31868
+31869
+31870
+31871
+31872
+31873
+31874
+31875
+31876
+31877
+31878
+31879
+31880
+31881
+31882
+31883
+31884
+31885
+31886
+31887
+31888
+31889
+31890
+31891
+31892
+31893
+31894
+31895
+31896
+31897
+31898
+31899
+31900
+31901
+31902
+31903
+31904
+31905
+31906
+31907
+31908
+31909
+31910
+31911
+31912
+31913
+31914
+31915
+31916
+31917
+31918
+31919
+31920
+31921
+31922
+31923
+31924
+31925
+31926
+31927
+31928
+31929
+31930
+31931
+31932
+31933
+31934
+31935
+31936
+31937
+31938
+31939
+31940
+31941
+31942
+31943
+31944
+31945
+31946
+31947
+31948
+31949
+31950
+31951
+31952
+31953
+31954
+31955
+31956
+31957
+31958
+31959
+31960
+
+

+(* This generated code requires the following version of MenhirLib: *)
+
+let () =
+  MenhirLib.StaticVersion.require_20220210
+
+module MenhirBasics = struct
+  
+  exception Error
+  
+  let _eRR =
+    fun _s ->
+      raise Error
+  
+  type token = 
+    | XOROP
+    | XORASSIGN
+    | WRAPSUBOP
+    | WRAPSUBASSIGN
+    | WRAPPOWOP
+    | WRAPPOWASSIGN
+    | WRAPMULOP
+    | WRAPMULASSIGN
+    | WRAPADDOP
+    | WRAPADDASSIGN
+    | WITH
+    | WHILE
+    | VAR
+    | UNDERSCORE
+    | TYPE
+    | TRY
+    | TO_CANDID
+    | THROW
+    | TEXT of (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 38 "mo_frontend/parser.ml"
+  )
+    | SYSTEM
+    | SWITCH
+    | SUBOP
+    | SUB
+    | STABLE
+    | SHROP
+    | SHRASSIGN
+    | SHLOP
+    | SHLASSIGN
+    | SHARED
+    | SEMICOLON_EOL
+    | SEMICOLON
+    | RPAR
+    | ROTROP
+    | ROTRASSIGN
+    | ROTLOP
+    | ROTLASSIGN
+    | RETURN
+    | RCURLY
+    | RBRACKET
+    | QUEST
+    | QUERY
+    | PUBLIC
+    | PRIVATE
+    | PRIM
+    | POWOP
+    | POWASSIGN
+    | PLUSASSIGN
+    | PIPE
+    | OROP
+    | ORASSIGN
+    | OR
+    | OLD
+    | OBJECT
+    | NULL
+    | NOT
+    | NEQOP
+    | NAT of (
+# 230 "mo_frontend/parser.mly"
+      (string)
+# 80 "mo_frontend/parser.ml"
+  )
+    | MULOP
+    | MULASSIGN
+    | MODULE
+    | MODOP
+    | MODASSIGN
+    | MINUSASSIGN
+    | LTOP
+    | LT
+    | LPAR
+    | LOOP
+    | LET
+    | LEOP
+    | LCURLY
+    | LBRACKET
+    | LABEL
+    | INVARIANT
+    | IN
+    | IMPORT
+    | IMPLIES
+    | IGNORE
+    | IF
+    | ID of (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 106 "mo_frontend/parser.ml"
+  )
+    | HASH
+    | GTOP
+    | GT
+    | GEOP
+    | FUNC
+    | FROM_CANDID
+    | FOR
+    | FLOAT of (
+# 231 "mo_frontend/parser.mly"
+      (string)
+# 118 "mo_frontend/parser.ml"
+  )
+    | FLEXIBLE
+    | EQOP
+    | EQ
+    | EOF
+    | ELSE
+    | DOT_NUM of (
+# 229 "mo_frontend/parser.mly"
+      (string)
+# 128 "mo_frontend/parser.ml"
+  )
+    | DOT
+    | DO
+    | DIVOP
+    | DIVASSIGN
+    | DISALLOWED
+    | DEBUG_SHOW
+    | DEBUG
+    | CONTINUE
+    | COMPOSITE
+    | COMMA
+    | COLON
+    | CLASS
+    | CHAR of (
+# 232 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 145 "mo_frontend/parser.ml"
+  )
+    | CATCH
+    | CATASSIGN
+    | CASE
+    | BREAK
+    | BOOL of (
+# 233 "mo_frontend/parser.mly"
+      (bool)
+# 154 "mo_frontend/parser.ml"
+  )
+    | BANG
+    | AWAITSTAR
+    | AWAIT
+    | ASYNCSTAR
+    | ASYNC
+    | ASSIGN
+    | ASSERT
+    | ARROW
+    | ANDOP
+    | ANDASSIGN
+    | AND
+    | ADDOP
+    | ACTOR
+  
+end
+
+include MenhirBasics
+
+# 1 "mo_frontend/assertions.mly"
+  
+
+let verification_syntax_error at code msg =
+  Diag.add_msg (Option.get !Parser_lib.msg_store)
+    (Diag.error_message at code "verification syntax" msg)
+
+(* Verification mode only *)
+
+let (&&&) cond (action : Mo_def.Syntax.exp) =
+  if not cond then
+    verification_syntax_error
+      action.Source.at
+      "M0181" "verification assertions not permitted in normal mode";
+  action
+
+let is_verification () =
+  match !Parser_lib.mode with
+  | None -> assert false
+  | Some mode -> mode.Lexer_lib.verification
+
+
+# 196 "mo_frontend/parser.ml"
+
+# 1 "mo_frontend/parser.mly"
+  
+open Mo_def
+open Mo_types
+open Mo_values
+
+open Syntax
+open Source
+open Operator
+open Parser_lib
+
+
+(* Position handling *)
+
+let position_to_pos position =
+  { file = position.Lexing.pos_fname;
+    line = position.Lexing.pos_lnum;
+    column = position.Lexing.pos_cnum - position.Lexing.pos_bol
+  }
+
+let positions_to_region position1 position2 =
+  { left = position_to_pos position1;
+    right = position_to_pos position2
+  }
+
+let at (startpos, endpos) = positions_to_region startpos endpos
+
+let syntax_error at code msg =
+  Diag.add_msg (Option.get !msg_store)
+    (Diag.error_message at code "syntax" msg)
+
+(* Helpers *)
+
+let scope_bind x at =
+  { var = Type.scope_var x @@ at;
+    sort = Type.Scope @@ at;
+    bound = PrimT "Any" @! at
+  } @= at
+
+let ensure_scope_bind var tbs =
+  match tbs with
+  | tb::_ when tb.it.sort.it = Type.Scope -> tbs
+  | _ -> scope_bind var no_region :: tbs
+
+let ensure_async_typ t_opt =
+  match t_opt with
+  | None -> t_opt
+  | Some { it = AsyncT _; _} -> t_opt
+  | Some t -> Some (AsyncT(Type.Fut, scopeT no_region, t) @! no_region)
+
+let funcT (sort, tbs, t1, t2) =
+  match sort.it, t2.it with
+  | Type.Local, AsyncT _ -> FuncT (sort, ensure_scope_bind "" tbs, t1, t2)
+  | Type.Shared _, _ -> FuncT (sort, ensure_scope_bind "" tbs, t1, t2)
+  | _ -> FuncT(sort, tbs, t1, t2)
+
+
+let dup_var x = VarE (x.it @@ x.at) @? x.at
+
+let name_exp e =
+  match e.it with
+  | VarE x -> [], e, dup_var x
+  | _ ->
+    let x = anon_id "val" e.at @@ e.at in
+    [LetD (VarP x @! x.at, e, None) @? e.at], dup_var x, dup_var x
+
+let assign_op lhs rhs_f at =
+  let ds, lhs', rhs' =
+    match lhs.it with
+    | VarE x -> [], lhs, dup_var x
+    | DotE (e1, x) ->
+      let ds, ex11, ex12 = name_exp e1 in
+      ds, DotE (ex11, x) @? lhs.at, DotE (ex12, x.it @@ x.at) @? lhs.at
+    | IdxE (e1, e2) ->
+      let ds1, ex11, ex12 = name_exp e1 in
+      let ds2, ex21, ex22 = name_exp e2 in
+      ds1 @ ds2, IdxE (ex11, ex21) @? lhs.at, IdxE (ex12, ex22) @? lhs.at
+    | _ ->
+      name_exp lhs
+  in
+  let e = AssignE (lhs', rhs_f rhs') @? at in
+  match ds with
+  | [] -> e
+  | ds -> BlockE (ds @ [ExpD e @? e.at]) @? at
+
+let annot_exp e t_opt =
+  match t_opt with
+  | None -> e
+  | Some t -> AnnotE(e, t) @? span t.at e.at
+
+let annot_pat p t_opt =
+  match t_opt with
+  | None -> p
+  | Some t -> AnnotP(p, t) @! span t.at p.at
+
+
+let rec normalize_let p e =
+    match p.it with
+    | AnnotP(p', t) -> p', AnnotE(e, t) @? p.at
+    | ParP p' -> normalize_let p' e
+    | _ -> (p, e)
+
+let let_or_exp named x e' at =
+  if named
+  then LetD(VarP(x) @! at, e' @? at, None) @? at
+       (* If you change the above regions,
+          modify is_sugared_func_or_module to match *)
+  else ExpD(e' @? at) @? at
+
+let is_sugared_func_or_module dec = match dec.it with
+  | LetD({it = VarP _; _} as pat, exp, None) ->
+    dec.at = pat.at && pat.at = exp.at &&
+    (match exp.it with
+    | ObjBlockE (sort, _) ->
+      sort.it = Type.Module
+    | FuncE _ ->
+      true
+    | _ -> false
+    )
+  | _ -> false
+
+
+let func_exp f s tbs p t_opt is_sugar e =
+  match s.it, t_opt, e with
+  | Type.Local, Some {it = AsyncT _; _}, {it = AsyncE _; _}
+  | Type.Shared _, _, _ ->
+    FuncE(f, s, ensure_scope_bind "" tbs, p, t_opt, is_sugar, e)
+  | _ ->
+    FuncE(f, s, tbs, p, t_opt, is_sugar, e)
+
+let desugar_func_body sp x t_opt (is_sugar, e) =
+  if not is_sugar then
+    false, e (* body declared as EQ e *)
+  else (* body declared as immediate block *)
+    match sp.it, t_opt with
+    | _, Some {it = AsyncT (s, _, _); _} ->
+      true, asyncE s (scope_bind x.it e.at) e
+    | Type.Shared _, (None | Some { it = TupT []; _}) ->
+      true, ignore_asyncE (scope_bind x.it e.at) e
+    | _, _ -> (true, e)
+
+
+let share_typ t =
+  match t.it with
+  | FuncT ({it = Type.Local; _} as s, tbs, t1, t2) ->
+    { t with it = funcT ({s with it = Type.Shared Type.Write}, tbs, t1, t2)}
+  | _ -> t
+
+let share_typfield' = function
+  | TypF (c, tps, t) -> TypF (c, tps, t)
+  | ValF (x, t, m) -> ValF (x, share_typ t, m)
+
+let share_typfield (tf : typ_field) = { tf with it = share_typfield' tf.it }
+
+let share_exp e =
+  match e.it with
+  | FuncE (x, ({it = Type.Local; _} as sp), tbs, p,
+    ((None | Some { it = TupT []; _ }) as t_opt), true, e) ->
+    func_exp x {sp with it = Type.Shared (Type.Write, WildP @! sp.at)} tbs p t_opt true (ignore_asyncE (scope_bind x e.at) e) @? e.at
+  | FuncE (x, ({it = Type.Local; _} as sp), tbs, p, t_opt, s, e) ->
+    func_exp x {sp with it = Type.Shared (Type.Write, WildP @! sp.at)} tbs p t_opt s e @? e.at
+  | _ -> e
+
+let share_dec d =
+  match d.it with
+  | LetD (p, e, f) -> LetD (p, share_exp e, f) @? d.at
+  | _ -> d
+
+let share_stab stab_opt dec =
+  match stab_opt with
+  | None ->
+    (match dec.it with
+     | VarD _
+     | LetD _ ->
+       Some (Flexible @@ dec.at)
+     | _ -> None)
+  | _ -> stab_opt
+
+let share_dec_field (df : dec_field) =
+  match df.it.vis.it with
+  | Public _ ->
+    {df with it = {df.it with
+      dec = share_dec df.it.dec;
+      stab = share_stab df.it.stab df.it.dec}}
+  | _ ->
+    if is_sugared_func_or_module (df.it.dec) then
+      {df with it =
+        {df.it with stab =
+          match df.it.stab with
+          | None -> Some (Flexible @@ df.it.dec.at)
+          | some -> some}
+      }
+    else df
+
+and objblock s dec_fields =
+  List.iter (fun df ->
+    match df.it.vis.it, df.it.dec.it with
+    | Public _, ClassD (_, id, _, _, _, _, _, _) when is_anon_id id ->
+      syntax_error df.it.dec.at "M0158" "a public class cannot be anonymous, please provide a name"
+    | _ -> ()) dec_fields;
+  ObjBlockE(s, dec_fields)
+
+
+# 401 "mo_frontend/parser.ml"
+
+module Tables = struct
+  
+  include MenhirBasics
+  
+  let token2terminal : token -> int =
+    fun _tok ->
+      match _tok with
+      | ACTOR ->
+          124
+      | ADDOP ->
+          123
+      | AND ->
+          122
+      | ANDASSIGN ->
+          121
+      | ANDOP ->
+          120
+      | ARROW ->
+          119
+      | ASSERT ->
+          118
+      | ASSIGN ->
+          117
+      | ASYNC ->
+          116
+      | ASYNCSTAR ->
+          115
+      | AWAIT ->
+          114
+      | AWAITSTAR ->
+          113
+      | BANG ->
+          112
+      | BOOL _ ->
+          111
+      | BREAK ->
+          110
+      | CASE ->
+          109
+      | CATASSIGN ->
+          108
+      | CATCH ->
+          107
+      | CHAR _ ->
+          106
+      | CLASS ->
+          105
+      | COLON ->
+          104
+      | COMMA ->
+          103
+      | COMPOSITE ->
+          102
+      | CONTINUE ->
+          101
+      | DEBUG ->
+          100
+      | DEBUG_SHOW ->
+          99
+      | DISALLOWED ->
+          98
+      | DIVASSIGN ->
+          97
+      | DIVOP ->
+          96
+      | DO ->
+          95
+      | DOT ->
+          94
+      | DOT_NUM _ ->
+          93
+      | ELSE ->
+          92
+      | EOF ->
+          91
+      | EQ ->
+          90
+      | EQOP ->
+          89
+      | FLEXIBLE ->
+          88
+      | FLOAT _ ->
+          87
+      | FOR ->
+          86
+      | FROM_CANDID ->
+          85
+      | FUNC ->
+          84
+      | GEOP ->
+          83
+      | GT ->
+          82
+      | GTOP ->
+          81
+      | HASH ->
+          80
+      | ID _ ->
+          79
+      | IF ->
+          78
+      | IGNORE ->
+          77
+      | IMPLIES ->
+          76
+      | IMPORT ->
+          75
+      | IN ->
+          74
+      | INVARIANT ->
+          73
+      | LABEL ->
+          72
+      | LBRACKET ->
+          71
+      | LCURLY ->
+          70
+      | LEOP ->
+          69
+      | LET ->
+          68
+      | LOOP ->
+          67
+      | LPAR ->
+          66
+      | LT ->
+          65
+      | LTOP ->
+          64
+      | MINUSASSIGN ->
+          63
+      | MODASSIGN ->
+          62
+      | MODOP ->
+          61
+      | MODULE ->
+          60
+      | MULASSIGN ->
+          59
+      | MULOP ->
+          58
+      | NAT _ ->
+          57
+      | NEQOP ->
+          56
+      | NOT ->
+          55
+      | NULL ->
+          54
+      | OBJECT ->
+          53
+      | OLD ->
+          52
+      | OR ->
+          51
+      | ORASSIGN ->
+          50
+      | OROP ->
+          49
+      | PIPE ->
+          48
+      | PLUSASSIGN ->
+          47
+      | POWASSIGN ->
+          46
+      | POWOP ->
+          45
+      | PRIM ->
+          44
+      | PRIVATE ->
+          43
+      | PUBLIC ->
+          42
+      | QUERY ->
+          41
+      | QUEST ->
+          40
+      | RBRACKET ->
+          39
+      | RCURLY ->
+          38
+      | RETURN ->
+          37
+      | ROTLASSIGN ->
+          36
+      | ROTLOP ->
+          35
+      | ROTRASSIGN ->
+          34
+      | ROTROP ->
+          33
+      | RPAR ->
+          32
+      | SEMICOLON ->
+          31
+      | SEMICOLON_EOL ->
+          30
+      | SHARED ->
+          29
+      | SHLASSIGN ->
+          28
+      | SHLOP ->
+          27
+      | SHRASSIGN ->
+          26
+      | SHROP ->
+          25
+      | STABLE ->
+          24
+      | SUB ->
+          23
+      | SUBOP ->
+          22
+      | SWITCH ->
+          21
+      | SYSTEM ->
+          20
+      | TEXT _ ->
+          19
+      | THROW ->
+          18
+      | TO_CANDID ->
+          17
+      | TRY ->
+          16
+      | TYPE ->
+          15
+      | UNDERSCORE ->
+          14
+      | VAR ->
+          13
+      | WHILE ->
+          12
+      | WITH ->
+          11
+      | WRAPADDASSIGN ->
+          10
+      | WRAPADDOP ->
+          9
+      | WRAPMULASSIGN ->
+          8
+      | WRAPMULOP ->
+          7
+      | WRAPPOWASSIGN ->
+          6
+      | WRAPPOWOP ->
+          5
+      | WRAPSUBASSIGN ->
+          4
+      | WRAPSUBOP ->
+          3
+      | XORASSIGN ->
+          2
+      | XOROP ->
+          1
+  
+  and error_terminal =
+    0
+  
+  and token2value : token -> Obj.t =
+    fun _tok ->
+      match _tok with
+      | ACTOR ->
+          Obj.repr ()
+      | ADDOP ->
+          Obj.repr ()
+      | AND ->
+          Obj.repr ()
+      | ANDASSIGN ->
+          Obj.repr ()
+      | ANDOP ->
+          Obj.repr ()
+      | ARROW ->
+          Obj.repr ()
+      | ASSERT ->
+          Obj.repr ()
+      | ASSIGN ->
+          Obj.repr ()
+      | ASYNC ->
+          Obj.repr ()
+      | ASYNCSTAR ->
+          Obj.repr ()
+      | AWAIT ->
+          Obj.repr ()
+      | AWAITSTAR ->
+          Obj.repr ()
+      | BANG ->
+          Obj.repr ()
+      | BOOL _v ->
+          Obj.repr _v
+      | BREAK ->
+          Obj.repr ()
+      | CASE ->
+          Obj.repr ()
+      | CATASSIGN ->
+          Obj.repr ()
+      | CATCH ->
+          Obj.repr ()
+      | CHAR _v ->
+          Obj.repr _v
+      | CLASS ->
+          Obj.repr ()
+      | COLON ->
+          Obj.repr ()
+      | COMMA ->
+          Obj.repr ()
+      | COMPOSITE ->
+          Obj.repr ()
+      | CONTINUE ->
+          Obj.repr ()
+      | DEBUG ->
+          Obj.repr ()
+      | DEBUG_SHOW ->
+          Obj.repr ()
+      | DISALLOWED ->
+          Obj.repr ()
+      | DIVASSIGN ->
+          Obj.repr ()
+      | DIVOP ->
+          Obj.repr ()
+      | DO ->
+          Obj.repr ()
+      | DOT ->
+          Obj.repr ()
+      | DOT_NUM _v ->
+          Obj.repr _v
+      | ELSE ->
+          Obj.repr ()
+      | EOF ->
+          Obj.repr ()
+      | EQ ->
+          Obj.repr ()
+      | EQOP ->
+          Obj.repr ()
+      | FLEXIBLE ->
+          Obj.repr ()
+      | FLOAT _v ->
+          Obj.repr _v
+      | FOR ->
+          Obj.repr ()
+      | FROM_CANDID ->
+          Obj.repr ()
+      | FUNC ->
+          Obj.repr ()
+      | GEOP ->
+          Obj.repr ()
+      | GT ->
+          Obj.repr ()
+      | GTOP ->
+          Obj.repr ()
+      | HASH ->
+          Obj.repr ()
+      | ID _v ->
+          Obj.repr _v
+      | IF ->
+          Obj.repr ()
+      | IGNORE ->
+          Obj.repr ()
+      | IMPLIES ->
+          Obj.repr ()
+      | IMPORT ->
+          Obj.repr ()
+      | IN ->
+          Obj.repr ()
+      | INVARIANT ->
+          Obj.repr ()
+      | LABEL ->
+          Obj.repr ()
+      | LBRACKET ->
+          Obj.repr ()
+      | LCURLY ->
+          Obj.repr ()
+      | LEOP ->
+          Obj.repr ()
+      | LET ->
+          Obj.repr ()
+      | LOOP ->
+          Obj.repr ()
+      | LPAR ->
+          Obj.repr ()
+      | LT ->
+          Obj.repr ()
+      | LTOP ->
+          Obj.repr ()
+      | MINUSASSIGN ->
+          Obj.repr ()
+      | MODASSIGN ->
+          Obj.repr ()
+      | MODOP ->
+          Obj.repr ()
+      | MODULE ->
+          Obj.repr ()
+      | MULASSIGN ->
+          Obj.repr ()
+      | MULOP ->
+          Obj.repr ()
+      | NAT _v ->
+          Obj.repr _v
+      | NEQOP ->
+          Obj.repr ()
+      | NOT ->
+          Obj.repr ()
+      | NULL ->
+          Obj.repr ()
+      | OBJECT ->
+          Obj.repr ()
+      | OLD ->
+          Obj.repr ()
+      | OR ->
+          Obj.repr ()
+      | ORASSIGN ->
+          Obj.repr ()
+      | OROP ->
+          Obj.repr ()
+      | PIPE ->
+          Obj.repr ()
+      | PLUSASSIGN ->
+          Obj.repr ()
+      | POWASSIGN ->
+          Obj.repr ()
+      | POWOP ->
+          Obj.repr ()
+      | PRIM ->
+          Obj.repr ()
+      | PRIVATE ->
+          Obj.repr ()
+      | PUBLIC ->
+          Obj.repr ()
+      | QUERY ->
+          Obj.repr ()
+      | QUEST ->
+          Obj.repr ()
+      | RBRACKET ->
+          Obj.repr ()
+      | RCURLY ->
+          Obj.repr ()
+      | RETURN ->
+          Obj.repr ()
+      | ROTLASSIGN ->
+          Obj.repr ()
+      | ROTLOP ->
+          Obj.repr ()
+      | ROTRASSIGN ->
+          Obj.repr ()
+      | ROTROP ->
+          Obj.repr ()
+      | RPAR ->
+          Obj.repr ()
+      | SEMICOLON ->
+          Obj.repr ()
+      | SEMICOLON_EOL ->
+          Obj.repr ()
+      | SHARED ->
+          Obj.repr ()
+      | SHLASSIGN ->
+          Obj.repr ()
+      | SHLOP ->
+          Obj.repr ()
+      | SHRASSIGN ->
+          Obj.repr ()
+      | SHROP ->
+          Obj.repr ()
+      | STABLE ->
+          Obj.repr ()
+      | SUB ->
+          Obj.repr ()
+      | SUBOP ->
+          Obj.repr ()
+      | SWITCH ->
+          Obj.repr ()
+      | SYSTEM ->
+          Obj.repr ()
+      | TEXT _v ->
+          Obj.repr _v
+      | THROW ->
+          Obj.repr ()
+      | TO_CANDID ->
+          Obj.repr ()
+      | TRY ->
+          Obj.repr ()
+      | TYPE ->
+          Obj.repr ()
+      | UNDERSCORE ->
+          Obj.repr ()
+      | VAR ->
+          Obj.repr ()
+      | WHILE ->
+          Obj.repr ()
+      | WITH ->
+          Obj.repr ()
+      | WRAPADDASSIGN ->
+          Obj.repr ()
+      | WRAPADDOP ->
+          Obj.repr ()
+      | WRAPMULASSIGN ->
+          Obj.repr ()
+      | WRAPMULOP ->
+          Obj.repr ()
+      | WRAPPOWASSIGN ->
+          Obj.repr ()
+      | WRAPPOWOP ->
+          Obj.repr ()
+      | WRAPSUBASSIGN ->
+          Obj.repr ()
+      | WRAPSUBOP ->
+          Obj.repr ()
+      | XORASSIGN ->
+          Obj.repr ()
+      | XOROP ->
+          Obj.repr ()
+  
+  and default_reduction =
+    (16, "\001\215\000\000\000\000\001}\001c\001^\001`\000\000\000\000\001a\001b\001_\001\135\000\000\001\134\000\000\000\000\000\000\000\000\000\000\001k\000\000\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\249\000\000\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\000\001\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\001\246\000\000\000\000\000\000\000\000\000\000\001\253\001\248\001\250\001\245\002\000\000\000\000\000\000\000\000\000\001\232\001\233\001\216\000\000\000\000\000\000\000\000\001\217\000\000\001\185\000\000\001\219\000\000\001\137\001n\001\242\001\251\001\240\000\000\000\000\001\239\000\000\001\244\000\000\001\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\000\000\001\255\000\000\000\000\000\000\000\000\000\000\001\203\000\000\001\202\001\209\000\000\001\208\000\000\000\000\001\196\000\000\001\195\000\000\002\003\000\000\001\247\000\000\000\000\001\234\000\000\001\252\000\000\000\000\000\000\000\000\000\000\001\238\000\000\000\000\001\237\000\000\000\000\000\000\000\000\000\000\000\000\001\199\000\000\001\241\002\001\000\000\000\000\000\000\000\000\000\000\001\236\000\000\000\000\001\235\000\000\000\000\000\000\001~\000\000\000\000\001y\001\131\001\127\000\000\001\133\001t\001\129\000\000\000\000\001u\000\000\000\000\001x\000\000\001z\000\000\000\000\001\178\000\000\001\177\001\132\000\000\001\128\000\000\000\000\001\174\000\000\001g\000\000\001Z\001[\000\000\001o\000\000\000\000\001\171\000\000\001\170\000\001\001\215\000\000\000\000\000\000\000\000\001\"\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001\030\001&\001\031\001d\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\007\002\006\002\005\000\000\001\212\001\211\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\012\000\r\000S\000\000\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000P\000\000\000\000\000R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000[\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000X\000\000\000\000\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\214\000\000\000\000\001\143\000\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000\000\000\000\000\000\000\000\0001\000\000\000\000\0000\000\000\000\000\0002\000\000\000\023\000\000\000\000\000\000\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000;\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\000\000\000\0008\000\000\000\000\000:\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001K\000\000\000\000\000\000\000\000\001S\001M\000\000\000\000\000\000\001]\000\000\000\000\000\000\001\028\000\000\001A\0011\000\000\000\000\001E\000\000\001B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\027\000\000\000\000\001<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\001\r\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000c\000\000\000\000\000\000\000\000\000\000\000\000\000a\000\000\000\000\000`\000\000\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000h\000\000\000\000\000j\000\000\000\000\000\000\000\000\000\000\000\000\000+\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\000\000\000\000(\000\000\000\000\000*\000\000\000\000\000\000\000\000\000\000\000\000\000_\000\000\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000\\\000\000\000\000\000^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000g\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000\000\000d\000\000\000\000\000f\000\000\000\000\000\000\000\000\000\000\000\000\000/\000\000\000\000\000\000\000\000\000\000\000\000\000-\000\000\000\000\000,\000\000\000\000\000.\000\000\000\000\001\000\001i\000\000\000\000\000\000\000\221\000\220\000\007\000\000\001F\000\000\000\000\000\208\000\000\000\000\000\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\0004\000\000\000\000\0006\000\000\000\025\001D\000q\000\000\000\000\000\000\001\026\001(\000m\001\021\000\252\000\000\000\000\000\143\000\000\000\000\000\153\000\000\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\251\000\178\000n\001\022\000\177\001\025\000\000\000\250\000\000\000\000\000\000\001\015\000\000\001\018\000\000\000\000\000\000\001\019\000\000\001\016\000\000\001\017\000\254\000\000\000o\001\023\000\000\000\000\000\000\000\000\000\242\000p\001\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\239\000\000\000\238\000\000\000\000\000\000\000\236\000\000\000\000\000\000\000\244\000\000\000\243\000\000\000\246\000\000\000\245\000\000\000\235\000\000\000\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\232\000\000\000\234\000\000\000\231\000\000\000\000\000\000\000\170\000\000\000\233\000\000\000\247\000\000\000\229\000\000\000\240\000\193\000\000\000\000\000\000\000\188\000\000\000{\000\000\000\190\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\187\000\000\000\000\000\000\000\000\000\000\000\195\000\000\000\000\000\000\000\194\000\000\000\000\000\000\000\197\000\000\000\000\000\000\000\196\000\000\000w\000\000\000\186\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\183\000\000\000\000\000\000\000\185\000\000\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\184\000\000\000\140\000\000\000\198\000\000\000\180\000\000\000\000\000\000\000\191\000\000\000\000\000\000\000\000\000\000\001+\001,\000\000\001-\001/\000\000\001.\000\222\000\000\000\225\000\000\000\000\000\000\000\226\000\000\000\223\000\000\000\224\000\205\000\201\000\202\000\203\000\204\000\209\000\253\000\000\000\000\000\218\001\002\000\000\000\000\001\011\001X\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\028\000\000\000\000\000\030\000\000\000\000\000\211\000\219\000\206\000\000\000\000\000\217\000\000\000\000\001\004\000\000\001*\000\000\000\000\001\164\000\000\001)\000\000\000\000\000\000\0010\000\000\001'\000\000\000\000\001\157\000\227\001\012\000\000\0014\0015\000\000\0016\0018\000\000\0017\001U\001W\001=\000\255\000\019\000\200\000\000\000\000\001\n\000\000\0013\000\000\0012\001?\000\213\001\020\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\b\000\016\000\014\000\015\000\000\000\000\001\150\000\000\001\149\000'\000\000\000\000\000\000\000\000\000\000\000\000\000%\000\000\000\000\000$\000\000\000\000\000&\000\000\000\000\000\000\000\000\000\000\000\000\000O\000\000\000\000\000\000\000\000\000\000\000\000\000M\000\000\000\000\000L\000\000\000\000\000N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\000\000\000\000\000\000\000\000\000\000\000\000\000U\000\000\000\000\000T\000\000\000\000\000V\000\249\000\018\000\000\001e\000\000\000\000\001\154\000\000\001\153\000C\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000@\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000K\000\000\000\000\000\000\000\000\000\000\000\000\000I\000\000\000\000\000H\000\000\000\000\000J\000\000\000\000\000\000\000\000\000\000\000\000\000#\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000\000 \000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000<\000\000\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000D\000\000\000\000\000F\000\000\001G\000\000\000\000\000\000\000\n\000\212\000\215\000\t\000\000\001\007\000\176\000\000\000\000\000\000\000\175\000\000\001#\000\000\000\000\000\000\000\000\001%\000\000\000\000\001\206\000\000\000\000\001\161\000\000\001\160\000\000\001\205\000\000\000\000\000\000\001$\000\000\000\000\001\139\001C\001\006\000\000\000\000\000\000\000\000\0019\001Q\001T\001P\001L\001N\001@\000\000\001\005\000l\000\000\001\b\000\000\001V\001R\001O\000\000\001p\000\002\001\215\000\000\000\000\000\000\001q\000\000\000\000\001\146\000\000\000\000\001\167\000\003\001\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\192\000\000\001\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\182\000\000\001\181\000\000\001r\000\004")
+  
+  and error =
+    (125, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\000\132\000\000\000\000\144\b\128@@\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000B@\016\016\000H\004@0 \000\004 \002\000\000\016\000\000\000\002@\000\000\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001 \000\000\000\128\000\016\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000B@\000\016\000H\004@0 \000\004 \002\000\000\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\001\000\004\000\000\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\001\128\000\000\198\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\012` \000\000\000\000\000\000\000\000\000\000\128\000\000#\001\000\000\000\000\000\000\000\000\000$\006@ C\024\b\000\000\016\000\192@\000\000\000\000 \000\000\024\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\016\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000(\000\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\0020\016\000\000\000\000\000\000\002\128\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000@\000@\012\128@\1340\016\000\000 \001\128\128\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000c\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\001\000\000\000F\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000\000\017\000\129\004` \000\000\000\003\001\000\000\000\000\000\136\004\b#\001\000\000\000\000\024\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\253\254\207\255\249\255\255\255\245\255\239\127\255o\255\000\000\000\004\000\200\004\bc\001 \000\002\000\024\011\255\127\179\255\254\127\255\253\253\127\251\207\255\219\255\192\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\004\000\000\128\000\000\000\128\025\000\129\012` \000\000@\003\001`\015\246\007\135\201\031I;\167\1759?\243z8\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\001\144\b\016\198\002@\000\004\0000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000 \001\000\000\000\000\000\000\000\000\002\000\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\012\b\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\012` \000\000\016\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\b\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\001\129\000\b\000\000\000\000\000\000\000\000\016\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000`@\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\192\128\004\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\192\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\128\000\000\000\000\000\000\000\000\000\000\000\n\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\128\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\b\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\001\000\000 \000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\b\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\002\000\000\000\016\012\000\t\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\001\000\000 \000\000\000\000\000\002\000\000@\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\002@d\002\0041\128\128\000\001\000\012\004\000\000\000\002\000\000@\000\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\017\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`pl\145\244\147\184x\242\019\2307\163\128\000\000\001\129\000\000\000\000\000\000\016\000\000\000\001\000\bH\000\002\000\t\000\136\006\004\000\000\132\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\016\128\028\016\000\146\001\017\b\t\000\r\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001 \000\000\000\128\000\016\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\016\000\128\000\001\000\001\000\004\000\000\016\000\132\128\000 \000\144\b\128`@\000\b@\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\001\193\000\b\000\000\016\000\016\000\192\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\000\000\000\000\012\000\000\016\000\132\128  \000\144\b\128`@\000\b@\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\014\t\146\030\146w\015\030\"<\198\2446\000\255`@L\144\244\147\185x\241\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238^<Dy\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\229\227\196G\152\222\134\192\031\236\b\t\146\030\146w\015\030\"<\198\2446\000% \000\b\1444\0180\024P\001\002\016\001\176\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000`\015\246\004\132\201\015I;\135\143\001\030cz\024\000\016\128\000\000@\018\001\016\b\b\000\001\b\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`HL\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\016\003 \016!\140\004\000\000\b\000` \001\000\000p`\002\000\000\000\000\003\000\"\000\004\000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000@\000\028\024\000\128\000\000\000\000\192\b\128\001\024\003\253\129\0012C\210N\225\227\192O\152\222\134\192\004\164\000\001\018\006\130F\003\n\000 B\0006\000% \000\b\1444\0180\024P\001\002\016\001\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\128\tH\000\002$\r\004\140\006\020\000@\132\000l\000J@\000\017 h$`0\160\002\004 \003`\002R\000\000\137\003A#\001\133\000\016!\000\027\000\127\240$&HzI\220<x\b\243\027\208\216\003\253\129\0012C\210N\225\227\192O\152\222\134\192\004\164\000\001\018\006\130F\003\n\000 B\0000\000a\000\000 \128$\0020\016\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\012\b\000\000\000\000\000\000\128\002\000\000\000\000\000\000`@\000\000\000\000\000\004\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\016\128\000\000@\018\001\016\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000\000\000\016\128\000\000\000\018\001\016\b\b\000\001\b\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\004 \000\000\016\004\128D\002\002\000\000B\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000`\015\246\004\132\201\015I;\135\143\001\030cz\024\000\016\128\000\002\0002A\000\bH\000\019\b\000@\000\132\000\000\000\001\146\b\000B@\000\024@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\128\000\000\128\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\006\000\255\232@o\144\244\147\184x\248\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\132\004\201\015I;\135\143\129\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2447\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\128\001\b\000\000\000\003$\016\000\132\128\0000\128\004\000\000\000\000\000\000\016 \000\000 \000\001\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\b\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\006\000\255`@l\144\244\147\184x\240\017\2307\161\176\007\251\002\002d\135\164\157\195\199\128\1591\189\r\128?\216\016\019$=$\238\030<\004\249\141\232`\000B\000\000\001\000H\004@  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\216\003\253\129\001rC\210N\225\227\192G\152\222\134\192\023\236\b\011\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000 \016\002\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\004\000\128\001\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\208\000\132\128\000 \000\144\b\128`@\000\b@\004\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\251\141\232l\001\254\192\128\153!\233'p\241\224'\204oC`\002R\000\000\137\003A#\001\133\000\016!\000\024\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\031\250\132\158\254\195\252\189\233\130tV0nA<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\128\tH\000\002$\r\004\140\006\020\000@\132\000`\000\002\000\000\000\000H\004\000\000 \000\004 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\250\132\158\254\195\252\189\249\194tW\176na<\000\000\000\b\001\144\b\016\198\002@\000\004\0000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232l\001\254\192\128\153!\233'p\241\224'\204oC\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\148\128\000\"@\208H\192a@\004\b@\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1591\189\r\128\tH\000\002$\r\004\140\006\020\000@\132\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002R\000\000\137\003A#\001\133\000\016!\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\255\129!2C\210N\225\227\192G\152\222\134\000\004 \000\000\016\004\128B\002\002\000@B\000\006\000\255`@\\\144\244\147\184x\240\017\2307\161\176\005\251\002\002\228\135\164\157\195\199\128\1431\189\012\000\b@\000\000 \t\000\136\004\004\000\000\132\000\012\001\254\192\128\153!\233'p\241\224'\204oC`\015\246\004\004\201\015I;\135\143\001>cz\024\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\184\222\134\192\031\236\b\t\146\030\146w\015\030\002|\198\2446\000\255`@L\144\244\147\184x\240\019\2307\161\128\001\b\000\000\004\001 \017\000\128\128\000\016\128\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\003\255P\147\223\216\127\151\1890N\138\198\r\200'\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\192\002\002\000\000B\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\128\004$\000\001\000\004\128D\003\002\000\000B\000 \000\000\000\000\000\000\000\000\002\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\002\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\192\004\164\000\001\018\006\130F\003\n\000 B\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\000\bH\000\002\000\t\000\136\006\004\000\000\132\000@\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000d\130\000\016\144\000\006\016\000\128\000\000\000\000\000\002\004\000\000\004\000\000 \000\004\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000B\000\000\000\000H\012\000  \000\004 \000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\136\004\004\128\002\132\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000!\000\000\000\000$\006\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\196\002\002@\001B\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@b\001\001 \000\161\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 0\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\020 \007\006\016\004\128D\002\0020\002b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\016\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\002\132\000\224\194\000\144\b\128@F\000L@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\176\007\251\002\002d\135\164\157\195\199\128\1591\189\r\128?\216\016\019$=$\238\030<\004\249\141\232l\001\254\192\128\153!\233'p\241\224'\204oC`\015\246\004\004\201\015I;\135\143\001>\227z\024\000\000@\000 \000\002\000\002\000@\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\192\004\164\000\001\018\006\130F\003\n\000 B\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001 \017\000\128\144\0000\128\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@b\001\001 \000\161\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255P\147\223\216\127\151\1918N\138\246\r\204'\152\003\253\129\0012C\210N\225\227\192G\152\222\134\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\018\144\000\004H\026\t\024\012(\000\129\b\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\b\174\172\031\194\222\016#Ac\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\127\176 &HzI\220<x\b\243\027\208\216\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002}\198\2440\000\000\128\000@\000\004\000\004\000\128\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\144\b\128@H\000\024@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\253\000O\127`\254\006\224\001\016\003\0243\000\158`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000% \000\b\1444\0180\024P\001\002\016\001\191\244\001=\253\131\248\027\128\004@\012`\204\002y\128\tH\000\002$\r\004\140\006\020\000@\132\000o\253\000O\127`\254\006\224\001\016\003\0243\000\158`\002R\000\000\137\003A#\001\133\000\016!\000\027\255@\019\223\216?\129\184\000D\000\198\012\192'\152\000\148\128\000\"@\208H\192a@\004\b@\006\255\208\004\247\246\015\224n\000\017\0001\1310\t\230\000% \000\b\1444\0180\024P\001\002\016\001\191\244\001=\253\131\248\027\128\004@\012`\204\002y\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002R\000\000\137\003A#\001\133\000\016!\000\027\255@\019\223\216?\133\188 \006\130\198\012\192'\128\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\t\239\236\031\192\220\000\"\000c\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\158\254\193\252\r\192\002 \0060f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128'\191\176\127\003p\000\136\001\140\025\128O0\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\t\239\236\031\194\222\016\003Ac\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\158\254\193\252\r\192\002 \0060f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128'\191\176\127\003p\000\136\001\140\025\128O0\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\t\239\236\031\192\220\000\"\000c\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\248\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\001\000H\004@  \000\004 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\004\000\000\012\001~\192\128\185!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\016\004\128\198\002\002\012\000C\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\b\000@\004\001 1\128\128\131\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\024\003\253\129!2C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\128$\002 \016\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\bH\000\002\000\t\000\136\006\004\000\000\132\000@\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\024\016\000\000\000\000\000\000\192\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\000\128\000\000\000\024\003\253\129\001\178C\210N\225\227\196G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@l\144\244\147\184x\241\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\196\002\002@\001B\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\016\128\000\000\000\018\003\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@b\001\001 \000\161\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\000\000\000\000\000\024\003\255\161\001\190C\210N\225\227\224G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255\232@o\144\244\147\184x\248\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\001\b\000\000\000\001 0\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@b\001\001 \000\161\000\000\000\000\000\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 0\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\016\128\000\000\000\018\001\016\b\b\000\001\b\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\132\000\192\130\000\144\024\192@I\128(`\b\000\000\000\006\004\000\000\000\000\000\000@\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\192\128\000\000\000\000\000\b\000 \000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000\000\001\000H\012`  \192\0040\004\000\002\016\000\000\b\002@#\001\001\000\000!\000\000\000\128\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$ \000\004\016\004\128\198\002\002\012\000C\000@\000!\000\000\000\128$\0020\016\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\b\002@#\001\001\000\000!\000\000\000\016\128\000\000@\018\003\024\b\b0\001\012\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\004 \001\000\016\004\128\198\002\002\012\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\006\004\201\015I;\151\143\001\030cz\027\000\127\1760&HzI\220<x\b\243\027\208\192\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\0000\007\251\003\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\224\153!\233'p\241\224#\204oC`\015\246\006\004\201\015I;\151\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\006\000\000 \000\000\000\000\000\000\000\000P\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\001\128\000\b\000\000\000\000\000\000\000\000\020\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000 \000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\192\128\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\001\129\000\b\000\000\000\000\000\000\000\000\016\000\000\000\012\b\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
+  
+  and start =
+    4
+  
+  and action =
+    ((16, "\000\000$\242<\242\000\000\000\000\000\000\000\000P\\\000\003\000\000\000\000\000\000\000\000\000\003\000\000P\\%\170(\156P\202'P\000\000$\172\000\000*\030&PPt-\018$X&\202P\202%X\000\000%\"&\200%|%\166P\202%\"\000\000$X&D$X\000\000&H&P&\200&\166&\206$X&\226&\246P\202P\202P\202\000\000'x/\214$X'>&P\000\000'\026P\202P\202P\202%\"\000\000\000\000\000\000\000\000\000\000$\206P\202%\198P\202\000\000\000\000\000\000)xP\202(\148P\202\000\000P\202\000\000'\192\000\000'\202\000\000\000\000\000\000\000\000\000\000'\140P\202\000\000%\142\000\000'\212\000\000'\022P\202(\184+\254$X'\236&P'\202P\202(\238P\202)\228'\204P\202*\174&\188\000\000(\156\000\000&\234&\140&\188)\184&\140\000\000&\140\000\000\000\000&\140\000\000)\234&\200\000\000&\200\000\000(\128\000\000(\138\000\000'\252P\202\000\000+\160\000\000,z(d&P(\"P\202\000\000((P\202\000\000( P\202+\182% Pt,\192\000\000(\246\000\000\000\000$X(\160&P(XP\202\000\000(`P\202\000\000+b(\018P\\\000\000(\208O\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000+\002P\\\000\000P\202.&\000\000)(\000\000*\026%\170\000\000%\170\000\000\000\000)>\000\000&@P\\\000\000'j\000\000)\\\000\000\000\000(\236\000\000-:.&\000\000.&\000\000\000\000\000\000.&6^M\214M\214\000\000)\"/\018)\140)\132\000\000/\018)\018&\154)\006\000\003)\030&\240$X)\")\"P\202U\012P\202U.2\194M\214M\214M\214M\214M\214M\214/\0182\194M\214Q`)>(\156*\224\000\003)\140\000\000\000\000\000\000\000\000\000\000)T'\130<\2422\194)\1402\194\000\0002\194)v/\018Q\012Q\"\000\000*\234)<60$X)n<\242'\236&\248,N\000\000\000\000\000\000/\254\000\000\000\0006^\000\003Q\",J)B=\232$X)v<\242'\236&\248&\186&\186\000\000\000\000\000\000\000\000M\212$X)z<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000)b>\222$X)\148<\242'\236&\248\000\000Q\"$X)\172<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000?\212$X)\174<\242'\236'J6^2\1942\194)\140)\200'\130*\018\000\000*\204'\130\000\000'\130\000\000M\2149\"/\018-@'x&\186\000\000@\202$X)\196<\242'\236&\248\000\000Qv$X)\206<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000&\186\000\000-B'x&\186\000\000A\192$X)\208<\242'\236&\248\000\000Q\192$X)\212<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000&\186\000\0002\194\000\246P\\)\228\000\003)\2540\2342\194M\214*\006)\140\000\000M\214M\214M\214)\140\000\000\000\000&\190P\202*\002\000\000\000\0032\194*\138\000\000M\214\000\000\000\0002\194M\214\000\000M\214\000\0001\2142\194:\014/\018)\1402\1942\194*\0200\2342\1942\194)\1402\194\000\000*4*\130\000\000B\180$X*0<\242'\236'J\000\003*RP\\*\\\000\003%\204%\204\000\000\000\0002\194M\214\000\000*\128P\\*|\000\003*t\000\000*\196Q\",\152*XC\170$X*\138<\242'\236&\248\000\000Q\250$X*\142<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000*dD\160$X*\152<\242'\236&\248\000\000R4$X*\162<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000E\150$X*\166<\242'\236'J\000\000\000\000Rh$X*\168<\242'\236'J\000\000'\236'J\000\000'\236'J\000\000F\140$X*\184<\242'\236&\248\000\000R\162$X*\186<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000*\152G\130$X*\202<\242'\236&\248\000\000R\192$X*\230<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000Hx$X+\000<\242'\236&\248\000\000S\024$X+\006<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000+\018N\172\000\000\000\0002\194'J%\204\000\000\000\000\000\000M\214\000\0002\194+\026\000\000+ N\172\000\0002\1942\1942\1942\1942\194*\2542\194M\214\000\000;\252'x&\186\000\000In$X+\030<\242'\236&\248\000\000S6$X+ <\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000&\186\000\000\000\000\000\000'\180\000\0032\194\000\000\000\000\000\000\000\000\000\000\001\238M\214\000\000\002\230M\214\000\000M\214;\006M\214\000\000M\214;\252M\214<\242M\214=\232\000\0032\194\000\000\000\000\000\000\000\000\000\000\000\0002\194\000\0003\174,^2\194\000\0002\194\000\000*\246*\2382\194\000\0002\194\000\0002\194\000\000\000\000;\252\000\000\000\000\003\222M\214\004\214\000\003\000\000\000\000\000\000M\214\005\206M\214\006\198M\214\007\190M\214\b\182M\214\t\174M\214\n\166M\214\011\158\000\003\000\000\000\003\000\000\000\003\000\000M\214\012\150\000\003\000\000M\214\r\142\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000M\214\014\134M\214\015~M\214B\182M\214\016vM\214\017nM\214C\172M\214D\162M\214E\152M\214F\142M\214G\132M\214\018f\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000M\2144\166P\202\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\000M\214\019^\000\003\000\000M\214\000\000\000\003\000\000M\214\020V\000\003\000\000M\214\021N\000\003\000\000M\214\022FM\214>\222\000\003\000\000M\214?\212\000\003\000\000M\214@\202\000\003\000\000M\214A\192\000\003\000\000M\214\000\000\000\003\000\000\000\003\000\000M\214\023>M\214\0246\000\003\000\000M\214\025.M\214HzM\214\026&\000\003\000\000M\214\027\030\000\003\000\000\000\003\000\000M\214IpM\214JfM\2145\156M\214\028\022M\214K\\M\214LRM\214MHM\214\029\014\000\003\000\000P\202\000\000\000\003\000\000\000\003\000\000M\214\030\006\000\003\000\000M\214\030\254M\214\031\246+\138\000\000\000\000+F\000\000\000\000)\140\000\000\000\0002\194\000\000+$+\0282\194\000\0002\194\000\0002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000+\2102\194\000\000\000\000+\2122\194\000\000\000\000\000\000Sp$X+t<\242'\236'J\000\000'\236'J\000\000'\236'J\000\000 \2382\194\000\000\000\000\000\000!\2302\194\000\000\"\2222\194\000\000+\204\000\000$\150/\018\000\000+\208\000\0004\166+\134O\182\000\000+\240\000\000'\164/\018\000\000\000\000\000\000+\228\000\000\000\000+\154\000\000\000\000)\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\2142\194\000\000+\236\000\000+\238\000\000\000\000\000\000\000\000P\\+\142\000\003(\0122\194\000\000,\000\000\000\000\000\000\000\000\000(B6^\000\0006^\000\000\000\000S\142$X+\176<\242'\236'J\000\000'\236'J\000\000'\236'J\000\000Jd$X+\184<\242'\236&\248\000\000S\230$X+\186<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000+\142KZ$X+\190<\242'\236&\248\000\000T\004$X+\192<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000\000\000\000\000,0\000\000+\\,N\000\000,N\000\000\000\000T>$X+\234<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000+\190LP$X+\238<\242'\236&\248\000\000T\\$X+\242<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000MF$X,\n<\242'\236'J\000\000T\180$X,\014<\242'\236'J\000\000'\236'J\000\000'\236'J\000\000U\136$X,\026<\242'\236&\248\000\000T\210$X, <\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000,\016U\140$X,`<\242'\236&\248\000\000U\012$X,d<\242'\236&\248\000\000'\236&\248\000\000'\236&\248\000\000,\202\000\000,<<\2422\194\000\000\000\000\000\000\000\000,\216\000\000\000\000NT..\000\003\000\000,\220\000\000-\024&B(\156,\236\000\000,\140*.\000\000-4*.\000\000*.\000\000*.\000\000O8\000\003'\240\000\000O\004\000\003\000\000\000\000\000\000\000\003;\006,\172O\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000,<\000\000\000\0002\194\000\000-\012\000\000\000\000\000\000,\152\000\000\000\000\000\0007J6^-\020\000\000$\2306^\000\000867J\000\000\000\000\000\000(^,\202'$$X,\200,\198P\202)HP\202)x'L(^\000\000(^\000\000,\132,\242(\218(,,\228,\182P\202+\188,\184P\202,\168-\174(\218\000\000(\218\000\000-N\000\000\000\000"), (16, "\003r\003v\003\221\003\221\003\221\003\221\003\221\003\221\003\221\003\221\003\221\003\134\003\150\003z\003\166\003\202\003~\003\234\000\018\003\221\004\006\003\210\003\221\003\221\003\221\003\221\003\221\003\221\004F\003\221\003\221\003\221\003\221\003\221\003\221\003\221\004\146\003\221\003\221\003\214\004\150\003\221\003\221\003\138\003\221\003\221\003\218\003\221\003\221\003\221\003\221\005v\005\178\000\022\003\222\003\221\000\026\003\221\003\221\006\026\003\221\003\221\003\226\003\221\003\221\003\230\006\130\006\138\003\221\003\242\005\170\006\150\003\221\003\221\003\221\003\221\006\222\007\026\004\n\006\166\003\221\003\221\003\221\007N\006\178\007j\000&\003\221\003\221\003\221\003\221\003\221\003\221\003\221\007z\003\221\003\221\003\221\006\182\007\138\007\166\007\174\003\221\003\221\tZ\000*\003\221\003\221\003\221\t\170\000.\003\221\t\186\n\142\n\234\011\006\003\221\011\014\003\221\003\221\003\221\003\221\006\186\011J\003r\003v\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\134\003\150\003z\003\166\003\202\003~\003\234\000\018\003\025\004\006\003\210\003\025\003\025\003\025\003\025\003\025\003\025\004F\003\025\003\025\003\025\003\025\003\025\003\025\003\025\004\146\003\025\003\025\003\214\004\150\003\025\003\025\003\138\003\025\003\025\003\218\003\025\003\025\003\025\003\025\005v\005\178\000\022\003\222\003\025\000\026\003\025\003\025\006\026\003\025\003\025\003\226\003\025\003\025\003\230\006\130\006\138\003\025\003\242\005\170\006\150\003\025\003\025\003\025\003\025\006\222\007\026\004\n\006\166\003\025\003\025\003\025\007N\006\178\007j\000&\003\025\003\025\003\025\003\025\003\025\003\025\003\025\007z\003\025\003\025\003\025\006\182\007\138\007\166\007\174\003\025\003\025\tZ\000*\003\025\003\025\003\025\t\170\000.\003\025\t\186\n\142\n\234\011\006\003\025\011\014\003\025\003\025\003\025\003\025\006\186\011J\n\170\n\230\012\182\012\190\012\198\012\206\012\214\012\222\012\230\012\238\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\012\246\002\201\002\201\012\254\r\006\r\014\r\022\002\201\002\201\002\201\002\201\r\030\r&\r.\r6\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\r>\rF\rN\rV\r^\rf\rn\002\201\002\201\002\201\002\201\rv\002\201\r~\r\134\002\201\r\142\r\150\r\158\r\166\002\201\002\201\002\201\002\201\r\174\002\201\002\201\002\201\002\201\002\201\002\201\r\182\002\201\002\201\002\201\r\190\r\198\002\201\r\206\002\201\002\201\002\201\002\201\002\201\r\214\002\201\002\201\002\201\002\201\002\201\002\201\r\222\r\230\002\201\002\201\002\201\002\201\002\201\002\201\r\238\002\201\002\201\002\201\r\246\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\r\254\002\201\002\201\014\006\014\014\014\022\014\030\002\201\001\245\001\245\001\245\001\245\n\182\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\n\190\001\245\n\206\001\245\001\245\001\245\001\245\001\245\n\214\001\245\n\222\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\n\198\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\001\245\011Z\011b\011r\011\170\n\182\011\178\011z\011\186\011\194\011\202\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\011\210\003\141\003\141\n\190\011\218\n\206\011\226\003\141\003\141\003\141\003\141\n\214\011\234\n\222\011\242\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\n\198\011\250\012\002\012\n\011\130\012b\012\018\003\141\003\141\003\141\003\141\012\026\003\141\011\146\012j\003\141\011\154\012r\012z\0122\003\141\003\141\003\141\003\141\012:\003\141\003\141\003\141\003\141\003\141\003\141\012\130\003\141\003\141\003\141\012\"\012B\003\141\012J\003\141\003\141\003\141\003\141\003\141\012R\003\141\003\141\003\141\003\141\003\141\003\141\011\162\012\146\003\141\003\141\003\141\003\141\003\141\003\141\012\138\003\141\003\141\003\141\012\154\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\012\162\003\141\003\141\011\138\012\170\012Z\012*\003\141\002m\002m\002m\002m\n\182\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\n\190\002m\n\206\002m\002m\002m\002m\002m\n\214\002m\n\222\002m\002m\002m\002m\002m\002m\002m\002m\002m\n\198\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\011Z\002Y\002Y\002Y\n\182\002Y\011z\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\n\190\002Y\n\206\002Y\002Y\002Y\002Y\002Y\n\214\002Y\n\222\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\n\198\002Y\002Y\002Y\011\130\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\011\146\002Y\002Y\011\154\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\011\162\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\011\138\002Y\002Y\002Y\002Y\011Z\002]\002]\002]\n\182\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\n\190\002]\n\206\002]\002]\002]\002]\002]\n\214\002]\n\222\002]\002]\002]\002]\002]\002]\002]\002]\002]\n\198\002]\002]\002]\011\130\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\002]\011\138\002]\002]\002]\002]\011Z\002i\002i\002i\n\182\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\n\190\002i\n\206\002i\002i\002i\002i\002i\n\214\002i\n\222\002i\002i\002i\002i\002i\002i\002i\002i\002i\n\198\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\011\138\002i\002i\002i\002i\011Z\002e\002e\002e\n\182\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\n\190\002e\n\206\002e\002e\002e\002e\002e\n\214\002e\n\222\002e\002e\002e\002e\002e\002e\002e\002e\002e\n\198\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\011Z\002E\002E\002E\n\182\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\n\190\002E\n\206\002E\002E\002E\002E\002E\n\214\002E\n\222\002E\002E\002E\002E\002E\002E\002E\002E\002E\n\198\002E\002E\002E\011\130\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\002E\011\138\002E\002E\002E\002E\011Z\002M\002M\002M\n\182\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\n\190\002M\n\206\002M\002M\002M\002M\002M\n\214\002M\n\222\002M\002M\002M\002M\002M\002M\002M\002M\002M\n\198\002M\002M\002M\011\130\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\002M\011\138\002M\002M\002M\002M\011Z\002I\002I\002I\n\182\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\n\190\002I\n\206\002I\002I\002I\002I\002I\n\214\002I\n\222\002I\002I\002I\002I\002I\002I\002I\002I\002I\n\198\002I\002I\002I\011\130\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\002I\011\138\002I\002I\002I\002I\011Z\002U\002U\002U\n\182\002U\011z\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\n\190\002U\n\206\002U\002U\002U\002U\002U\n\214\002U\n\222\002U\002U\002U\002U\002U\002U\002U\002U\002U\n\198\002U\002U\002U\011\130\002U\002U\002U\002U\002U\002U\002U\002U\011\146\002U\002U\011\154\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\011\162\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\002U\011\138\002U\002U\002U\002U\011Z\002A\002A\002A\n\182\002A\011z\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\n\190\002A\n\206\002A\002A\002A\002A\002A\n\214\002A\n\222\002A\002A\002A\002A\002A\002A\002A\002A\002A\n\198\002A\002A\002A\011\130\002A\002A\002A\002A\002A\002A\002A\002A\011\146\002A\002A\011\154\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\011\162\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\002A\011\138\002A\002A\002A\002A\011Z\002\169\011r\002\169\n\182\002\169\011z\002\169\011\194\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\011\210\002\169\002\169\n\190\002\169\n\206\002\169\002\169\002\169\002\169\002\169\n\214\002\169\n\222\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\n\198\002\169\002\169\002\169\011\130\002\169\012\018\002\169\002\169\002\169\002\169\012\026\002\169\011\146\002\169\002\169\011\154\002\169\002\169\0122\002\169\002\169\002\169\002\169\012:\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\012\"\012B\002\169\012J\002\169\002\169\002\169\002\169\002\169\012R\002\169\002\169\002\169\002\169\002\169\002\169\011\162\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\011\138\002\169\012Z\012*\002\169\011Z\002\161\011r\002\161\n\182\002\161\011z\002\161\011\194\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\011\210\002\161\002\161\n\190\002\161\n\206\002\161\002\161\002\161\002\161\002\161\n\214\002\161\n\222\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\n\198\002\161\002\161\002\161\011\130\002\161\002\161\002\161\002\161\002\161\002\161\012\026\002\161\011\146\002\161\002\161\011\154\002\161\002\161\0122\002\161\002\161\002\161\002\161\012:\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\012\"\012B\002\161\012J\002\161\002\161\002\161\002\161\002\161\012R\002\161\002\161\002\161\002\161\002\161\002\161\011\162\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\011\138\002\161\012Z\012*\002\161\011Z\002\129\002\129\002\129\n\182\002\129\011z\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\n\190\002\129\n\206\002\129\002\129\002\129\002\129\002\129\n\214\002\129\n\222\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\n\198\002\129\002\129\002\129\011\130\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\011\146\002\129\002\129\011\154\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\011\162\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\011\138\002\129\002\129\002\129\002\129\011Z\002=\002=\002=\n\182\002=\011z\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\n\190\002=\n\206\002=\002=\002=\002=\002=\n\214\002=\n\222\002=\002=\002=\002=\002=\002=\002=\002=\002=\n\198\002=\002=\002=\011\130\002=\002=\002=\002=\002=\002=\002=\002=\011\146\002=\002=\011\154\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\011\162\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\002=\011\138\002=\002=\002=\002=\011Z\002\157\011r\002\157\n\182\002\157\011z\002\157\011\194\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\011\210\002\157\002\157\n\190\002\157\n\206\002\157\002\157\002\157\002\157\002\157\n\214\002\157\n\222\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\n\198\002\157\002\157\002\157\011\130\002\157\002\157\002\157\002\157\002\157\002\157\012\026\002\157\011\146\002\157\002\157\011\154\002\157\002\157\0122\002\157\002\157\002\157\002\157\012:\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\012\"\012B\002\157\012J\002\157\002\157\002\157\002\157\002\157\012R\002\157\002\157\002\157\002\157\002\157\002\157\011\162\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\011\138\002\157\002\157\012*\002\157\011Z\001\225\001\225\001\225\n\182\001\225\011z\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\n\190\001\225\n\206\001\225\001\225\001\225\001\225\001\225\n\214\001\225\n\222\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\n\198\001\225\001\225\001\225\011\130\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\011\146\001\225\001\225\011\154\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\011\162\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\001\225\011\138\001\225\001\225\001\225\001\225\011Z\001\229\001\229\001\229\n\182\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\n\190\001\229\n\206\001\229\001\229\001\229\001\229\001\229\n\214\001\229\n\222\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\n\198\001\229\001\229\001\229\011\130\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\001\229\011\138\001\229\001\229\001\229\001\229\011Z\001\221\001\221\001\221\n\182\001\221\011z\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\n\190\001\221\n\206\001\221\001\221\001\221\001\221\001\221\n\214\001\221\n\222\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\n\198\001\221\001\221\001\221\011\130\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\011\146\001\221\001\221\011\154\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\011\162\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\001\221\011\138\001\221\001\221\001\221\001\221\011Z\001\201\001\201\001\201\n\182\001\201\011z\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\n\190\001\201\n\206\001\201\001\201\001\201\001\201\001\201\n\214\001\201\n\222\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\n\198\001\201\001\201\001\201\011\130\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\011\146\001\201\001\201\011\154\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\011\162\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\001\201\011\138\001\201\001\201\001\201\001\201\011Z\0021\011r\0021\n\182\0021\011z\0021\011\194\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\011\210\0021\0021\n\190\0021\n\206\0021\0021\0021\0021\0021\n\214\0021\n\222\0021\0021\0021\0021\0021\0021\0021\0021\0021\n\198\0021\0021\0021\011\130\0021\012\018\0021\0021\0021\0021\012\026\0021\011\146\0021\0021\011\154\0021\0021\0122\0021\0021\0021\0021\012:\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\012\"\012B\0021\012J\0021\0021\0021\0021\0021\012R\0021\0021\0021\0021\0021\0021\011\162\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\0021\011\138\0021\012Z\012*\0021\011Z\001\241\001\241\001\241\n\182\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\n\190\001\241\n\206\001\241\001\241\001\241\001\241\001\241\n\214\001\241\n\222\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\n\198\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\001\241\011\138\001\241\001\241\001\241\001\241\011Z\002)\011r\002)\n\182\002)\011z\002)\011\194\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\011\210\002)\002)\n\190\002)\n\206\002)\002)\002)\002)\002)\n\214\002)\n\222\002)\002)\002)\002)\002)\002)\002)\002)\002)\n\198\002)\002)\002)\011\130\002)\002)\002)\002)\002)\002)\012\026\002)\011\146\002)\002)\011\154\002)\002)\0122\002)\002)\002)\002)\012:\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\012\"\012B\002)\012J\002)\002)\002)\002)\002)\012R\002)\002)\002)\002)\002)\002)\011\162\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\002)\011\138\002)\012Z\012*\002)\011Z\001\205\001\205\001\205\n\182\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\n\190\001\205\n\206\001\205\001\205\001\205\001\205\001\205\n\214\001\205\n\222\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\n\198\001\205\001\205\001\205\011\130\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\001\205\011\138\001\205\001\205\001\205\001\205\011Z\001\213\001\213\001\213\n\182\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\n\190\001\213\n\206\001\213\001\213\001\213\001\213\001\213\n\214\001\213\n\222\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\n\198\001\213\001\213\001\213\011\130\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\001\213\011\138\001\213\001\213\001\213\001\213\011Z\002\t\002\t\002\t\n\182\002\t\011z\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\n\190\002\t\n\206\002\t\002\t\002\t\002\t\002\t\n\214\002\t\n\222\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\n\198\002\t\002\t\002\t\011\130\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\011\146\002\t\002\t\011\154\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\011\162\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\002\t\011\138\002\t\002\t\002\t\002\t\011Z\001\209\001\209\001\209\n\182\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\n\190\001\209\n\206\001\209\001\209\001\209\001\209\001\209\n\214\001\209\n\222\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\n\198\001\209\001\209\001\209\011\130\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\001\209\011\138\001\209\001\209\001\209\001\209\011Z\001\237\001\237\001\237\n\182\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\n\190\001\237\n\206\001\237\001\237\001\237\001\237\001\237\n\214\001\237\n\222\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\n\198\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\011Z\002%\011r\002%\n\182\002%\011z\002%\011\194\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\011\210\002%\002%\n\190\002%\n\206\002%\002%\002%\002%\002%\n\214\002%\n\222\002%\002%\002%\002%\002%\002%\002%\002%\002%\n\198\002%\002%\002%\011\130\002%\002%\002%\002%\002%\002%\012\026\002%\011\146\002%\002%\011\154\002%\002%\0122\002%\002%\002%\002%\012:\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\012\"\012B\002%\012J\002%\002%\002%\002%\002%\012R\002%\002%\002%\002%\002%\002%\011\162\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\002%\011\138\002%\002%\012*\002%\011Z\001\197\001\197\001\197\n\182\001\197\011z\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\n\190\001\197\n\206\001\197\001\197\001\197\001\197\001\197\n\214\001\197\n\222\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\n\198\001\197\001\197\001\197\011\130\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\011\146\001\197\001\197\011\154\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\011\162\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\001\197\011\138\001\197\001\197\001\197\001\197\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\014\234\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003E\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\014\254\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\003]\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\015\n\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004\t\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\015\150\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\004!\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\006\137\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\000r\005\177\005\177\006\229\000Z\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\006A\019\150\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\001\"\005\177\005\177\005\177\005\177\005\177\005\177\005\177\007\021\005\177\015\030\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\000~\005\177\005\177\005\177\005\177\000\n\001^\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\006\157\005\177\005\177\000\134\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\005\177\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\001\134\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\002v\007\221\007\221\001>\006\185\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\000\142\007~\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\000F\007\221\007\221\007\221\007\221\007\221\007\221\007\221\005r\007\221\003\246\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\000\146\007\221\007\221\007\221\007\221\006\177\001F\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\000b\007\221\007\221\002\234\007\221\007\221\007\221\007\221\007\221\007\221\001*\007\221\007\221\007\221\007\221\007\221\005!\005!\005!\005!\005!\005!\005!\005!\005!\005!\000f\005!\007\029\005m\000\182\000\210\018\202\000\138\005m\000\186\006\233\005!\000\178\000\218\005!\005!\005!\005!\000v\005!\005!\005!\005!\005!\005!\005!\001\210\005!\005!\003*\002\242\000\166\007\001\005m\005!\005!\005!\005!\005!\005!\005!\001\226\002\002\005m\001\230\005!\005m\005!\005!\0079\005!\005!\005!\005!\006\206\005m\000\190\004r\005!\005m\006\218\000\021\000\194\007\129\007\129\005!\004\190\001\214\005m\005!\005!\007\129\005!\001\158\001\206\000J\005m\007q\005!\003\174\005!\005!\015b\015f\001>\005!\005!\001\150\004r\000\202\019\222\019\230\005!\005!\005\149\005m\005!\005!\007q\t\194\005m\015n\005\165\000R\003\194\019\190\005!\000\206\004\186\005!\005!\005!\005!\004\229\004\229\004\229\004\229\004\229\004\229\004\229\004\229\004\229\004\229\000\226\004\229\006-\005m\005\165\005\165\005r\019\210\005m\005\165\005\165\004\229\000\238\006m\004\229\004\229\004\229\004\229\005\165\004\229\004\229\004\229\004\229\004\229\004\229\004\229\007f\004\229\004\229\005\149\006)\000\250\001F\005m\004\229\004\229\004\229\004\229\004\229\004\229\004\229\000V\0036\005m\001\142\004\229\005m\004\229\004\229\0036\004\229\004\229\004\229\004\229\006\206\005m\001>\019\n\004\229\005m\n\138\006\245\019\254\000I\000I\004\229\005\217\005\217\005m\004\229\004\229\000I\004\229\004&\005\217\006\029\005m\001Z\004\229\001b\004\229\004\229\014.\0142\015J\004\229\004\229\000\021\001z\019\182\015\234\015\242\004\229\004\229\006\029\005m\004\229\004\229\006M\001\170\005m\014:\007e\007e\001\178\001\198\004\229\000\021\006\029\004\229\004\229\004\229\004\229\007e\007e\007e\007e\007e\007e\007e\007e\000J\007e\007e\000I\015\202\002\186\001F\020\014\002\"\007e\007e\007e\007e\002*\000\021\000\021\006\029\007e\007e\007e\007e\007e\000\021\0022\007e\006\029\002j\007e\007}\007}\006M\007e\007e\007e\007e\007e\007}\007e\002J\019\250\007e\006\029\002R\007e\006\029\002^\007e\007e\007e\001>\007e\007e\007e\006\201\007e\007\145\007\145\007e\007e\007e\007e\002\134\007e\007\145\007e\007e\007e\007e\002\150\002\158\007e\007e\007e\002\170\000\021\007e\001>\006\241\007e\007e\007e\007e\007e\007e\007e\007e\007e\007e\000J\002\198\007e\007e\003\002\007e\007e\007e\007e\003\"\007e\003>\007y\007y\001F\007e\007e\005%\005%\005%\005%\005%\005%\005%\005%\005%\005%\003K\005%\003\130\003z\003\142\001F\001>\003\154\000\018\007u\007u\005%\003\162\003\170\005%\005%\005%\005%\003\182\005%\005%\005%\005%\005%\005%\005%\003\186\005%\005%\003\250\001>\004\"\001F\003\138\005%\005%\005%\005%\005%\005%\005%\001\238\001\246\000\022\004B\005%\000\026\005%\005%\007!\005%\005%\005%\005%\004Z\003\146\004f\004\162\005%\003\242\004\174\006\221\004\222\007\133\007\133\005%\002\014\002\022\004\n\005%\005%\007\133\005%\005\n\007\005\005\022\000&\001F\005%\007y\005%\005%\001N\003\246\001>\005%\005%\0052\005f\005\134\003\n\003\018\005%\005%\005\142\000*\005%\005%\006\189\005\206\000.\001F\000b\007u\005\234\0066\005%\006R\006u\005%\005%\005%\005%\004\233\004\233\004\233\004\233\004\233\004\233\004\233\004\233\004\233\004\233\006\146\004\233\006\154\003z\002\142\000f\006\170\006\214\000\018\000\182\000\210\004\233\006\230\007*\004\233\004\233\004\233\004\233\000\218\004\233\004\233\004\233\004\233\004\233\004\233\004\233\018\202\004\233\004\233\007F\007Z\007n\001F\003\138\004\233\004\233\004\233\004\233\004\233\004\233\004\233\007\141\007\141\000\022\007v\004\233\000\026\004\233\004\233\007\141\004\233\004\233\004\233\004\233\007\154\003\146\005\150\005\158\004\233\003\242\007\162\007\170\001>\007\178\0061\004\233\002\181\002\181\004\n\004\233\004\233\n\n\004\233\007\190\002\181\007\202\000&\007\230\004\233\b\018\004\233\004\233\b\030\005\201\005\201\004\233\004\233\b:\014J\bn\b\142\005\201\004\233\004\233\004V\000*\004\233\004\233\b\194\b\222\000.\0172\000\017\000\017\002\234\t\n\004\233\t\022\014R\004\233\004\233\004\233\004\233\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\t2\000\017\000\017\014b\017\134\004\002\005\201\016\234\016\242\000\017\000\017\000\017\001F\tf\014j\006]\t\130\000\017\000\017\t\174\000\017\000\017\005\201\t\226\000\017\017\214\t\234\000\017\n2\nN\011*\001>\000\017\000\017\000\017\000\017\002\242\000\017\011.\014*\000\017\007\137\007\137\000\017\018&\0146\000\017\000\017\000\017\007\137\000\017\000\017\000\017\014V\007\149\007U\007U\000\017\000\017\000\017\000\017\014Z\001>\007U\000\017\000\017\000\017\000\017\014\146\014\162\000\017\014\190\015\022\001>\015*\000\017\001>\0156\000\017\000\017\000\017\000\017\000\017\015B\015^\000\017\000\017\015j\015\162\015\170\000\017\000\017\015\194\000\017\000\017\000\017\000\017\015\214\000\017\b\r\b\r\016\n\001F\000\017\000\017\016>\016Z\016\134\016\146\016\174\b\r\b\r\b\r\b\r\b\r\b\r\b\r\b\r\004v\b\r\b\r\016\226\b\r\001\162\000f\007\149\011\022\b\r\000\182\000\210\017\n\0176\017B\001F\017^\b\r\006Y\000\218\b\r\b\r\004z\004~\b\r\011\030\001F\b\r\017\146\001F\017\174\004\158\b\r\b\r\b\r\b\r\017\226\b\r\005\006\017\254\b\r\018\218\018\246\b\r\001\186\011&\b\r\b\r\b\r\007-\b\r\b\r\b\r\001>\018*\007Q\007Q\b\r\b\r\b\r\b\r\0116\005Z\007Q\b\r\b\r\b\r\b\r\b\r\007\153\007\186\0186\011>\018R\018~\b\r\001>\b\014\018\134\b\r\b\r\b\r\b\r\0162\007m\b\r\b\r\018\162\001>\018\190\b\r\b\r\018\198\b\r\b\r\b\r\b\r\018\210\b\r\006\161\006\161\bb\016\130\b\r\b\r\007m\019.\019f\019w\019\143\006\161\006\161\006\161\006\161\006\161\006\161\006\161\006\161\000b\006\161\006\161\019\186\b\182\019\198\001F\018\230\018\238\006\161\003R\003Z\019\202\019\242\019\246\006y\020\002\006\161\020\006\020\018\006\161\006\161\007\153\t\006\006\161\000n\000f\006\161\0203\001F\000\182\000\210\006\161\006\161\006\161\006\161\000\000\006\161\000\000\000\218\006\161\001F\000\000\006\161\000\000\000\000\006\161\006\161\006\161\000\000\006\161\006\161\006\161\005\149\005\149\000\000\000\000\006\161\006\161\006\161\006\161\000\000\005\182\006\030\006\161\006\161\006\161\006\161\020\030\020&\000\000\006\161\000\000\0036\0036\006\161\006\205\000\000\000\000\006\161\006\161\006\161\006\161\000\000\000\000\006\161\006\161\000\000\005\194\006*\006\161\006\161\000\000\006\161\006\161\006\161\006\161\000\000\006\161\006\157\006\157\000\000\000\000\006\161\006\161\000\000\000\000\000\000\000\000\000\000\006\157\006\157\006\157\006\157\006\157\006\157\006\157\006\157\000\000\006\157\006\157\000\000\000\000\000\000\000\000\000\000\000\000\006\157\005\213\005\213\005\213\000\000\002\177\002\177\000\000\006\157\005\213\000\000\006\157\006\157\002\177\000\000\006\157\000\000\000\000\006\157\000\000\000\000\000\000\001>\006\157\006\157\006\157\006\157\000\000\006\157\000\000\000\000\006\157\000\000\000\000\006\157\000\000\000\000\006\157\006\157\006\157\000\000\006\157\006\157\006\157\000\000\005\213\000\n\000\000\006\157\006\157\006\157\006\157\000\000\000\000\000\000\006\157\006\157\006\157\006\157\000\000\000\000\005\213\006\157\000\000\000\000\018\178\006\157\000\000\000\000\000\000\006\157\006\157\006\157\006\157\005\213\005\213\006\157\006\157\000\000\000\000\000\000\006\157\006\157\000\000\006\157\006\157\006\157\006\157\000\000\006\157\003r\003v\000\000\001F\006\157\006\157\000\000\000\000\000\000\000\000\000\000\003\134\003\150\003z\003\166\003\202\003~\003\234\000\018\019\"\004\006\003\210\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\006i\000\000\000\000\000\000\000\000\004\146\000\000\006\133\003\214\004\150\000\000\000\000\003\138\000\000\000\000\003\218\000\000\000\000\000\000\000\000\005v\005\178\000\022\003\222\000\000\000\026\000\000\000\000\006\026\000\000\000\000\003\226\000\000\000\000\003\230\006\130\006\138\000\000\003\242\005\170\006\150\000\000\000\000\000\000\000\000\006\222\007\026\004\n\006\166\000\000\000\000\000\000\007N\006\178\007j\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007z\000\000\000\000\000\000\006\182\007\138\007\166\007\174\000\000\000\000\tZ\000*\000\000\000\000\000\000\t\170\000.\000\000\t\186\n\142\n\234\011\006\000\000\011\014\007E\007E\000\000\000\000\006\186\011J\000\000\000\000\000\000\000\000\000\000\007E\007E\007E\007E\007E\007E\007E\007E\000b\007E\007E\000\000\004\134\000\000\000\000\000\000\000\000\007E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007E\000\000\000\000\007E\007E\000\000\000\000\007E\000\230\000f\007E\000\000\000\000\000\182\000\210\007E\007E\007E\007E\000\000\007E\000\000\000\218\007E\000\000\000\000\007E\000\000\000\000\007E\007E\007E\000\000\007E\007E\007E\000\000\000\000\000\000\000\000\007E\007E\007E\007E\000\000\000\000\000\000\007E\007E\007E\007E\004\138\000\000\000\000\000\000\000\000\000\000\000\000\007E\000\000\000\000\000\000\007E\007E\007E\007E\000\000\000\000\007E\007E\000\000\000\000\000\000\007E\007E\000\000\007E\007E\007E\007E\000\000\007E\000\021\000\021\000\000\000\000\007E\007E\000\000\000\000\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\000\000\021\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\021\000\021\000\000\000\000\000\021\000\000\000\000\000\021\000\000\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\000\000\021\000\000\000\000\000\021\000\000\000\000\000\021\000\000\000\000\000\021\000\021\000\021\000\000\000\021\000\021\000\021\000\000\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\021\000\021\000\021\000\021\000\021\000\000\000J\000\021\000\021\000\000\000\000\000\000\000\021\000\021\000\000\000\021\000\021\000\021\000\021\000\000\000\021\003r\003v\000\000\000\000\000\021\000\021\000\000\000\000\000\000\000\000\000\000\003\134\003\150\003z\003\166\003\202\003~\003\234\000\018\007\014\004\006\003\210\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\006i\000\000\000\000\000\000\000\000\004\146\000\000\000\000\003\214\004\150\000\000\000\000\003\138\000\000\000\000\003\218\000\000\000\000\000\000\000\000\005v\005\178\000\022\003\222\000\000\000\026\000\000\000\000\006\026\000\000\000\000\003\226\000\000\000\000\003\230\006\130\006\138\000\000\003\242\005\170\006\150\000\000\000\000\000\000\000\000\006\222\007\026\004\n\006\166\000\000\000\000\000\000\007N\006\178\007j\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007z\000\000\000\000\000\000\006\182\007\138\007\166\007\174\000\000\000\000\tZ\000*\000\000\000\000\000\000\t\170\000.\000\000\t\186\n\142\n\234\011\006\000\000\011\014\003\206\003\238\000\000\000\000\006\186\011J\000\000\000\000\000\000\000\000\000\000\004.\003\150\0046\003\166\004:\004>\005z\000\018\000\000\005~\005\166\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\134\000\000\000\000\006\162\004\150\000\000\000\000\006\226\000\000\000\000\006\234\000\000\000\000\000\000\000\000\006\246\005\178\000\022\006\250\000\000\000\026\000\000\000\000\006\026\000\000\000\000\007\002\000\000\000\000\007\n\007\"\006\138\000\000\005r\007\018\007&\000\000\000\000\000\000\000\000\0072\0076\007>\007B\000\000\000\000\000\000\007N\007\142\007\150\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\190\000\000\000\000\t\206\t\210\t\218\t\222\007\174\000\000\n\006\tZ\000*\000\000\000\000\000\000\t\230\000.\000\000\t\242\t\246\t\250\t\254\000\000\n\002\003\206\003\238\000\000\000\000\n\014\n\022\000\000\000\000\000\000\000\000\000\000\004.\003\150\0046\003\166\004:\004>\005z\000\018\000\000\005~\005\166\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\134\000\000\000\000\006\162\004\150\000\000\000\000\006\226\000\000\000\000\006\234\000\000\000\000\000\000\000\000\006\246\005\178\000\022\006\250\000\000\000\026\000\000\000\000\006\026\000\000\000\000\007\002\000\000\000\000\007\n\007\"\006\138\000\000\005r\007\018\007&\000\000\000\000\000\000\000\000\0072\0076\007>\007B\000\000\000\000\000\000\007N\007\142\007\150\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\190\000\000\000\000\t\206\t\210\t\218\t\222\007\174\000\000\011\018\tZ\000*\000\000\000\000\000\000\t\230\000.\000\000\t\242\t\246\t\250\t\254\000\000\n\002\000\000\000\000\000\000\000\000\n\014\n\022\011Z\002\173\011r\002\173\n\182\002\173\011z\002\173\011\194\002\173\000\000\002\173\000\000\005m\000\000\000\000\000\000\000\000\005m\000\000\000\000\011\210\000\000\000\000\n\190\002\173\n\206\002\173\000\000\002\173\002\173\002\173\n\214\002\173\n\222\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\005m\n\198\002\173\002\173\012\n\011\130\002\173\012\018\000\000\000\000\005m\000\000\012\026\005m\011\146\002\173\000\000\011\154\002\173\002\173\0122\006\206\005m\000\000\000\000\012:\005m\n\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005m\012\"\012B\000\000\012J\000\000\000\000\000\000\005m\000\000\012R\000\000\002\173\002\173\014.\0152\000\000\011\162\002\173\000\000\000\000\000\000\000\000\000\000\002\173\012\138\000\000\005m\002\173\002\173\000\000\000\000\005m\014:\000\000\000\000\000\000\000\000\002\173\000\000\000\000\011\138\002\173\012Z\012*\011Z\0025\011r\0025\n\182\0025\011z\0025\011\194\0025\000\000\0025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\210\000\000\000\000\n\190\0025\n\206\0025\000\000\0025\0025\0025\n\214\0025\n\222\0025\000\000\0025\0025\000\000\000\000\000\000\000\000\000\000\n\198\0025\0025\012\n\011\130\0025\012\018\000\000\000\000\000\000\000\000\012\026\000\000\011\146\0025\000\000\011\154\0025\0025\0122\000\000\000\000\000\000\000\000\012:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\"\012B\000\000\012J\000\000\000\000\000\000\000\000\000\014\012R\000\000\0025\0025\000\018\000\000\000\000\011\162\0025\003r\003v\000\000\000\000\000\000\0025\012\138\000\000\000\000\0025\0025\003\134\003\150\003z\003\166\003\202\003~\003\234\000\018\0025\004\006\003\210\011\138\0025\012Z\012*\000\000\000\000\004F\006=\000\022\000\000\000\000\000\026\000\000\000\000\004\146\006I\000\000\003\214\004\150\004^\000\030\003\138\000\000\000\000\003\218\000\000\000\000\000\000\000\000\005v\005\178\000\022\003\222\016\254\000\026\000\000\000\000\006\026\000\000\000\000\003\226\000&\000\000\003\230\006\130\015\186\000\000\003\242\005\170\006\150\000\000\000\000\000\000\000\000\006\222\007\026\004\n\006\166\000\000\000\000\000*\007N\006\178\007j\000&\000.\000\000\000\000\006I\000\000\000\000\000\000\007z\000\000\000\000\000\000\006\182\007\138\007\166\007\174\000\000\000\000\tZ\000*\000\000\000\000\000\000\t\170\000.\000\000\t\186\n\142\n\234\011\006\000\000\011\014\006\145\006\145\000\000\000\000\006\186\011J\000\000\000\000\000\000\000\000\000\000\006\145\006\145\006\145\006\145\006\145\006\145\006\145\006\145\000\000\006\145\006\145\000\000\000\000\000\000\000\000\000\000\000\000\006\145\006\145\000\000\000\000\000\000\000\000\000\000\000\000\006\145\000\000\000\000\006\145\006\145\000\000\000\000\006\145\000\000\000\000\006\145\000\000\000\000\000\000\000\000\006\145\006\145\006\145\006\145\000\000\006\145\000\000\000\000\006\145\000\000\000\000\006\145\000\000\000\000\006\145\006\145\006\145\000\000\006\145\006\145\006\145\000\000\000\000\000\n\000\000\006\145\006\145\006\145\006\145\000\000\000\000\000\000\006\145\006\145\006\145\006\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\145\000\000\000\000\000\000\006\145\006\145\006\145\006\145\000\000\000\000\006\145\006\145\000\000\000\000\000\000\006\145\006\145\000\000\006\145\006\145\006\145\006\145\000\000\006\145\006\149\006\149\000\000\000\000\006\145\006\145\000\000\000\000\000\000\000\000\000\000\006\149\006\149\006\149\006\149\006\149\006\149\006\149\006\149\000\000\006\149\006\149\000\000\000\000\000\000\000\000\000\000\000\000\006\149\006\149\019\162\000\000\000\000\000\000\000\000\000\000\006\149\000\000\000\000\006\149\006\149\000\000\000\000\006\149\000\000\000\000\006\149\000\000\000\000\000\000\000\000\006\149\006\149\006\149\006\149\000\000\006\149\000\000\000\000\006\149\000\000\000\000\006\149\000\000\000\000\006\149\006\149\006\149\000\000\006\149\006\149\006\149\000\000\000\000\000\000\000\000\006\149\006\149\006\149\006\149\000\000\000\000\000\000\006\149\006\149\006\149\006\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\149\000\000\000\000\000\000\006\149\006\149\006\149\006\149\000\000\000\000\006\149\006\149\000\000\000\000\000\000\006\149\006\149\000\000\006\149\006\149\006\149\006\149\000\000\006\149\003r\003v\000\000\000\000\006\149\006\149\000\000\000\000\000\000\000\000\000\000\003\134\005\174\003z\003\166\003\202\003~\003\234\000\018\000\000\004\006\003\210\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\146\000\000\006\133\003\214\004\150\000\000\000\000\003\138\000\000\000\000\003\218\000\000\000\000\000\000\000\000\005v\005\178\000\022\003\222\000\000\000\026\000\000\000\000\006\026\000\000\000\000\003\226\000\000\000\000\003\230\006\130\006\138\000\000\003\242\005\170\006\150\000\000\000\000\000\000\000\000\006\222\007\026\004\n\006\166\000\000\000\000\000\000\007N\006\178\007j\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007z\000\000\000\000\000\000\006\182\007\138\007\166\007\174\000\000\000\000\tZ\000*\000\000\000\000\000\000\t\170\000.\000\000\t\186\n\142\n\234\011\006\000\000\011\014\003r\003v\000\000\000\000\006\186\011J\000\000\000\000\000\000\000\000\000\000\003\134\007\022\003z\003\166\003\202\003~\003\234\000\018\000\000\004\006\003\210\000\000\000\000\000\000\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\146\000\000\006\133\003\214\004\150\000\000\000\000\003\138\000\000\000\000\003\218\000\000\000\000\000\000\000\000\005v\005\178\000\022\003\222\000\000\000\026\000\000\000\000\006\026\000\000\000\000\003\226\000\000\000\000\003\230\006\130\006\138\000\000\003\242\005\170\006\150\000\000\000\000\000\000\000\000\006\222\007\026\004\n\006\166\000\000\000\000\000\000\007N\006\178\007j\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007z\000\000\000\000\000\000\006\182\007\138\007\166\007\174\000\000\000\000\tZ\000*\000\000\000\000\000\000\t\170\000.\000\000\t\186\n\142\n\234\011\006\000\000\011\014\000\000\000\000\000\000\000\000\006\186\011J\002u\002u\002u\002u\n\182\002u\002u\002u\002u\002u\000\000\002u\000\000\005m\000\000\000\000\000\000\000\000\005m\000\000\000\000\002u\000\000\000\000\000\000\002u\000\000\002u\000\000\002u\002u\002u\000\000\002u\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\005m\n\198\002u\002u\002u\002u\002u\002u\000\000\000\000\005m\000\000\002u\005m\002u\002u\000\000\002u\002u\002u\002u\006\206\005m\000\000\000\000\002u\005m\006\218\000\000\000\000\000\000\000\000\002u\000\000\000\000\005m\002u\002u\000\000\002u\000\000\000\000\000\000\005m\000\000\002u\000\000\002u\002u\015b\019*\000\000\002u\002u\000\000\000\000\000\000\000\000\000\000\002u\002u\000\000\005m\002u\002u\000\000\000\000\005m\015n\000\000\000\000\000\000\000\000\002u\000\000\000\000\002u\002u\002u\002u\002q\002q\002q\002q\n\182\002q\002q\002q\002q\002q\000\000\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002q\000\000\000\000\000\000\002q\000\000\002q\000\000\002q\002q\002q\000\000\002q\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\000\000\n\198\002q\002q\002q\002q\002q\002q\000\000\000\000\000\022\000\000\002q\000\026\002q\002q\000\000\002q\002q\002q\002q\000\000\003\146\000\000\000\000\002q\005\149\000\000\000\000\000\000\000\000\000\000\002q\000\000\000\000\n\026\002q\002q\000\000\002q\000\000\000\000\000\000\000&\000\000\002q\0036\002q\002q\000\000\000\000\000\000\002q\002q\000\000\000\000\000\000\000\000\000\000\002q\002q\n&\000*\002q\002q\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002q\000\000\000\000\002q\002q\002q\002q\002}\002}\002}\002}\n\182\002}\002}\002}\002}\002}\000\000\002}\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002}\000\000\000\000\000\000\002}\000\000\002}\000\000\002}\002}\002}\000\000\002}\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\000\000\n\198\002}\002}\002}\002}\002}\002}\000\000\000\000\000\022\000\000\002}\000\026\002}\002}\000\000\002}\002}\002}\002}\000\000\000\030\000\000\000\000\002}\000B\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002\190\002}\002}\000\000\002}\000\000\000\000\000\000\000&\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\002}\002}\000\000\000\000\000\000\000\000\000\000\002}\002}\000\000\000*\002}\002}\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002}\002}\002}\002}\002y\002y\002y\002y\n\182\002y\002y\002y\002y\002y\000\000\002y\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002y\000\000\000\000\000\000\002y\000\000\002y\000\000\002y\002y\002y\000\000\002y\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\000\000\n\198\002y\002y\002y\002y\002y\002y\000\000\000\000\000\022\000\000\002y\000\026\002y\002y\000\000\002y\002y\002y\002y\004\166\000\030\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\002y\000\000\000\000\004\210\002y\002y\000\000\002y\000\000\000\000\000\000\000&\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\002y\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\000\000\000*\002y\002y\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002y\000\000\000\000\002y\002y\002y\002y\001\253\001\253\001\253\001\253\n\182\001\253\001\253\001\253\001\253\001\253\000\000\001\253\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\253\000\000\000\000\000\000\001\253\000\000\001\253\000\000\001\253\001\253\001\253\000\000\001\253\000\000\001\253\000\000\001\253\001\253\000\000\000\000\000\000\000\000\000\000\n\198\001\253\001\253\001\253\001\253\001\253\001\253\000\000\000\000\000\022\000\000\001\253\000\026\001\253\001\253\000\000\001\253\001\253\001\253\001\253\005\014\000\030\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\000\000\001\253\000\000\000\000\005&\001\253\001\253\000\000\001\253\000\000\000\000\000\000\000&\000\000\001\253\000\000\001\253\001\253\000\000\000\000\000\000\001\253\001\253\000\000\000\000\000\000\000\000\000\000\001\253\001\253\000\000\000*\001\253\001\253\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\001\253\000\000\000\000\001\253\001\253\001\253\001\253\001\249\001\249\001\249\001\249\n\182\001\249\001\249\001\249\001\249\001\249\000\000\001\249\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\249\000\000\000\000\000\000\001\249\000\000\001\249\000\000\001\249\001\249\001\249\000\000\001\249\000\000\001\249\000\000\001\249\001\249\000\000\000\000\000\000\000\000\000\000\n\198\001\249\001\249\001\249\001\249\001\249\001\249\000\000\000\000\000\022\000\000\001\249\000\026\001\249\001\249\000\000\001\249\001\249\001\249\001\249\005^\000\030\000\000\000\000\001\249\000\000\000\000\000\000\000\000\000\000\000\000\001\249\000\000\000\000\015\254\001\249\001\249\000\000\001\249\000\000\000\000\000\000\000&\000\000\001\249\000\000\001\249\001\249\000\000\000\000\000\000\001\249\001\249\000\000\000\000\000\000\000\000\000\000\001\249\001\249\000\000\000*\001\249\001\249\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\001\249\000\000\000\000\001\249\001\249\001\249\001\249\002\005\002\005\002\005\002\005\n\182\002\005\002\005\002\005\002\005\002\005\000\000\002\005\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\005\000\000\000\000\000\000\002\005\000\000\002\005\000\000\002\005\002\005\002\005\000\000\002\005\000\000\002\005\000\000\002\005\002\005\000\000\000\000\000\000\000\000\000\000\n\198\002\005\002\005\002\005\002\005\002\005\002\005\000\000\000\000\000\022\000\000\002\005\000\026\002\005\002\005\000\000\002\005\002\005\002\005\002\005\005\198\000\030\000\000\000\000\002\005\000\000\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\005\222\002\005\002\005\000\000\002\005\000\000\000\000\000\000\000&\000\000\002\005\000\000\002\005\002\005\000\000\000\000\000\000\002\005\002\005\000\000\000\000\000\000\000\000\000\000\002\005\002\005\000\000\000*\002\005\002\005\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\002\005\002\005\002\005\002\005\002\001\002\001\002\001\002\001\n\182\002\001\002\001\002\001\002\001\002\001\000\000\002\001\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\001\000\000\000\000\000\000\002\001\000\000\002\001\000\000\002\001\002\001\002\001\000\000\002\001\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\n\198\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\000\022\000\000\002\001\000\026\002\001\002\001\000\000\002\001\002\001\002\001\002\001\006.\000\030\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\006F\002\001\002\001\000\000\002\001\000\000\000\000\000\000\000&\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\000\000\000*\002\001\002\001\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\002\001\002\001\002\001\002\001\011Z\002\137\011r\002\137\n\182\002\137\011z\002\137\011\194\002\137\000\000\002\137\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\137\n\206\002\137\000\000\002\137\002\137\002\137\n\214\002\137\n\222\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\000\000\n\198\002\137\002\137\002\137\011\130\002\137\002\137\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\137\000\000\011\154\002\137\002\137\007R\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\137\000\000\014\178\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\137\002\137\000\000\000\000\000\000\011\162\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\000*\000\000\002\137\002\137\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\137\000\000\000\000\011\138\002\137\002\137\012*\011Z\002\141\011r\002\141\n\182\002\141\011z\002\141\011\194\002\141\000\000\002\141\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\141\n\206\002\141\000\000\002\141\002\141\002\141\n\214\002\141\n\222\002\141\000\000\002\141\002\141\000\000\000\000\000\000\000\000\000\000\n\198\002\141\002\141\002\141\011\130\002\141\002\141\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\141\000\000\011\154\002\141\002\141\007\194\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\141\000\000\007\218\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\141\002\141\000\000\000\000\000\000\011\162\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\000*\000\000\002\141\002\141\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\141\000\000\000\000\011\138\002\141\002\141\012*\011Z\002\145\011r\002\145\n\182\002\145\011z\002\145\011\194\002\145\000\000\002\145\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\145\n\206\002\145\000\000\002\145\002\145\002\145\n\214\002\145\n\222\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\000\000\n\198\002\145\002\145\002\145\011\130\002\145\002\145\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\145\000\000\011\154\002\145\002\145\b\022\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\145\000\000\b.\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\145\002\145\000\000\000\000\000\000\011\162\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\000*\000\000\002\145\002\145\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\145\000\000\000\000\011\138\002\145\002\145\012*\011Z\002\149\011r\002\149\n\182\002\149\011z\002\149\011\194\002\149\000\000\002\149\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\149\n\206\002\149\000\000\002\149\002\149\002\149\n\214\002\149\n\222\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\n\198\002\149\002\149\002\149\011\130\002\149\002\149\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\149\000\000\011\154\002\149\002\149\bf\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\b\130\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\149\002\149\000\000\000\000\000\000\011\162\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\000*\000\000\002\149\002\149\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\011\138\002\149\002\149\012*\011Z\002\153\011r\002\153\n\182\002\153\011z\002\153\011\194\002\153\000\000\002\153\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\153\n\206\002\153\000\000\002\153\002\153\002\153\n\214\002\153\n\222\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\n\198\002\153\002\153\002\153\011\130\002\153\002\153\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\153\000\000\011\154\002\153\002\153\b\186\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\b\210\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\153\002\153\000\000\000\000\000\000\011\162\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\000*\000\000\002\153\002\153\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\000\000\011\138\002\153\002\153\012*\011Z\002\133\011r\002\133\n\182\002\133\011z\002\133\011\194\002\133\000\000\002\133\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\133\n\206\002\133\000\000\002\133\002\133\002\133\n\214\002\133\n\222\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\000\000\n\198\002\133\002\133\002\133\011\130\002\133\002\133\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\133\000\000\011\154\002\133\002\133\t\014\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\t&\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\133\002\133\000\000\000\000\000\000\011\162\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\000*\000\000\002\133\002\133\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\000\000\011\138\002\133\002\133\012*\011Z\002\017\011r\002\017\n\182\002\017\011z\002\017\011\194\002\017\000\000\002\017\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\017\n\206\002\017\000\000\002\017\002\017\002\017\n\214\002\017\n\222\002\017\000\000\002\017\002\017\000\000\000\000\000\000\000\000\000\000\n\198\002\017\002\017\002\017\011\130\002\017\002\017\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\017\000\000\011\154\002\017\002\017\t^\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000\000\tv\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\017\002\017\000\000\000\000\000\000\011\162\002\017\000\000\000\000\000\000\000\000\000\000\002\017\002\017\000*\000\000\002\017\002\017\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000\000\000\000\011\138\002\017\002\017\012*\011Z\002\021\011r\002\021\n\182\002\021\011z\002\021\011\194\002\021\000\000\002\021\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\021\n\206\002\021\000\000\002\021\002\021\002\021\n\214\002\021\n\222\002\021\000\000\002\021\002\021\000\000\000\000\000\000\000\000\000\000\n\198\002\021\002\021\002\021\011\130\002\021\002\021\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\021\000\000\011\154\002\021\002\021\n*\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\021\000\000\nB\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\021\002\021\000\000\000\000\000\000\011\162\002\021\000\000\000\000\000\000\000\000\000\000\002\021\002\021\000*\000\000\002\021\002\021\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\021\000\000\000\000\011\138\002\021\002\021\012*\011Z\002\025\011r\002\025\n\182\002\025\011z\002\025\011\194\002\025\000\000\002\025\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\025\n\206\002\025\000\000\002\025\002\025\002\025\n\214\002\025\n\222\002\025\000\000\002\025\002\025\000\000\000\000\000\000\000\000\000\000\n\198\002\025\002\025\002\025\011\130\002\025\002\025\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\025\000\000\011\154\002\025\002\025\0166\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\025\000\000\016N\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\025\002\025\000\000\000\000\000\000\011\162\002\025\000\000\000\000\000\000\000\000\000\000\002\025\002\025\000*\000\000\002\025\002\025\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\025\000\000\000\000\011\138\002\025\002\025\012*\011Z\002\029\011r\002\029\n\182\002\029\011z\002\029\011\194\002\029\000\000\002\029\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\029\n\206\002\029\000\000\002\029\002\029\002\029\n\214\002\029\n\222\002\029\000\000\002\029\002\029\000\000\000\000\000\000\000\000\000\000\n\198\002\029\002\029\002\029\011\130\002\029\002\029\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\029\000\000\011\154\002\029\002\029\016\138\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\029\000\000\016\162\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\029\002\029\000\000\000\000\000\000\011\162\002\029\000\000\000\000\000\000\000\000\000\000\002\029\002\029\000*\000\000\002\029\002\029\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\029\000\000\000\000\011\138\002\029\002\029\012*\011Z\002!\011r\002!\n\182\002!\011z\002!\011\194\002!\000\000\002!\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002!\n\206\002!\000\000\002!\002!\002!\n\214\002!\n\222\002!\000\000\002!\002!\000\000\000\000\000\000\000\000\000\000\n\198\002!\002!\002!\011\130\002!\002!\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002!\000\000\011\154\002!\002!\017:\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002!\000\000\017R\000\000\012\"\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002!\002!\000\000\000\000\000\000\011\162\002!\000\000\000\000\000\000\000\000\000\000\002!\002!\000*\000\000\002!\002!\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002!\000\000\000\000\011\138\002!\002!\012*\011Z\002\r\011r\002\r\n\182\002\r\011z\002\r\011\194\002\r\000\000\002\r\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\011\210\000\000\000\000\n\190\002\r\n\206\002\r\000\000\002\r\002\r\002\r\n\214\002\r\n\222\002\r\000\000\002\r\002\r\000\000\000\000\000\000\000\000\000\000\n\198\002\r\002\r\002\r\011\130\002\r\002\r\000\000\000\022\000\000\000\000\000\026\000\000\011\146\002\r\000\000\011\154\002\r\002\r\017\138\000\030\000\000\000\000\000\000\000\000\000\000\000\000\003r\003v\000\000\000\000\002\r\000\000\017\162\000\000\012\"\000\000\000\000\000\000\000\014\003z\000&\000\000\003~\000\018\000\018\002\r\002\r\003\210\000\000\000\000\011\162\002\r\000\000\000\000\000\000\000\000\000\000\002\r\002\r\000*\000\000\002\r\002\r\000\000\000.\003\214\000\000\000\000\000\000\003\138\000\000\002\r\003\218\000\000\011\138\002\r\002\r\012*\000\022\000\022\003\222\000\026\000\026\000\000\000\000\000\000\000\000\000\000\003\226\004\214\000\030\003\230\000\000\000\000\005\245\003\242\005\170\000\000\000\000\004}\000\000\000\000\004}\002\190\004\n\006\166\000\000\004}\000\000\000\000\006\178\000&\000&\000\000\005\245\000\000\000\000\000\000\000\021\000\021\000\000\000\000\000\000\000\000\006\182\000\000\000\021\000\000\005\245\000\000\000*\000*\004}\000\000\000\000\000.\000.\000\000\000\000\000\000\000\000\000\000\004}\000\000\005\157\004}\003z\000\000\006\186\006\190\000\000\000\018\000\000\004}\004}\000\000\000\000\000\000\004}\004}\000\000\000\000\005\157\005\157\005\157\000\000\000\000\004}\000\000\000\000\005\157\005\157\000\000\000\000\000\000\004}\003\138\000\000\000\021\000\000\000\000\004}\004}\000\000\000\000\000\000\000\022\006%\000\014\000\026\005m\000\000\000J\000\018\004}\005m\000\000\000\000\003\146\004}\004}\000\000\003\242\000\000\006\005\006\005\006\005\000\000\000\000\000\000\004}\004\n\006\005\006%\006%\000\000\005m\000\000\000\000\000&\005m\005m\000\000\005\157\005\157\006\005\000\000\000\000\000\022\000\000\005m\000\026\000\000\005m\000\000\005\157\000\000\000\000\000*\005\157\000\030\006\206\005m\000.\000B\000\000\005m\006\218\006\005\000\000\000\000\000\000\000\000\002\190\000\000\005m\005m\000\000\000\000\005m\000\000\000&\000\000\005m\006\005\000\000\000\000\006\206\005m\015b\015f\000\000\005m\006\218\000\000\000\000\000\000\006\005\006\005\004\177\000*\005m\005m\000\000\004\177\000.\000\000\005m\015n\005m\000\000\000\000\000\000\000\000\000\000\015b\015f\015:\019\018\004\213\000\000\000\000\000\000\000\000\004\213\000\000\000\000\000\000\005m\004\177\000\000\000\000\000\000\005m\015n\000\000\000\000\0192\000\000\004\177\000\000\000\000\004\177\000\000\019\002\000\000\000\000\000\000\000\000\004\213\004\177\004\177\000\000\000\000\000\000\004\177\004\177\000\000\000\000\004\213\000\000\000\000\004\213\000\000\004\177\000\000\000\000\000\000\000\000\000\"\004\213\004\213\004\177\000\000\000\000\004\213\004\213\000\000\004\177\004\177\000\000\000\000\000\014\000\000\004\213\000\000\000\000\000\018\000\000\000\000\0006\004\177\004\213\000\000\000\000\000\000\004\177\004\177\004\213\004\213\006\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\000N\000\000\004\213\007\017\000\000\000\000\000\000\004\213\004\213\000\000\000\000\000b\000j\000\022\000\000\000z\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\030\000\000\000\214\000\000\000B\000\000\000\150\000\000\000\000\000\000\000\000\000\158\000f\002\190\002\194\000\000\000\182\000\210\000N\000\000\000\000\000&\000\000\000\000\000\000\002f\000\000\000\000\000\000\000b\000j\000\000\000\000\000z\000\000\000\000\005\165\000\000\000\000\000\000\000*\005\165\000\130\000\000\000\000\000.\000\000\000\014\000\222\000\150\000\000\000\000\000\018\000\000\000\158\000f\000\000\002\214\000\000\000\182\000\210\000\254\001\002\000R\000\000\000\000\000\000\000\000\000\218\000\000\001\006\006\217\000\000\000\000\000\000\005\165\005\165\003\246\003z\005\165\000\000\000\000\005\165\000\018\000\000\000\000\005\237\000\022\005\165\000\014\000\026\000\222\000\000\005\237\000\018\000\000\000\000\000\000\005*\000\030\000\000\005\165\006u\005\245\000\254\001\002\005\165\000\000\003\138\005\165\000\000\000\000\002\190\001\006\000\000\000\000\000\000\005\237\000\022\000\000\000&\000\026\000\000\005\245\000V\000\000\000\014\005\165\005\165\000\022\003\230\000\018\000\026\005\165\003\242\005\170\000\000\005\245\005\237\000*\005\226\000\030\000\000\018\170\000.\005\245\005\165\000\000\000\000\000\000\000\000\000&\000\000\000\000\002\190\000\014\000\000\005\237\000\000\000\000\000\018\000\000\000&\000\000\000\000\005\245\000\022\000\000\000\000\000\026\000*\000\000\000\000\000\000\000\000\000.\000\000\006J\000\030\005\245\000\000\000*\005\245\000\000\000\014\000\000\000.\000\000\000\000\000\018\000\000\002\190\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\000\000\005\245\000\000\000\000\000\000\007\222\000\030\000\000\000\000\000\014\005\245\000\000\000\000\000\000\000\018\005\245\000\000\000*\000\000\002\190\000\000\000\000\000.\000\022\000\000\000\000\000\026\000&\000\000\000\000\005\245\000\000\000\000\000\000\b2\000\030\000\000\000\000\000\014\005\245\000\000\000\000\000\000\000\018\005\245\000\000\000*\000\000\002\190\000\022\000\000\000.\000\026\000\014\000\000\000\000\000&\000\000\000\018\005\245\b\134\000\030\000\000\000\000\000\000\005\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\245\002\190\000*\000\000\000\000\000\022\000\000\000.\000\026\000&\000\000\000\000\005\245\000\000\000\000\000\000\b\214\000\030\000\000\000\000\000\022\005\245\000\000\000\026\000\014\000\000\005\245\000\000\000*\000\018\002\190\t*\000\030\000.\000\000\000\000\005\245\000\000\000&\000\014\000\000\005\245\000\000\000\000\000\018\002\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\005\245\005\245\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000\000\000\026\000\014\000\000\005\245\000\000\000*\000\018\000\000\tz\000\030\000.\000\000\000\022\005\245\000\000\000\026\000\014\000\000\000\000\000\000\000\000\000\018\002\190\nF\000\030\000\000\000\000\000\000\005\245\000\000\000&\000\000\000\000\005\245\000\000\000\000\000\000\002\190\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\005\245\005\245\000*\000\000\000\000\014\182\000\030\000.\000\000\000\022\005\245\000\000\000\026\000\014\000\000\005\245\000\000\000*\000\018\002\190\016\002\000\030\000.\000\000\000\000\005\245\000\000\000&\000\014\000\000\005\245\000\000\000\000\000\018\002\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\005\245\005\245\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000\000\000\026\000\014\000\000\005\245\000\000\000*\000\018\000\000\016R\000\030\000.\000\000\000\022\005\245\000\000\000\026\000\014\000\000\000\000\000\000\000\000\000\018\002\190\016\166\000\030\000\000\000\000\000\000\005\245\000\000\000&\000\000\000\000\005\245\000\000\000\000\000\000\002\190\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\005\245\005\245\000*\000\000\000\000\017\002\000\030\000.\000\000\000\022\005\245\000\000\000\026\000\014\000\000\005\245\000\000\000*\000\018\002\190\017V\000\030\000.\000\000\000\000\005\245\000\000\000&\000\014\000\000\005\245\000\000\000\000\000\018\002\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\005\245\005\245\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000Q\000\026\000\014\000\000\005\245\000\000\000*\000\018\000\000\017\166\000\030\000.\000\000\000\022\005\245\000\000\000\026\000M\000Q\000Q\000Q\000\000\000\000\002\190\017\246\000\030\000Q\000Q\000\000\005\245\000\000\000&\000\000\000\000\005\245\000M\000M\000M\002\190\001>\000\000\000\000\000\022\000M\000M\000\026\000&\000\000\005\245\005\245\000*\000\000\000\000\018J\000\030\000.\001>\000\000\005\245\000\000\000\000\000\000\000\000\005\245\000\014\000*\000\014\002\190\000\000\000\018\000.\000\018\000\000\000\000\000\000\000&\000\000\000\000\005\245\000Q\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\005\245\000\000\000*\000Q\000M\000M\000\000\000.\000\000\000\000\000\000\000\000\000\022\000\000\000\022\000\026\000M\000\026\001F\000\000\000M\000\000\000\000\017\218\000\030\018.\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\017\242\000\000\018F\000\000\000\000\000\000\000\000\000\000\000&\000\000\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\000\000*\000\000\000\000\000.\000\000\000."))
+  
+  and lhs =
+    (8, "\003\002\001\000\\\\[ZYXWWWVVVVUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSRRQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJIIHHHHHGGGGGFFFEEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBAAAAAAAAAAAAAAA@@?>==<<<<<<;:99887776654321000//..--,,,,+++++++**))(((('''&&&&%%%%$$$####\"\"\"!!!    \031\031\031\030\030\030\030\029\029\029\029\028\028\028\027\027\027\026\026\026\026\025\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\020\020\020\019\019\018\017\017\017\016\015\015\014\014\r\r\r\r\r\r\012\012\011\011\011\011\011\011\011\011\011\n\n\n\n\n\n\t\b\b\b\b\b\b\b\007\006\006\005\005\004\004\004\004")
+  
+  and goto =
+    ((16, "\000\194\0004\000G\000\000\000\000\000\000\000\000\000!\000s\000\000\000\000\000\000\000\000\000e\000\000\000\178\000\023\000\157\023<\000O\000\000\000\000\000\000\000\024\020\212\000\t\021h\000\204\000\000\023X\000\000\000\000\000\178\001\004\000\000\000\000\023t\001<\000\000\001\152\000\000\001\170\000\000\000\000!\244\001\004\000\000\000\000\001\182\000\000\000\000\023\136\023\164\023\192\000\000\000\000!\248\001\198\000\000\"\004\000\000\000\000\030\182\n\130\011J\001d\000\000\000\000\000\000\000\000\000\000\000\174\022\178\000\000\030\198\000\000\000\000\000\000\000\000\023\212\000\000\023\240\000\000\022\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\212\000\000\000\000\000\000\000\000\000\000\000\000\024\012\000\000\000r\001\210\000\000\001\160\000\000\024 \000\000\024<\000\000\000\000\024X\000\000\000\000\000\000\001\180\000\000\000\000\000B\000\000\000\000\001\228\000\000\001\246\000\000\000\000\002\018\000\000\000\000\002\"\000\000\0022\000\000\000\000\000\000\000\000\000\000\000\000\030\232\000\000\000\000\000\000\000\000\000\000\"\b\000\000\030\252\000\000\000\000\031\012\000\000\000\000\024l\000\000\000\000\022\158\000\000\000\000\000\000\000\000\000\000\002:\000\000\"\020\000\000\031\026\000\000\000\000\031.\000\000\000\000\000\000!>\000\000\000\000\000>\000\000\000\000\000\000\002\016\000\000\000\000\000\000\000\000\000~\000\000\024\136\000\000\000\000\000\000\000\000\000\000\001\216\000\000\002\012\000\000\000\000\000\000\000\000\000\000\000J\000\000\002\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\252\000\000\000\000\000\r\001\132\t\250\030\208\030\238\000\000\000\000\000I\000%\000\000\000\000\000\021\000\000\003v\000\000\n&\000\000\000\000\002V\000\000\000\000\024\164\000\000\024\184\000\000\000\020\031\b\031\"\031<\031V\031p\031\138\000\021\000H\031\164\022\154\000\000\0044\000\000\nZ\011F\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\230\000|\011z\000\176\000\000\000\228\000\000\001\026\005^\000\160\000\000\000\000\000\000\002(\002r\000\000\0026\006\b\000\210\000\220\000\000\000\000\000\000\007\018\000\000\000\000\0218\n\142\001\206\000\000\000\000\002L\002z\000\000\002\\\006\232\001j\007P\bv\000\000\000\000\000\000\000\000\002d\002\162\000\000\002j\bh\002X\000\000\b\148\002^\000\000\b\232\002|\000\000\000\000\002\144\002\218\000\000\002\158\b\238\002\140\000\000\002\196\003\n\000\000\002\204\b\248\002\192\000\000\b\254\002\214\000\000\t\n\002\228\000\000\002\212\0032\000\000\003\006\t&\002d\n\194\001B\001v\011\174\000\000\000\252\000\000\000\000\000\000\003$\000\000\003R\000\000\031\190\021d\021\136\tr\t\166\t\180\000\000\003\b\003Z\000\000\0034\tr\003>\000\000\003<\003\138\000\000\003L\tv\003\\\000\000\t~\003l\000\000\t\130\003r\000\000\t\200\000\000\t\204\t\218\t\218\000\000\003`\003\190\000\000\003p\t\154\003\160\000\000\003\164\003\218\000\000\003\180\t\158\003\180\000\000\t\164\003\196\000\000\t\166\003\202\000\000\t\238\000\000\001\170\n\238!L\000\000\011\"\000\000\t\178\001\222\031\216\000\000\011\226\000\000\031\242 \012 &\000\248\000\000\000\000\t\242\023(\000\000\000\000\011V\002\018\000\000\000\000 @\000\000\000\000\002F Z\000\000 t\000\000\000\021\020\"\021\180\021\216\012\022\002z\002\174\000\000\t\182\002\226\003\022\012J\003J\000\000\000\000\012~\000\000\003\216\004&\000\000\003\232\t\192\003F\011\138\000\000!\\\000\000\011\190\t\198\t\202\000\000\000\000\003~ \142\000\000\000\000!j\000\000\011\242\000\000\000\000\000\000\002\002\000\000\000\000\003\252\004F\000\000\0040\t\202\003\212\000\000\0048\004N\000\000\004>\t\210\004,\000\000\t\226\0042\000\000\t\236\004P\000\000\000\000\004@\004v\000\000\004d\t\242\004`\000\000\004r\004\174\000\000\004\152\t\246\004\132\000\000\t\254\004\148\000\000\n\002\004\164\000\000\004\168\004\222\000\000\004\204\n\006\004\172\000\000\000\000\004\220\005\018\000\000\005\000\n\b\004\188\000\000\n\n\004\204\000\000\n\014\004\228\000\000\005\014\005^\000\000\005\016\n\018\005\002\000\000\0054\005~\000\000\005B\n\028\0050\000\000\n \0056\000\000\n\"\005T\000\000\000\000\005h\005\178\000\000\005v\n&\005d\000\000\005\156\005\226\000\000\005\164\n*\005\152\000\000\n2\005\174\000\000\n:\005\188\000\000\005\172\006\n\000\000\005\222\nB\005\220\000\000\005\224\006\022\000\000\005\240\nF\005\240\000\000\nZ\006\000\000\000\n^\006\006\000\000\000\000\n~\000\000\000\000\003\178\nj\nr\000\000\000\000\000\000 \168\000\000\003\230\000\000\000\000\000\000\n\178\000\000\004\026\004N\004\130\004\182\004\234\000\000\005\030 \194\000\000\000\232\n\188\n\190\000\000\006\020\006b\000\000\006$\n\138\006\016\000\000\0068\006\130\000\000\006l\n\142\0064\000\000\n\146\006X\000\000\n\154\006h\000\000\n\238\000\000\000\000\000\000\n\242\012&\005R\000\000\000\000\000\000\000\000\000\000\000\000\022n\000\000\000\000\024\\\000\000\024z\000\000\024\152\000\000\024\178\000\000\024\204\000\000\024\230\000\000\012Z\005\134\000\000\000\000\000\000\000\000\000\000\000\000\005\186\000\000\005\238\000\000\006\"\000\000\006V\000\000\000\000\000\000\006\138\000\000\006\190\000\000\006\242\000\000\000\000\000\248\000\000\000\000\000\000\025\000\000\000\012\142\000\000\000\000\000\000\025\026\000\000\0254\000\000\025N\000\000\025h\000\000\025\130\000\000\025\156\000\000\025\182\000\000\012\194\000\000\012\246\000\000\r*\000\000\025\208\000\000\r^\000\000\025\234\000\000\r\146\000\000\r\198\000\000\r\250\000\000\014.\000\000\014b\000\000\014\150\000\000\026\004\000\000\026\030\000\000\0268\000\000\026R\000\000\026l\000\000\026\134\000\000\026\160\000\000\026\186\000\000\026\212\000\000\026\238\000\000\027\b\000\000\014\202\000\000\014\254\000\000\0152\000\000\015f\000\000\027\"\000\000!H\000\000\015\154\000\000\015\206\000\000\016\002\000\000\0166\000\000\000\000\027<\000\000\016j\000\000\027V\000\000\016\158\000\000\027p\000\000\016\210\000\000\027\138\000\000\017\006\000\000\027\164\000\000\027\190\000\000\017:\000\000\027\216\000\000\017n\000\000\027\242\000\000\017\162\000\000\028\012\000\000\017\214\000\000\028&\000\000\018\n\000\000\018>\000\000\028@\000\000\028Z\000\000\018r\000\000\028t\000\000\028\142\000\000\028\168\000\000\018\166\000\000\028\194\000\000\018\218\000\000\019\014\000\000\028\220\000\000\028\246\000\000\029\016\000\000\029*\000\000\029D\000\000\029^\000\000\029x\000\000\029\146\000\000\019B\000\000!V\000\000\019v\000\000\019\170\000\000\029\172\000\000\019\222\000\000\029\198\000\000\029\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\178\000\000\000\000\007&\000\000\000\000\000\000\007Z\000\000\007\142\000\000\007\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\246\000\000\000\000\000\000\b*\000\000\000\000\000\000\006z\006\178\000\000\006|\n\186\005<\000\000\n\190\006l\000\000\n\198\006x\000\000\000\000\b^\000\000\000\000\000\000\000\000\b\146\000\000\000\000\b\198\000\000\000\000\000\000\000\000\022\004\000\000\000\000\000\000\n\242\000\000\000\000\000\000\000\000\000\000\000\000\b\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!z\000\000\020\018\000\000\tX\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020F\000\000\020~\000\000\000\000\006\176\006\226\000\000\006\196\n\202\006\132\000\000\n\206\006\144\000\000\n\208\006\166\000\000\006\220\0072\000\000\006\244\n\210\006\214\000\000\007\b\007R\000\000\007\022\n\214\007\004\000\000\n\218\007\n\000\000\n\228\007(\000\000\000\000\007<\007\134\000\000\007J\n\232\0078\000\000\007p\007\182\000\000\007x\n\234\007l\000\000\n\238\007\130\000\000\n\242\007\144\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\000\001\142\000\000\000\000\007\128\007\222\000\000\007\178\n\250\007\176\000\000\n\254\007\196\000\000\011\002\007\212\000\000\000\000\007\180\007\234\000\000\007\196\011\n\007\218\000\000\007\232\b6\000\000\007\248\011\014\007\228\000\000\011\030\b\b\000\000\011\"\b\024\000\000\b\012\bz\000\000\b\028\011&\006\220\000\000\bH\b\134\000\000\bP\011.\b&\000\000\0112\b8\000\000\0116\bL\000\000\b|\b\186\000\000\b\132\011>\bp\000\000\b\176\b\238\000\000\b\182\011B\b\134\000\000\011R\b\164\000\000\011V\b\200\000\000\000\000\b\184\t\"\000\000\b\234\011Z\b\232\000\000\t\012\tJ\000\000\t\024\011b\t\004\000\000\011f\t\024\000\000\011j\t \000\000\000\000\000\000\011z\001F\t\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\020\170\000\000\000\000\000\000\000\000\001\224\011v\000\000\000\000\000\000\002X\000\000\000\000\004\130\000\000\t\014\000\000\tR\000\000\t\242 \248\000\000\000\000\t\242!\004\000\000\000\000\000\000!n\t\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\142\000\000\000\000\t\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\tx\020\224\000\000\000\000\000\000\021\012\000\000\000\000\t\148\000\000\000\000\0038\t\182\000\000\000\000\t\228\000\000\000\000\030f\000\000\030z\000\000\000\000\t\234\000\000\t\238\000\000\000\000\000\000\t\154\000\000\000\000\000\000\030\142\000\000\000\000\030\162\000\000\000\000\t\192\000\000\t\206\000\000\000\000\000\000\000\000"), (16, "\004\217\000=\000J\000\r\000L\000F\000G\000N\000\157\000\179\000\015\000\205\000\219\000\159\000\174\000\200\000\024\000=\000\170\000\192\000\161\000F\000G\001\004\001\005\000\181\003\208\000\184\000\179\002\172\000\185\001\179\000\202\001\006\001\007\001\189\000\194\002\212\000H\002\213\000{\001\004\001\005\002\214\000\181\003\210\004\223\002\219\002\220\001\004\001\005\001\006\001\007\004\215\000H\002\172\000\128\001\179\000\209\001\006\001\007\001\189\000=\002\212\000\214\002\213\000F\000q\000\204\002\214\001\005\003\210\004\168\002\219\002\220\000\179\002\161\000\180\002\162\002\165\000\184\000\179\002\166\000\185\002\167\000\202\002\168\004\212\000\210\000\212\002\170\000\181\002\189\002\190\002\191\000\212\001\005\000\181\000\144\000H\002\192\002\193\002\161\000Z\002\162\002\165\000\184\000\179\002\166\000\185\002\167\000\188\002\168\004\200\001!\000\002\002\170\000)\002\189\002\190\002\191\001e\001\005\000\181\001\020\001\021\002\192\002\193\002\161\000\146\002\162\002\165\000\199\000\179\002\166\000\185\002\167\000x\002\168\004\167\000\181\000[\002\170\000\131\002\189\002\190\002\191\0048\001\005\000\181\000\217\000\136\002\192\002\193\002\161\000\138\002\162\002\165\000\216\000\179\002\166\001\011\002\167\0013\002\168\004\166\001c\000'\002\170\004\225\002\189\002\190\002\191\002\158\001\005\000\181\001\005\004\159\002\192\002\193\002\161\002\158\002\162\002\165\001\005\002\160\002\166\000C\002\167\000\212\002\168\004\161\004?\001\177\002\170\004:\002\189\002\190\002\191\001!\001\004\001\005\004\235\001!\002\192\002\193\002\172\000\179\001\179\004\163\001\006\001\007\001\189\000=\002\212\001e\002\213\000F\000l\000)\002\214\001\005\003\210\000\181\002\219\002\220\000\220\002\161\000)\002\162\002\165\000,\004<\002\166\000)\002\167\004>\002\168\003\238\0013\000+\002\170\000)\002\189\002\190\002\191\0002\001\005\000)\000{\000H\002\192\002\193\002\161\000;\002\162\002\165\000\212\000{\002\166\000j\002\167\004\180\002\168\003\237\000}\000\196\002\170\0014\002\189\002\190\002\191\000{\001\005\000\127\001\020\001'\002\192\002\193\002\161\004:\002\162\002\165\000\194\004:\002\166\000\131\002\167\000\130\002\168\003\229\000\181\000\198\002\170\000\131\002\189\002\190\002\191\000\133\001\005\000)\001\020\001\238\002\192\002\193\002\161\000\135\002\162\002\165\000\194\000w\002\166\000\165\002\167\000)\002\168\003\226\000\181\004\182\002\170\004J\002\189\002\190\002\191\000\183\001\005\000\237\001\027\000)\002\192\002\193\002\161\000)\002\162\002\165\004\184\000\181\002\166\001?\002\167\001\025\002\168\003\214\000\181\001+\002\170\001-\002\189\002\190\002\191\001<\001\005\000)\0019\000\181\002\192\002\193\002\161\0013\002\162\002\165\0013\000\181\002\166\0017\002\167\000\181\002\168\003\213\000\181\003\255\002\170\001T\002\189\002\190\002\191\0013\001\005\004\185\001G\000)\002\192\002\193\002\161\0013\002\162\002\165\001;\000\181\002\166\001>\002\167\001E\002\168\003\194\000\181\002 \002\170\001Q\002\189\002\190\002\191\001N\001\005\000)\001A\004\n\002\192\002\193\002\161\0013\002\162\002\165\001I\000\181\002\166\001L\002\167\000\181\002\168\003\191\0013\000\181\002\170\000)\002\189\002\190\002\191\0013\001\005\004\237\001[\001\130\002\192\002\193\002\161\001Y\002\162\002\165\001P\000\207\002\166\001g\002\167\000)\002\168\003\190\000\181\000\181\002\170\001S\002\189\002\190\002\191\001u\001\005\001s\001V\001\127\002\192\002\193\002\161\005\014\002\162\002\165\001i\001|\002\166\000)\002\167\000\181\002\168\003\189\0013\000\181\002\170\001\156\002\189\002\190\002\191\001z\001\005\000\181\003\172\001\143\002\192\002\193\002\161\0013\002\162\002\165\001e\000\181\002\166\000)\002\167\0013\002\168\003\186\0013\000\181\002\170\001w\002\189\002\190\002\191\001\141\001\005\000)\002 \001\153\002\192\002\193\002\161\001e\002\162\002\165\001~\001\150\002\166\001\148\002\167\0013\002\168\003\167\001\129\000\181\002\170\001\132\002\189\002\190\002\191\0013\001\005\000\181\000\232\003\183\002\192\002\193\002\161\0013\002\162\002\165\0013\001\216\002\166\000)\002\167\0013\002\168\003\163\001\145\000\181\002\170\002\001\002\189\002\190\002\191\001\214\001\005\000\181\001\152\000)\002\192\002\193\002\161\000)\002\162\002\165\001\155\000\181\002\166\001\158\002\167\001\242\002\168\003\162\001\246\001\249\002\170\001\244\002\189\002\190\002\191\001\254\001\005\000)\001\251\002\022\002\192\002\193\002\161\0013\002\162\002\165\0013\000\181\002\166\002\007\002\167\000\181\002\168\003\161\000\181\000\181\002\170\002\t\002\189\002\190\002\191\0013\001\005\004\187\002\019\000)\002\192\002\193\002\161\0013\002\162\002\165\001\253\000\181\002\166\002\000\002\167\002\014\002\168\003\160\000\181\001\000\002\170\002\016\002\189\002\190\002\191\0013\001\005\000)\002\003\002+\002\192\002\193\002\161\0013\002\162\002\165\002\011\000\181\002\166\002\027\002\167\0013\002\168\003\159\004\185\000\181\002\170\002\029\002\189\002\190\002\191\002\031\001\005\000)\002\018\002(\002\192\002\193\002\161\002'\002\162\002\165\002\021\000\181\002\166\002#\002\167\002*\002\168\003\158\002\024\000\181\002\170\002%\002\189\002\190\002\191\002 \001\005\002-\002?\0022\002\192\002\193\002\161\002 \002\162\002\165\0013\000\181\002\166\000)\002\167\002 \002\168\003\157\000\181\000\181\002\170\002<\002\189\002\190\002\191\0020\001\005\002 \0029\000)\002\192\002\193\002\161\0013\002\162\002\165\0013\000\181\002\166\0024\002\167\0027\002\168\003\146\000\181\003\179\002\170\002T\002\189\002\190\002\191\0013\001\005\001\019\002G\000)\002\192\002\193\002\161\0013\002\162\002\165\002;\000\181\002\166\002>\002\167\002E\002\168\002\169\000\181\002 \002\170\002Q\002\189\002\190\002\191\002N\001\005\000)\002A\002h\002\192\002\193\002\161\0013\002\162\002\165\002I\000\181\002\166\002L\002\167\000\181\002\168\002\188\0013\000\181\002\170\000)\002\189\002\190\002\191\0013\001\005\000)\002[\002e\002\192\002\193\002\161\002Y\002\162\002\165\002P\002b\002\166\002`\002\167\0013\002\168\002\195\000\181\000\181\002\170\002S\002\189\002\190\002\191\0013\001\005\000\181\002V\002\155\002\192\002\193\002\161\0013\002\162\002\165\0013\002\142\002\166\000)\002\167\0013\002\168\002\210\002]\000\181\002\170\002\152\002\189\002\190\002\191\002\140\001\005\000\181\002d\000)\002\192\002\193\002\161\0013\002\162\002\165\002g\000\181\002\166\002j\002\167\002\147\002\168\002\199\002\144\001\028\002\170\002\149\002\189\002\190\002\191\0013\001\005\000)\003\180\003\177\002\192\002\193\002\161\0013\002\162\002\165\002\151\000\181\002\166\003\175\002\167\003\182\002\168\002\201\000\181\000\181\002\170\003\185\002\189\002\190\002\191\000)\001\005\004\006\002\154\004\007\002\192\002\193\002\161\004\t\002\162\002\165\002\157\004\002\002\166\004\004\002\167\002 \002\168\002\205\004\012\000\181\002\170\002 \002\189\002\190\002\191\004\030\001\005\002 \001$\000\181\002\192\002\193\002\161\002 \002\162\002\165\0013\004\017\002\166\000)\002\167\000\181\002\168\002\207\002 \004h\002\170\004\027\002\189\002\190\002\191\004\015\001\005\000\181\004\024\000)\002\192\002\193\002\161\0013\002\162\002\165\0013\000\181\002\166\004\019\002\167\004\022\002\168\002\209\000\181\002 \002\170\0043\002\189\002\190\002\191\0013\001\005\001.\004&\000)\002\192\002\193\002\161\0013\002\162\002\165\004\026\000\181\002\166\004\029\002\167\004$\002\168\003\148\000\181\0012\002\170\0040\002\189\002\190\002\191\004-\001\005\000)\004 \004G\002\192\002\193\002\161\0013\002\162\002\165\004(\000\181\002\166\004+\002\167\000\181\002\168\003\152\0013\000\181\002\170\000)\002\189\002\190\002\191\0013\001\005\000)\004D\004_\002\192\002\193\002\161\004B\002\162\002\165\004/\004R\002\166\004P\002\167\0013\002\168\003\154\000\181\000\181\002\170\0042\002\189\002\190\002\191\0013\001\005\000\181\0045\004\\\002\192\002\193\002\161\0013\002\162\002\165\0013\004Y\002\166\000)\002\167\0013\002\168\003\156\004F\000\181\002\170\004s\002\189\002\190\002\191\004W\001\005\000\181\004I\004f\002\192\002\193\002\161\0013\002\162\002\165\004L\000\181\002\166\004T\002\167\0013\002\168\003\166\004[\000\181\002\170\000)\002\189\002\190\002\191\004p\001\005\000)\004o\004m\002\192\002\193\002\161\004d\002\162\002\165\004^\004r\002\166\004k\002\167\000\181\002\168\003\170\004a\000\181\002\170\004u\002\189\002\190\002\191\004\135\001\005\000)\002 \004z\002\192\002\193\002\161\0013\002\162\002\165\0011\002 \002\166\004x\002\167\000\181\002\168\003\188\0013\000\181\002\170\002 \002\189\002\190\002\191\004\132\001\005\000)\004\129\004\156\002\192\002\193\002\161\0013\002\162\002\165\004|\001:\002\166\004\127\002\167\000\181\002\168\003\193\000\181\000\181\002\170\004\131\002\189\002\190\002\191\0013\001\005\000)\004\143\003\212\002\192\002\193\002\161\001=\002\162\002\165\004\134\004\189\002\166\004\141\002\167\0013\002\168\003\196\000\181\004\153\002\170\000)\002\189\002\190\002\191\004\150\001\004\001\005\004\137\0013\002\192\002\193\002\172\004\148\001\179\000\181\001\006\001\007\001\189\0013\002\212\000\181\002\213\0013\004\145\004\191\002\214\001\005\003\210\001@\002\219\002\220\001H\002\161\004\185\002\162\002\165\001O\004\152\002\166\001R\002\167\004\226\002\168\003\231\005\007\001U\002\170\004\155\002\189\002\190\002\191\004\158\001\005\004\247\005\012\004\234\002\192\002\193\002\161\001\\\002\162\002\165\001\133\005\007\002\166\004\252\002\167\004\185\002\168\003\244\005\007\004\232\002\170\005\t\002\189\002\190\002\191\000)\001\005\004\247\005\011\004\247\002\192\002\193\002\161\004\232\002\162\002\165\001o\004\241\002\166\004\249\002\167\004\251\002\168\004\164\001p\001v\002\170\001}\002\189\002\190\002\191\001\128\001\005\001\131\001\134\001\159\002\192\002\193\002\161\004\221\002\162\002\165\001\137\001\138\002\166\001\144\002\167\001\151\002\168\004\216\001\154\001\157\002\170\001\160\002\189\002\190\002\191\001\168\003\221\001\204\001\004\001\005\002\192\002\193\001\217\001\226\002\172\001\225\001\179\001\245\001\006\001\007\001\189\001\252\000=\000D\003\247\000\\\000F\000G\002\214\001\255\001\004\001\005\003\248\003\249\002\002\003\250\002\172\002\n\001\179\002\017\001\006\001\007\001\189\002\020\002\212\002\023\002\213\002\030\002&\002)\002\214\002,\004\214\0023\002\219\002\220\001\004\001\005\002:\000H\002=\002@\002\172\002H\001\179\002O\001\006\001\007\001\189\002R\002\212\002m\002\213\002U\001\004\001\005\002\214\002\\\004\170\002c\002\219\002\220\001\004\001\005\001\006\001\007\002n\003\245\002\172\002f\001\179\002i\001\006\001\007\001\189\002s\002\212\002|\002\213\002r\001\004\001\005\002\214\002\136\0046\002\137\002\219\002\220\001\004\001\005\001\006\001\007\002n\002\143\002\172\002\150\001\179\002\153\001\006\001\007\001\189\002\156\000=\000D\003\247\000E\000F\000G\002\214\002\159\001\004\001\005\003\248\003\249\003\144\003\250\002\172\003\178\001\179\003\181\001\006\001\007\001\189\003\184\002\212\004\005\002\213\004\b\004\011\004\018\002\214\004\025\003\228\004\028\002\219\002\220\001\004\001\005\004\031\000H\004'\004.\002\172\0041\001\179\0044\001\006\001\007\001\189\004E\002\212\004H\002\213\004K\001\004\001\005\002\214\004S\003\227\004Z\002\219\002\220\001\004\001\005\001\006\001\007\001\b\004]\002\172\004`\001\179\004g\001\006\001\007\001\189\004n\002\212\004q\002\213\004t\001\004\001\005\002\214\004{\003\215\004\130\002\219\002\220\001\004\001\005\001\006\001\007\001\r\004\133\002\172\004\136\001\179\004\144\001\006\001\007\001\189\004\151\002\212\004\154\002\213\004\157\001\004\001\005\002\214\004\165\003\171\004\172\002\219\002\220\001\004\001\005\001\006\001\007\001a\004\213\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\003\168\000\000\002\219\002\220\001\004\001\005\001\006\001\007\001\172\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\003\164\000\000\002\219\002\220\001\004\001\005\001\006\001\007\001\200\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\003\138\000\000\002\219\002\220\001\004\001\005\001\006\001\007\001\207\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\003-\000\000\002\219\002\220\001\004\001\005\001\006\001\007\001\211\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\002\218\000\000\002\219\002\220\001\004\001\005\001\006\001\007\003\145\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\001\004\001\005\002\214\000\000\002\236\000\000\002\219\002\220\001\004\001\005\001\006\001\007\003\222\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\238\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\240\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\244\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\248\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\250\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\252\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\002\254\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\000\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\002\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\026\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\028\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\030\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003 \000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003&\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003(\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003*\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003,\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\0031\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\0035\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\0039\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003=\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003C\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003G\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003K\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003O\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003S\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003U\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003[\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003c\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003g\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003i\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003{\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\127\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\129\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\003\133\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\003\252\002\172\000\000\001\179\001\005\001\006\001\007\001\189\000\000\002\212\000\000\002\213\003\204\002\165\000\000\002\214\002\166\003\242\000\000\002\219\002\220\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\254\001\179\000\000\001\006\001\007\001\189\000\000\002\193\000\000\003\247\000=\000\163\000\000\002\214\000F\000G\000\000\003\248\003\249\000\000\003\250\001\004\001\005\000\000\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\000\000\000\000\003\247\000\000\000\000\000\000\002\214\000\000\001\004\001\005\003\248\003\249\000H\003\250\002\172\004\227\001\179\000\000\001\006\001\007\001\189\000\000\002\212\000\000\002\213\000\000\000\000\000\000\002\214\000\000\004\174\000\000\002\219\002\220\000\000\001\004\001\005\004\231\000\000\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\000=\000\151\003\247\000\000\000F\000G\002\214\000\000\001\004\001\005\003\248\003\249\000\000\004\229\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\000\000\000\000\003\247\000\000\000\000\003\234\002\214\000\000\001\004\001\005\003\248\003\249\000\000\004\229\002\172\000H\001\179\000\000\001\006\001\007\001\189\000\000\000\000\003\232\003\247\000\000\000\000\000\000\002\214\000\000\001\004\001\005\003\248\003\249\000\000\0047\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\003\199\003\202\002\213\000\000\001\004\001\005\002\214\000\000\000\000\000\000\002\172\002\220\001\179\000\000\001\006\001\007\001\189\000\000\003\199\003\197\002\213\000\000\000\000\000\000\002\214\000\000\001\004\001\005\000\000\002\220\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\003\199\003\201\002\213\000\000\001\004\001\005\002\214\000\000\000\000\000\000\002\172\002\220\001\179\000\000\001\006\001\007\001\189\000\000\003\199\000\000\002\213\000\000\000\000\000\000\002\214\000\000\001\004\001\005\000\000\002\220\000\000\000\000\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\003\199\000\000\002\213\000\000\000\000\000\000\002\214\000\000\000\000\000=\000J\002\220\000L\000F\000G\000N\000\157\000\000\000\000\000=\000J\000\159\000L\000F\000G\000N\000\000\000\000\000\160\000=\000J\000O\000L\000F\000G\000N\000\000\004\175\000\000\001\004\001\005\000O\000V\004\177\000\000\002\172\000H\001\179\000\000\001\006\001\007\001\189\000U\000\000\000\000\000\000\000H\000\000\000\000\002\173\000\000\001\004\001\005\000\000\000\000\000\000\000H\000\000\000\000\004\192\000\000\001\006\001\007\001\189\000\000\000\000\000\000\000\000\000=\000J\004\185\000L\000F\000G\000N\000\000\000\000\000\000\000=\000J\000O\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000\173\001\181\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000\145\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000H\000=\000J\000\143\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000e\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000c\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000H\000=\000J\000a\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000Q\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000S\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000H\000=\000J\000g\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000n\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000p\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000H\000=\000J\000s\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000\156\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000\000\000\000\000\000\000\190\000H\000=\000J\000\000\000L\000F\000G\000N\000\000\000\000\000H\000=\000J\000\240\000L\000F\000G\000N\000\000\001\004\001\005\000\000\000\000\000\242\000H\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\000\000\001\004\001\005\000\000\000\000\000H\002\175\002\172\000\000\001\179\000\000\001\006\001\007\001\189\000\000\000H\001\004\001\005\000\000\000\000\000\000\002\177\002\172\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\179\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\181\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\183\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\185\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\216\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\222\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\224\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\226\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\228\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\230\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\232\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\234\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\242\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\002\246\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\004\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\006\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\b\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\n\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\012\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\014\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\016\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\018\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\020\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\022\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\024\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\"\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003/\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\0033\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\0037\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003;\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003?\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003A\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003E\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003I\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003M\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003Q\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003W\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003Y\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003]\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003_\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003a\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003e\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003k\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003m\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003o\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003q\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003s\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003u\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003w\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003y\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\131\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\172\003\135\001\179\000\000\001\006\001\007\001\189\000=\000J\000\000\000L\000F\000G\000N\003\137\000\000\000\000\000=\000J\004\244\000L\000F\000G\000N\000\000\000\000\000\000\000=\000J\004\246\000L\000F\000G\000N\000\000\000\000\000\000\000=\000J\005\003\000L\000F\000G\000N\000H\000\000\000\000\000=\000J\005\006\000L\000F\000G\000]\000H\000=\000J\000\000\000L\000F\000G\000M\000=\000J\000H\000L\000F\000G\000`\000\000\000\000\000\000\000=\000J\000H\000L\000F\000G\000\142\000\000\000\000\000\000\000=\000J\000H\000L\000F\000G\000\150\000\000\000=\000J\000H\000L\000F\000G\000\153\000=\000J\000H\000L\000F\000G\000\169\000\000\000\000\000\000\000=\000J\000H\000L\000F\000G\000\172\001\004\001\005\000\000\000\000\000\000\000H\004\220\000\000\001\179\000\000\001\006\001\007\001\189\000H\000\000\001\004\001\005\000\000\000\000\000\000\000H\004\219\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000H\000\000\000\000\000\000\004\211\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\210\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\209\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\208\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\207\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\206\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\004\199\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\003\236\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\003\225\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\003\224\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\003\223\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\001\178\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\001\188\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\001\192\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\001\194\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\001\229\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002v\000\000\001\179\000\000\001\006\001\007\001\189\001\004\001\005\000\000\000\000\000\000\000\000\002\133\000\000\001\179\004\194\001\006\001\007\001\189\000=\000J\004\198\000L\000F\000G\003$\000=\000J\000\000\000L\000F\000G\003}\001\004\001\005\000\000\000\000\000\000\000\000\001\004\001\005\004\196\000\000\001\006\001\007\001\189\000\000\004\196\000\000\001\006\001\007\001\189\000\184\000\179\000\000\000\185\000H\000\186\000\191\000\184\000\179\000\000\000\185\000H\000\186\001\164\000\000\000\184\000\179\000\181\000\185\000\000\000\186\001\221\000\184\000\179\000\181\000\185\000\000\000\186\001\232\000\000\000\184\000\179\000\181\000\185\000\000\000\186\003\240\000\000\000\000\000\181\001\004\001\005\000\000\000\000\000\000\000\000\000\000\000\181\004\202\000\000\001\006\001\007\001\189\000=\000\140\000=\000^\000F\000G\000F\000G\000=\000>\000=\000\148\000F\000G\000F\000G\000=\000\167\000\000\000\000\000F\000G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000H\000\000\000\000\000\000\000\000\000\000\000H\000\000\000H\000\000\000\000\000\000\000\000\000\000\000H"))
+  
+  and semantic_action =
+    [|
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ option) = 
+# 486 "mo_frontend/parser.mly"
+                ( Some t )
+# 957 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ option) = 
+# 487 "mo_frontend/parser.mly"
+                ( None )
+# 975 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 559 "mo_frontend/parser.mly"
+                ( PrimE("dummy") @? at _sloc )
+# 1004 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 745 "mo_frontend/parser.mly"
+    ( BlockE(ds) @? at _sloc )
+# 1048 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 749 "mo_frontend/parser.mly"
+    ( {pat = p; exp = e} @@ at _sloc )
+# 1092 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 753 "mo_frontend/parser.mly"
+    ( {pat = p; exp = e} @@ at _sloc )
+# 1136 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 1171 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1186 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1192 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 907 "mo_frontend/parser.mly"
+                              ( snd (xf "object" _sloc), dfs )
+# 1201 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 1235 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 907 "mo_frontend/parser.mly"
+                              ( snd (xf "object" _sloc), dfs )
+# 1243 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_dfs_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos_dfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 908 "mo_frontend/parser.mly"
+                 ( anon_id "object" (at _sloc) @@ at _sloc, dfs )
+# 1273 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v : (Mo_def.Syntax.dec) = 
+# 890 "mo_frontend/parser.mly"
+    ( d )
+# 1299 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v : (Mo_def.Syntax.dec) = 
+# 892 "mo_frontend/parser.mly"
+    ( d )
+# 1324 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 894 "mo_frontend/parser.mly"
+    ( ExpD e @? at _sloc )
+# 1353 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fail;
+          MenhirLib.EngineTypes.startp = _startpos_fail_;
+          MenhirLib.EngineTypes.endp = _endpos_fail_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fail : (Mo_def.Syntax.exp) = Obj.magic fail in
+        let _5 : unit = Obj.magic _5 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fail_ in
+        let _v =
+          let _endpos = _endpos_fail_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 896 "mo_frontend/parser.mly"
+    ( let p', e' = normalize_let p e in
+      LetD (p', e', Some fail) @? at _sloc )
+# 1419 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = s;
+            MenhirLib.EngineTypes.startp = _startpos_s_;
+            MenhirLib.EngineTypes.endp = _endpos_s_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = v;
+              MenhirLib.EngineTypes.startp = _startpos_v_;
+              MenhirLib.EngineTypes.endp = _endpos_v_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let s : (Mo_def.Syntax.stab option) = Obj.magic s in
+        let v : (Mo_def.Syntax.vis' Source.phrase) = Obj.magic v in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_v_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = if _startpos_v_ != _endpos_v_ then
+            _startpos_v_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 764 "mo_frontend/parser.mly"
+    ( {dec = d; vis = v; stab = s} @@ at _sloc )
+# 1469 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 851 "mo_frontend/parser.mly"
+    ( let p', e' = normalize_let p e in
+      LetD (p', e', None) @? at _sloc )
+# 1521 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 1563 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 1573 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 1582 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 854 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 1591 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 1654 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 1664 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 1673 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 854 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 1682 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 1724 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1739 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1745 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 1755 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 1775 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 1816 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 1825 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 1845 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 1887 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1902 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1908 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 1918 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 1938 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 1979 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 1988 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 2008 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 2050 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2065 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2071 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 2081 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 2101 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _3 : (unit option) = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2142 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 2151 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( let named, x = xf "object" _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+              (objblock s (List.map share_dec_field efs) @? (at _sloc)))
+             @? at _sloc)
+        else objblock s efs
+      in
+      let_or_exp named x e (at _sloc) )
+# 2171 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 2220 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 2230 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2240 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2246 "mo_frontend/parser.ml"
+            
+          in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2252 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2269 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 2339 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 2349 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2359 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2365 "mo_frontend/parser.ml"
+            
+          in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2371 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2388 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 2436 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2441 "mo_frontend/parser.ml"
+           in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2446 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2463 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 2532 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2537 "mo_frontend/parser.ml"
+           in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2542 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2559 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 2626 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 2639 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2649 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2655 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 2665 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2683 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 2771 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 2784 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2794 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2800 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 2810 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2828 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = qo;
+                    MenhirLib.EngineTypes.startp = _startpos_qo_;
+                    MenhirLib.EngineTypes.endp = _endpos_qo_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 2897 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2902 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 2911 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2929 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = qo;
+                          MenhirLib.EngineTypes.startp = _startpos_qo_;
+                          MenhirLib.EngineTypes.endp = _endpos_qo_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3019 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3024 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3033 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3051 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 3112 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 3124 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3134 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3140 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3147 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3156 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3174 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 3256 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3268 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3278 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3284 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3291 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3300 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3318 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 3380 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3385 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3391 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3400 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3418 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3501 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3506 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3512 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3521 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3539 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 3606 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 3619 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3629 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3635 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 3642 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3651 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3669 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 3757 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3770 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3780 "mo_frontend/parser.ml"
+              
+            in
+            
+# 342 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3786 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 3793 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3802 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3820 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 3889 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3894 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 3900 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3909 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3927 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4017 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 343 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 4022 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 4028 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4037 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 869 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4055 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 4104 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 4114 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 4124 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 4130 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 4136 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4142 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4166 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 4236 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4246 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 4256 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 4262 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 4268 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4274 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4298 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 4346 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 4351 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 4356 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4362 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4386 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4455 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 4460 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 4465 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4471 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4495 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 4550 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 4561 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 4571 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 4577 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 4588 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 4594 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4601 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4625 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 4701 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4712 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 4722 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 4728 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 4739 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 4745 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4752 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4776 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 4831 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 4836 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 4846 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 4852 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4859 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 4883 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4959 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 4964 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 4974 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 4980 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 4987 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5011 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 5066 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 5077 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5087 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5093 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 5104 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5110 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5117 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5141 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 5217 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5228 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5238 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5244 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 5255 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5261 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5268 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5292 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 5347 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5352 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 5362 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5368 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5375 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5399 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5475 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5480 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 5490 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5496 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5503 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5527 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 5582 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 5593 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5603 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5609 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 5620 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5626 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5633 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5657 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 5733 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5744 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5754 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5760 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 5771 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5777 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5784 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5808 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 5863 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5868 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 5878 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 5884 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5891 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5915 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5991 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5996 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 6006 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 6012 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 372 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6019 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6043 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 6110 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 6123 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6133 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6139 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 6145 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6155 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6180 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 6268 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 6281 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6291 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6297 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 6303 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6313 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6338 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = qo;
+                    MenhirLib.EngineTypes.startp = _startpos_qo_;
+                    MenhirLib.EngineTypes.endp = _endpos_qo_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 6407 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6412 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 6417 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6427 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6452 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = qo;
+                          MenhirLib.EngineTypes.startp = _startpos_qo_;
+                          MenhirLib.EngineTypes.endp = _endpos_qo_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 6542 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6547 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 6552 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6562 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6587 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 6660 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 6674 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6684 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6690 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6702 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 6708 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6719 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6744 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 6838 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 6852 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6862 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6868 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6880 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 6886 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 6897 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6922 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 6998 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7003 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 7014 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7020 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7031 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7056 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7153 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7158 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 7169 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7175 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7186 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7211 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 7284 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 7298 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7308 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7314 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7326 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7332 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7343 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7368 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 7462 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7476 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7486 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7492 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7504 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7510 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7521 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7546 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 7622 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7627 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7638 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7644 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7655 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7680 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7777 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7782 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7793 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7799 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7810 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7835 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 7908 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 7922 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7932 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7938 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 7950 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 7956 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 7967 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7992 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 8086 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8100 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8110 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8116 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8128 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 8134 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8145 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8170 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 8246 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8251 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8262 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 8268 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8279 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8304 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8401 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8406 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8417 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 8423 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8434 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8459 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 8520 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 8532 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8542 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8548 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8554 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 8561 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 8570 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8595 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 8677 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8689 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8699 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8705 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8711 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 8718 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 8727 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8752 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 8814 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8819 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8824 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 8831 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 8840 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8865 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8948 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8953 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8958 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 8965 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 8974 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8999 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 9066 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 9079 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9089 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9095 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9107 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9113 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9121 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9130 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9155 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 9243 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 9256 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9266 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9272 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9284 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9290 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9298 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9307 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9332 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 9401 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 9406 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9417 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9423 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9431 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9440 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9465 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 9555 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 9560 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9571 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9577 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9585 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9594 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9619 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 9686 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 9699 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9709 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9715 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 9727 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9733 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9741 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9750 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9775 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 9863 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 9876 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9886 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9892 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 9904 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 9910 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 9918 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 9927 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9952 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 10021 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10026 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 10037 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10043 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10051 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10060 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10085 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 10175 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10180 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 10191 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10197 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10205 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10214 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10239 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 10306 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 10319 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10329 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10335 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 10347 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10353 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10361 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10370 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10395 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 10483 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 10496 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10506 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10512 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 10524 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10530 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10538 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10547 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10572 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 10641 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10646 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 10657 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10663 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10671 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10680 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10705 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 10795 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10800 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 10811 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 10817 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 10825 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10834 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10859 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 10926 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 10939 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10949 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10955 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 10961 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 10968 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 10977 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11002 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 11090 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 11103 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11113 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11119 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 11125 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11132 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11141 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11166 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 11235 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11240 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 11245 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11252 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11261 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11286 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 11376 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11381 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 359 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 11386 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11393 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11402 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11427 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 11500 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 11514 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11524 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11530 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 11542 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 11548 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11556 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11565 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11590 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 11684 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 11698 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11708 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11714 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 11726 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 11732 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11740 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11749 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11774 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 11850 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11855 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 11866 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 11872 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 11880 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 11889 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11914 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12011 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12016 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 12027 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12033 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12041 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12050 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12075 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 12148 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 12162 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12172 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12178 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 12190 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12196 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12204 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12213 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12238 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 12332 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12346 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12356 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12362 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 12374 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12380 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12388 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12397 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12422 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 12498 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12503 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 12514 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12520 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12528 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12537 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12562 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12659 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12664 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 12675 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12681 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12689 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12698 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12723 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 12796 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 12810 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12820 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12826 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 12838 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 12844 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 12852 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12861 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12886 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 12980 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12994 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 13004 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 13010 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 13022 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 13028 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 13036 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13045 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13070 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 13146 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 13151 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 13162 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 13168 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 13176 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13185 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13210 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 13307 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 13312 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 13323 "mo_frontend/parser.ml"
+              
+            in
+            
+# 360 "mo_frontend/parser.mly"
+               ( s )
+# 13329 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 13337 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 374 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13346 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 877 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13371 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 13420 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 13434 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 847 "mo_frontend/parser.mly"
+    ( VarD(x, annot_exp e t) @? at _sloc )
+# 13443 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 734 "mo_frontend/parser.mly"
+    ( e )
+# 13469 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 736 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 13498 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 734 "mo_frontend/parser.mly"
+    ( e )
+# 13524 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 736 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 13553 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 638 "mo_frontend/parser.mly"
+    ( e )
+# 13579 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 506 "mo_frontend/parser.mly"
+          ( AddOp )
+# 13619 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13627 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 507 "mo_frontend/parser.mly"
+          ( SubOp )
+# 13668 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13676 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 508 "mo_frontend/parser.mly"
+          ( MulOp )
+# 13717 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13725 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 509 "mo_frontend/parser.mly"
+          ( DivOp )
+# 13766 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13774 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 510 "mo_frontend/parser.mly"
+          ( ModOp )
+# 13815 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13823 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 511 "mo_frontend/parser.mly"
+          ( PowOp )
+# 13864 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13872 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 512 "mo_frontend/parser.mly"
+              ( WAddOp )
+# 13913 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13921 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 513 "mo_frontend/parser.mly"
+              ( WSubOp )
+# 13962 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 13970 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 514 "mo_frontend/parser.mly"
+              ( WMulOp )
+# 14011 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14019 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 515 "mo_frontend/parser.mly"
+              ( WPowOp )
+# 14060 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14068 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 516 "mo_frontend/parser.mly"
+          ( AndOp )
+# 14109 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14117 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 517 "mo_frontend/parser.mly"
+          ( OrOp )
+# 14158 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14166 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 518 "mo_frontend/parser.mly"
+          ( XorOp )
+# 14207 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14215 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 519 "mo_frontend/parser.mly"
+          ( ShLOp )
+# 14256 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14264 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 520 "mo_frontend/parser.mly"
+          ( ShROp )
+# 14305 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14313 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 521 "mo_frontend/parser.mly"
+           ( RotLOp )
+# 14354 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14362 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 522 "mo_frontend/parser.mly"
+           ( RotROp )
+# 14403 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14411 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 523 "mo_frontend/parser.mly"
+         ( CatOp )
+# 14452 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14460 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 526 "mo_frontend/parser.mly"
+          ( EqOp )
+# 14501 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14509 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 527 "mo_frontend/parser.mly"
+          ( NeqOp )
+# 14550 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14558 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 528 "mo_frontend/parser.mly"
+          ( LtOp )
+# 14599 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14607 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 529 "mo_frontend/parser.mly"
+          ( LeOp )
+# 14648 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14656 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 530 "mo_frontend/parser.mly"
+          ( GtOp )
+# 14697 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14705 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 531 "mo_frontend/parser.mly"
+          ( GeOp )
+# 14746 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 14754 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 644 "mo_frontend/parser.mly"
+    ( AndE(e1, e2) @? at _sloc )
+# 14798 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 646 "mo_frontend/parser.mly"
+    ( OrE(e1, e2) @? at _sloc )
+# 14842 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 648 "mo_frontend/parser.mly"
+    ( AnnotE(e, t) @? at _sloc )
+# 14886 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 650 "mo_frontend/parser.mly"
+    ( let x = "_" @@ e1.at in
+      BlockE [
+        LetD (VarP x @! x.at, e1, None) @? e1.at;
+        ExpD e2 @? e2.at
+      ] @? at _sloc )
+# 14934 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 36 "mo_frontend/assertions.mly"
+    ( ImpliesE(e1, e2) @? at _sloc )
+# 14978 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 638 "mo_frontend/parser.mly"
+    ( e )
+# 15004 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 506 "mo_frontend/parser.mly"
+          ( AddOp )
+# 15044 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15052 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 507 "mo_frontend/parser.mly"
+          ( SubOp )
+# 15093 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15101 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 508 "mo_frontend/parser.mly"
+          ( MulOp )
+# 15142 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15150 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 509 "mo_frontend/parser.mly"
+          ( DivOp )
+# 15191 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15199 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 510 "mo_frontend/parser.mly"
+          ( ModOp )
+# 15240 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15248 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 511 "mo_frontend/parser.mly"
+          ( PowOp )
+# 15289 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15297 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 512 "mo_frontend/parser.mly"
+              ( WAddOp )
+# 15338 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15346 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 513 "mo_frontend/parser.mly"
+              ( WSubOp )
+# 15387 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15395 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 514 "mo_frontend/parser.mly"
+              ( WMulOp )
+# 15436 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15444 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 515 "mo_frontend/parser.mly"
+              ( WPowOp )
+# 15485 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15493 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 516 "mo_frontend/parser.mly"
+          ( AndOp )
+# 15534 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15542 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 517 "mo_frontend/parser.mly"
+          ( OrOp )
+# 15583 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15591 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 518 "mo_frontend/parser.mly"
+          ( XorOp )
+# 15632 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15640 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 519 "mo_frontend/parser.mly"
+          ( ShLOp )
+# 15681 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15689 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 520 "mo_frontend/parser.mly"
+          ( ShROp )
+# 15730 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15738 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 521 "mo_frontend/parser.mly"
+           ( RotLOp )
+# 15779 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15787 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 522 "mo_frontend/parser.mly"
+           ( RotROp )
+# 15828 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15836 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 523 "mo_frontend/parser.mly"
+         ( CatOp )
+# 15877 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 640 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15885 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 526 "mo_frontend/parser.mly"
+          ( EqOp )
+# 15926 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15934 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 527 "mo_frontend/parser.mly"
+          ( NeqOp )
+# 15975 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 15983 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 528 "mo_frontend/parser.mly"
+          ( LtOp )
+# 16024 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 16032 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 529 "mo_frontend/parser.mly"
+          ( LeOp )
+# 16073 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 16081 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 530 "mo_frontend/parser.mly"
+          ( GtOp )
+# 16122 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 16130 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 531 "mo_frontend/parser.mly"
+          ( GeOp )
+# 16171 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 642 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 16179 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 644 "mo_frontend/parser.mly"
+    ( AndE(e1, e2) @? at _sloc )
+# 16223 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 646 "mo_frontend/parser.mly"
+    ( OrE(e1, e2) @? at _sloc )
+# 16267 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 648 "mo_frontend/parser.mly"
+    ( AnnotE(e, t) @? at _sloc )
+# 16311 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 650 "mo_frontend/parser.mly"
+    ( let x = "_" @@ e1.at in
+      BlockE [
+        LetD (VarP x @! x.at, e1, None) @? e1.at;
+        ExpD e2 @? e2.at
+      ] @? at _sloc )
+# 16359 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 36 "mo_frontend/assertions.mly"
+    ( ImpliesE(e1, e2) @? at _sloc )
+# 16403 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 16432 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 16445 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 16452 "mo_frontend/parser.ml"
+           in
+          let (_endpos_m_, _startpos_m_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 757 "mo_frontend/parser.mly"
+    ( let e = VarE(x.it @@ x.at) @? x.at in
+      { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 16465 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 16500 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 16514 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 16525 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_m_, _startpos_m_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 757 "mo_frontend/parser.mly"
+    ( let e = VarE(x.it @@ x.at) @? x.at in
+      { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 16539 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 16582 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 16595 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 16602 "mo_frontend/parser.ml"
+           in
+          let (_endpos_m_, _startpos_m_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 760 "mo_frontend/parser.mly"
+    ( { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 16614 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 16663 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 16677 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 16688 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_m_, _startpos_m_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 760 "mo_frontend/parser.mly"
+    ( { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 16701 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 741 "mo_frontend/parser.mly"
+    ( e )
+# 16727 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 741 "mo_frontend/parser.mly"
+    ( e )
+# 16752 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 659 "mo_frontend/parser.mly"
+    ( e )
+# 16777 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 661 "mo_frontend/parser.mly"
+    ( AssignE(e1, e2) @? at _sloc)
+# 16820 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 539 "mo_frontend/parser.mly"
+               ( AddOp )
+# 16861 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 16869 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 540 "mo_frontend/parser.mly"
+                ( SubOp )
+# 16910 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 16918 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 541 "mo_frontend/parser.mly"
+              ( MulOp )
+# 16959 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 16967 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 542 "mo_frontend/parser.mly"
+              ( DivOp )
+# 17008 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17016 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 543 "mo_frontend/parser.mly"
+              ( ModOp )
+# 17057 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17065 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 544 "mo_frontend/parser.mly"
+              ( PowOp )
+# 17106 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17114 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 545 "mo_frontend/parser.mly"
+                  ( WAddOp )
+# 17155 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17163 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 546 "mo_frontend/parser.mly"
+                  ( WSubOp )
+# 17204 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17212 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 547 "mo_frontend/parser.mly"
+                  ( WMulOp )
+# 17253 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17261 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 548 "mo_frontend/parser.mly"
+                  ( WPowOp )
+# 17302 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17310 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 549 "mo_frontend/parser.mly"
+              ( AndOp )
+# 17351 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17359 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 550 "mo_frontend/parser.mly"
+             ( OrOp )
+# 17400 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17408 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 551 "mo_frontend/parser.mly"
+              ( XorOp )
+# 17449 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17457 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 552 "mo_frontend/parser.mly"
+              ( ShLOp )
+# 17498 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17506 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 553 "mo_frontend/parser.mly"
+              ( ShROp )
+# 17547 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17555 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 554 "mo_frontend/parser.mly"
+               ( RotLOp )
+# 17596 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17604 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 555 "mo_frontend/parser.mly"
+               ( RotROp )
+# 17645 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17653 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 556 "mo_frontend/parser.mly"
+              ( CatOp )
+# 17694 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 17702 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 665 "mo_frontend/parser.mly"
+    ( RetE(TupE([]) @? at _sloc) @? at _sloc )
+# 17732 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 667 "mo_frontend/parser.mly"
+    ( RetE(e) @? at _sloc )
+# 17769 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 669 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 17806 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 671 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Cmp, scope_bind (anon_id "async*" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 17843 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 673 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Fut, e) @? at _sloc )
+# 17880 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 675 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Cmp, e) @? at _sloc )
+# 17917 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 677 "mo_frontend/parser.mly"
+    ( AssertE(Runtime, e) @? at _sloc )
+# 17954 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = rt;
+            MenhirLib.EngineTypes.startp = _startpos_rt_;
+            MenhirLib.EngineTypes.endp = _endpos_rt_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let rt : (Mo_def.Syntax.typ option) = Obj.magic rt in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 17996 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 18010 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 679 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      let unit () = TupT [] @! at _sloc in
+      let e' =
+        match e.it with
+        | WhileE (e1, e2) -> WhileE (e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | LoopE (e1, eo) -> LoopE (LabelE (x', unit (), e1) @? e1.at, eo) @? e.at
+        | ForE (p, e1, e2) -> ForE (p, e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | _ -> e
+      in
+      LabelE(x, Lib.Option.get rt (unit ()), e') @? at _sloc )
+# 18028 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = eo;
+          MenhirLib.EngineTypes.startp = _startpos_eo_;
+          MenhirLib.EngineTypes.endp = _endpos_eo_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let eo : (Mo_def.Syntax.exp option) = Obj.magic eo in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 18063 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_eo_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 18077 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_eo_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 690 "mo_frontend/parser.mly"
+    ( let e = Lib.Option.get eo (TupE([]) @? at _sloc) in
+      BreakE(x, e) @? at _sloc )
+# 18087 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 18115 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 18129 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 693 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      BreakE(x', TupE([]) @? no_region) @? at _sloc )
+# 18140 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 696 "mo_frontend/parser.mly"
+    ( DebugE(e) @? at _sloc )
+# 18177 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e1;
+          MenhirLib.EngineTypes.startp = _startpos_e1_;
+          MenhirLib.EngineTypes.endp = _endpos_e1_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = b;
+            MenhirLib.EngineTypes.startp = _startpos_b_;
+            MenhirLib.EngineTypes.endp = _endpos_b_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e1_ in
+        let _v =
+          let _endpos = _endpos_e1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 698 "mo_frontend/parser.mly"
+    ( IfE(b, e1, TupE([]) @? at _sloc) @? at _sloc )
+# 18221 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = b;
+                MenhirLib.EngineTypes.startp = _startpos_b_;
+                MenhirLib.EngineTypes.endp = _endpos_b_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 700 "mo_frontend/parser.mly"
+    ( IfE(b, e1, e2) @? at _sloc )
+# 18279 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let c : (Mo_def.Syntax.case) = Obj.magic c in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v =
+          let _endpos = _endpos_c_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 702 "mo_frontend/parser.mly"
+    ( TryE(e1, [c]) @? at _sloc )
+# 18323 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 708 "mo_frontend/parser.mly"
+    ( ThrowE(e) @? at _sloc )
+# 18360 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = cs;
+            MenhirLib.EngineTypes.startp = _startpos_cs_;
+            MenhirLib.EngineTypes.endp = _endpos_cs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e;
+                MenhirLib.EngineTypes.startp = _startpos_e_;
+                MenhirLib.EngineTypes.endp = _endpos_e_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let cs : (Mo_def.Syntax.case list) = Obj.magic cs in
+        let _3 : unit = Obj.magic _3 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 710 "mo_frontend/parser.mly"
+    ( SwitchE(e, cs) @? at _sloc )
+# 18418 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 712 "mo_frontend/parser.mly"
+    ( WhileE(e1, e2) @? at _sloc )
+# 18462 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 714 "mo_frontend/parser.mly"
+    ( LoopE(e, None) @? at _sloc )
+# 18499 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _3 : unit = Obj.magic _3 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 716 "mo_frontend/parser.mly"
+    ( LoopE(e1, Some e2) @? at _sloc )
+# 18550 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _6;
+            MenhirLib.EngineTypes.startp = _startpos__6_;
+            MenhirLib.EngineTypes.endp = _endpos__6_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _6 : unit = Obj.magic _6 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _4 : unit = Obj.magic _4 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 718 "mo_frontend/parser.mly"
+    ( ForE(p, e1, e2) @? at _sloc )
+# 18622 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 720 "mo_frontend/parser.mly"
+    ( IgnoreE(e) @? at _sloc )
+# 18659 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 722 "mo_frontend/parser.mly"
+    ( e )
+# 18692 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 724 "mo_frontend/parser.mly"
+    ( DoOptE(e) @? at _sloc )
+# 18735 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 40 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Static, e) @? at _sloc )
+# 18786 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 42 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Invariant, e) @? at _sloc )
+# 18837 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 44 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Precondition, e) @? at _sloc )
+# 18888 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 46 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Postcondition, e) @? at _sloc )
+# 18939 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = s;
+                MenhirLib.EngineTypes.startp = _startpos_s_;
+                MenhirLib.EngineTypes.endp = _endpos_s_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _5 : unit = Obj.magic _5 in
+        let _4 : unit = Obj.magic _4 in
+        let s : (
+# 230 "mo_frontend/parser.mly"
+      (string)
+# 18994 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 48 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Concurrency s, e) @? at _sloc )
+# 19008 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 50 "mo_frontend/assertions.mly"
+    ( is_verification () &&& OldE e @? at _sloc )
+# 19045 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 659 "mo_frontend/parser.mly"
+    ( e )
+# 19071 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 661 "mo_frontend/parser.mly"
+    ( AssignE(e1, e2) @? at _sloc)
+# 19114 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 539 "mo_frontend/parser.mly"
+               ( AddOp )
+# 19155 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19163 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 540 "mo_frontend/parser.mly"
+                ( SubOp )
+# 19204 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19212 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 541 "mo_frontend/parser.mly"
+              ( MulOp )
+# 19253 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19261 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 542 "mo_frontend/parser.mly"
+              ( DivOp )
+# 19302 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19310 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 543 "mo_frontend/parser.mly"
+              ( ModOp )
+# 19351 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19359 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 544 "mo_frontend/parser.mly"
+              ( PowOp )
+# 19400 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19408 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 545 "mo_frontend/parser.mly"
+                  ( WAddOp )
+# 19449 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19457 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 546 "mo_frontend/parser.mly"
+                  ( WSubOp )
+# 19498 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19506 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 547 "mo_frontend/parser.mly"
+                  ( WMulOp )
+# 19547 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19555 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 548 "mo_frontend/parser.mly"
+                  ( WPowOp )
+# 19596 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19604 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 549 "mo_frontend/parser.mly"
+              ( AndOp )
+# 19645 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19653 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 550 "mo_frontend/parser.mly"
+             ( OrOp )
+# 19694 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19702 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 551 "mo_frontend/parser.mly"
+              ( XorOp )
+# 19743 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19751 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 552 "mo_frontend/parser.mly"
+              ( ShLOp )
+# 19792 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19800 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 553 "mo_frontend/parser.mly"
+              ( ShROp )
+# 19841 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19849 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 554 "mo_frontend/parser.mly"
+               ( RotLOp )
+# 19890 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19898 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 555 "mo_frontend/parser.mly"
+               ( RotROp )
+# 19939 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19947 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 556 "mo_frontend/parser.mly"
+              ( CatOp )
+# 19988 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 663 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 19996 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 665 "mo_frontend/parser.mly"
+    ( RetE(TupE([]) @? at _sloc) @? at _sloc )
+# 20026 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 667 "mo_frontend/parser.mly"
+    ( RetE(e) @? at _sloc )
+# 20063 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 669 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 20100 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 671 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Cmp, scope_bind (anon_id "async*" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 20137 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 673 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Fut, e) @? at _sloc )
+# 20174 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 675 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Cmp, e) @? at _sloc )
+# 20211 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 677 "mo_frontend/parser.mly"
+    ( AssertE(Runtime, e) @? at _sloc )
+# 20248 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = rt;
+            MenhirLib.EngineTypes.startp = _startpos_rt_;
+            MenhirLib.EngineTypes.endp = _endpos_rt_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let rt : (Mo_def.Syntax.typ option) = Obj.magic rt in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 20290 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 20304 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 679 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      let unit () = TupT [] @! at _sloc in
+      let e' =
+        match e.it with
+        | WhileE (e1, e2) -> WhileE (e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | LoopE (e1, eo) -> LoopE (LabelE (x', unit (), e1) @? e1.at, eo) @? e.at
+        | ForE (p, e1, e2) -> ForE (p, e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | _ -> e
+      in
+      LabelE(x, Lib.Option.get rt (unit ()), e') @? at _sloc )
+# 20322 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = eo;
+          MenhirLib.EngineTypes.startp = _startpos_eo_;
+          MenhirLib.EngineTypes.endp = _endpos_eo_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let eo : (Mo_def.Syntax.exp option) = Obj.magic eo in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 20357 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_eo_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 20371 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_eo_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 690 "mo_frontend/parser.mly"
+    ( let e = Lib.Option.get eo (TupE([]) @? at _sloc) in
+      BreakE(x, e) @? at _sloc )
+# 20381 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 20409 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 20423 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 693 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      BreakE(x', TupE([]) @? no_region) @? at _sloc )
+# 20434 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 696 "mo_frontend/parser.mly"
+    ( DebugE(e) @? at _sloc )
+# 20471 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e1;
+          MenhirLib.EngineTypes.startp = _startpos_e1_;
+          MenhirLib.EngineTypes.endp = _endpos_e1_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = b;
+            MenhirLib.EngineTypes.startp = _startpos_b_;
+            MenhirLib.EngineTypes.endp = _endpos_b_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e1_ in
+        let _v =
+          let _endpos = _endpos_e1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 698 "mo_frontend/parser.mly"
+    ( IfE(b, e1, TupE([]) @? at _sloc) @? at _sloc )
+# 20515 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = b;
+                MenhirLib.EngineTypes.startp = _startpos_b_;
+                MenhirLib.EngineTypes.endp = _endpos_b_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 700 "mo_frontend/parser.mly"
+    ( IfE(b, e1, e2) @? at _sloc )
+# 20573 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let c : (Mo_def.Syntax.case) = Obj.magic c in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v =
+          let _endpos = _endpos_c_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 702 "mo_frontend/parser.mly"
+    ( TryE(e1, [c]) @? at _sloc )
+# 20617 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 708 "mo_frontend/parser.mly"
+    ( ThrowE(e) @? at _sloc )
+# 20654 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = cs;
+            MenhirLib.EngineTypes.startp = _startpos_cs_;
+            MenhirLib.EngineTypes.endp = _endpos_cs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e;
+                MenhirLib.EngineTypes.startp = _startpos_e_;
+                MenhirLib.EngineTypes.endp = _endpos_e_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let cs : (Mo_def.Syntax.case list) = Obj.magic cs in
+        let _3 : unit = Obj.magic _3 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 710 "mo_frontend/parser.mly"
+    ( SwitchE(e, cs) @? at _sloc )
+# 20712 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 712 "mo_frontend/parser.mly"
+    ( WhileE(e1, e2) @? at _sloc )
+# 20756 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 714 "mo_frontend/parser.mly"
+    ( LoopE(e, None) @? at _sloc )
+# 20793 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _3 : unit = Obj.magic _3 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 716 "mo_frontend/parser.mly"
+    ( LoopE(e1, Some e2) @? at _sloc )
+# 20844 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _6;
+            MenhirLib.EngineTypes.startp = _startpos__6_;
+            MenhirLib.EngineTypes.endp = _endpos__6_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _6 : unit = Obj.magic _6 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _4 : unit = Obj.magic _4 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 718 "mo_frontend/parser.mly"
+    ( ForE(p, e1, e2) @? at _sloc )
+# 20916 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 720 "mo_frontend/parser.mly"
+    ( IgnoreE(e) @? at _sloc )
+# 20953 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 722 "mo_frontend/parser.mly"
+    ( e )
+# 20986 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 724 "mo_frontend/parser.mly"
+    ( DoOptE(e) @? at _sloc )
+# 21029 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 40 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Static, e) @? at _sloc )
+# 21080 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 42 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Invariant, e) @? at _sloc )
+# 21131 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 44 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Precondition, e) @? at _sloc )
+# 21182 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 46 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Postcondition, e) @? at _sloc )
+# 21233 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = s;
+                MenhirLib.EngineTypes.startp = _startpos_s_;
+                MenhirLib.EngineTypes.endp = _endpos_s_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _5 : unit = Obj.magic _5 in
+        let _4 : unit = Obj.magic _4 in
+        let s : (
+# 230 "mo_frontend/parser.mly"
+      (string)
+# 21288 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 48 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Concurrency s, e) @? at _sloc )
+# 21302 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 50 "mo_frontend/assertions.mly"
+    ( is_verification () &&& OldE e @? at _sloc )
+# 21339 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 728 "mo_frontend/parser.mly"
+    ( e )
+# 21365 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 730 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 21394 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 728 "mo_frontend/parser.mly"
+    ( e )
+# 21420 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 730 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 21449 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 579 "mo_frontend/parser.mly"
+    ( e )
+# 21475 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 579 "mo_frontend/parser.mly"
+    ( e )
+# 21500 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 21521 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 21534 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 581 "mo_frontend/parser.mly"
+    ( VarE(x) @? at _sloc )
+# 21544 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 21572 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 583 "mo_frontend/parser.mly"
+    ( PrimE(s) @? at _sloc )
+# 21585 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 585 "mo_frontend/parser.mly"
+    ( VarE ("_" @@ at _sloc) @? at _sloc )
+# 21615 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 579 "mo_frontend/parser.mly"
+    ( e )
+# 21641 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 579 "mo_frontend/parser.mly"
+    ( e )
+# 21666 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 21687 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 21700 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 581 "mo_frontend/parser.mly"
+    ( VarE(x) @? at _sloc )
+# 21710 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 21738 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 583 "mo_frontend/parser.mly"
+    ( PrimE(s) @? at _sloc )
+# 21751 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 585 "mo_frontend/parser.mly"
+    ( VarE ("_" @@ at _sloc) @? at _sloc )
+# 21781 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = efs;
+            MenhirLib.EngineTypes.startp = _startpos_efs_;
+            MenhirLib.EngineTypes.endp = _endpos_efs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let efs : (Mo_def.Syntax.exp_field list) = Obj.magic efs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 564 "mo_frontend/parser.mly"
+    ( ObjE ([], efs) @? at _sloc )
+# 21825 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = bases;
+            MenhirLib.EngineTypes.startp = _startpos_bases_;
+            MenhirLib.EngineTypes.endp = _endpos_bases_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = base;
+                MenhirLib.EngineTypes.startp = _startpos_base_;
+                MenhirLib.EngineTypes.endp = _endpos_base_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let bases : (Mo_def.Syntax.exp list) = Obj.magic bases in
+        let _3 : unit = Obj.magic _3 in
+        let base : (Mo_def.Syntax.exp) = Obj.magic base in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 566 "mo_frontend/parser.mly"
+    ( ObjE (base :: bases, []) @? at _sloc )
+# 21883 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = efs;
+            MenhirLib.EngineTypes.startp = _startpos_efs_;
+            MenhirLib.EngineTypes.endp = _endpos_efs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = bases;
+                MenhirLib.EngineTypes.startp = _startpos_bases_;
+                MenhirLib.EngineTypes.endp = _endpos_bases_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let efs : (Mo_def.Syntax.exp_field list) = Obj.magic efs in
+        let _3 : unit = Obj.magic _3 in
+        let bases : (Mo_def.Syntax.exp list) = Obj.magic bases in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 568 "mo_frontend/parser.mly"
+    ( ObjE (bases, efs) @? at _sloc )
+# 21941 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_l_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_l_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 572 "mo_frontend/parser.mly"
+    ( LitE(ref l) @? at _sloc )
+# 21971 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 574 "mo_frontend/parser.mly"
+    ( match es with [e] -> e | _ -> TupE(es) @? at _sloc )
+# 22015 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 589 "mo_frontend/parser.mly"
+    ( e )
+# 22041 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 22081 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 591 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 22089 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 22142 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 591 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 22151 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e2;
+            MenhirLib.EngineTypes.startp = _startpos_e2_;
+            MenhirLib.EngineTypes.endp = _endpos_e2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 593 "mo_frontend/parser.mly"
+    ( IdxE(e1, e2) @? at _sloc )
+# 22202 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 229 "mo_frontend/parser.mly"
+      (string)
+# 22230 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 595 "mo_frontend/parser.mly"
+    ( ProjE (e, int_of_string s) @? at _sloc )
+# 22243 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 22277 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 22292 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 597 "mo_frontend/parser.mly"
+    ( DotE(e, x) @? at _sloc )
+# 22302 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = inst;
+            MenhirLib.EngineTypes.startp = _startpos_inst_;
+            MenhirLib.EngineTypes.endp = _endpos_inst_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let inst : (Mo_def.Syntax.inst) = Obj.magic inst in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 599 "mo_frontend/parser.mly"
+    ( CallE(e1, inst, e2) @? at _sloc )
+# 22346 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let _endpos = _endpos__2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 601 "mo_frontend/parser.mly"
+    ( BangE(e1) @? at _sloc )
+# 22383 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 22436 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 22453 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 603 "mo_frontend/parser.mly"
+    ( DotE(
+        DotE(e1, "system" @@ at (_startpos__1_,_endpos__1_)) @? at _sloc,
+        x) @? at _sloc )
+# 22464 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 589 "mo_frontend/parser.mly"
+    ( e )
+# 22490 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 22530 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 591 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 22538 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 22591 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 591 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 22600 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e2;
+            MenhirLib.EngineTypes.startp = _startpos_e2_;
+            MenhirLib.EngineTypes.endp = _endpos_e2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 593 "mo_frontend/parser.mly"
+    ( IdxE(e1, e2) @? at _sloc )
+# 22651 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 229 "mo_frontend/parser.mly"
+      (string)
+# 22679 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 595 "mo_frontend/parser.mly"
+    ( ProjE (e, int_of_string s) @? at _sloc )
+# 22692 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 22726 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 22741 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 597 "mo_frontend/parser.mly"
+    ( DotE(e, x) @? at _sloc )
+# 22751 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = inst;
+            MenhirLib.EngineTypes.startp = _startpos_inst_;
+            MenhirLib.EngineTypes.endp = _endpos_inst_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let inst : (Mo_def.Syntax.inst) = Obj.magic inst in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 599 "mo_frontend/parser.mly"
+    ( CallE(e1, inst, e2) @? at _sloc )
+# 22795 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let _endpos = _endpos__2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 601 "mo_frontend/parser.mly"
+    ( BangE(e1) @? at _sloc )
+# 22832 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 22885 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 22902 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 603 "mo_frontend/parser.mly"
+    ( DotE(
+        DotE(e1, "system" @@ at (_startpos__1_,_endpos__1_)) @? at _sloc,
+        x) @? at _sloc )
+# 22913 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 609 "mo_frontend/parser.mly"
+    ( e )
+# 22939 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 22966 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 22980 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 611 "mo_frontend/parser.mly"
+    ( TagE (x, TupE([]) @? at _sloc) @? at _sloc )
+# 22990 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 23025 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23039 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 613 "mo_frontend/parser.mly"
+    ( TagE (x, e) @? at _sloc )
+# 23048 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 615 "mo_frontend/parser.mly"
+    ( OptE(e) @? at _sloc )
+# 23085 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 501 "mo_frontend/parser.mly"
+          ( PosOp )
+# 23119 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23133 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 502 "mo_frontend/parser.mly"
+          ( NegOp )
+# 23167 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23181 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 503 "mo_frontend/parser.mly"
+          ( NotOp )
+# 23215 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23229 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 534 "mo_frontend/parser.mly"
+               ( PosOp )
+# 23263 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 23272 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 535 "mo_frontend/parser.mly"
+                ( NegOp )
+# 23306 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 23315 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 536 "mo_frontend/parser.mly"
+              ( NotOp )
+# 23349 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 23358 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( ActorUrlE e @? at _sloc )
+# 23395 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 628 "mo_frontend/parser.mly"
+    ( NotE e @? at _sloc )
+# 23432 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 630 "mo_frontend/parser.mly"
+    ( ShowE (ref Type.Pre, e) @? at _sloc )
+# 23469 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 632 "mo_frontend/parser.mly"
+    ( ToCandidE es @? at _sloc )
+# 23520 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 634 "mo_frontend/parser.mly"
+    ( FromCandidE e @? at _sloc )
+# 23557 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 609 "mo_frontend/parser.mly"
+    ( e )
+# 23583 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 23610 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23624 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 611 "mo_frontend/parser.mly"
+    ( TagE (x, TupE([]) @? at _sloc) @? at _sloc )
+# 23634 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 23669 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23683 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 613 "mo_frontend/parser.mly"
+    ( TagE (x, e) @? at _sloc )
+# 23692 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 615 "mo_frontend/parser.mly"
+    ( OptE(e) @? at _sloc )
+# 23729 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 501 "mo_frontend/parser.mly"
+          ( PosOp )
+# 23763 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23777 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 502 "mo_frontend/parser.mly"
+          ( NegOp )
+# 23811 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23825 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 503 "mo_frontend/parser.mly"
+          ( NotOp )
+# 23859 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 617 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 23873 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 534 "mo_frontend/parser.mly"
+               ( PosOp )
+# 23907 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 23916 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 535 "mo_frontend/parser.mly"
+                ( NegOp )
+# 23950 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 23959 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 536 "mo_frontend/parser.mly"
+              ( NotOp )
+# 23993 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 24002 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( ActorUrlE e @? at _sloc )
+# 24039 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 628 "mo_frontend/parser.mly"
+    ( NotE e @? at _sloc )
+# 24076 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 630 "mo_frontend/parser.mly"
+    ( ShowE (ref Type.Pre, e) @? at _sloc )
+# 24113 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 632 "mo_frontend/parser.mly"
+    ( ToCandidE es @? at _sloc )
+# 24164 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 634 "mo_frontend/parser.mly"
+    ( FromCandidE e @? at _sloc )
+# 24201 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (bool * Mo_def.Syntax.exp) = 
+# 900 "mo_frontend/parser.mly"
+                 ( (false, e) )
+# 24234 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (bool * Mo_def.Syntax.exp) = 
+# 901 "mo_frontend/parser.mly"
+            ( (true, e) )
+# 24259 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = f;
+          MenhirLib.EngineTypes.startp = _startpos_f_;
+          MenhirLib.EngineTypes.endp = _endpos_f_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let f : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 24298 "mo_frontend/parser.ml"
+        ) = Obj.magic f in
+        let _3 : (unit option) = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_f_ in
+        let _v =
+          let _endpos = _endpos_f_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 915 "mo_frontend/parser.mly"
+    ( LetD(p, ImportE(f, ref Unresolved) @? at _sloc, None) @? at _sloc )
+# 24313 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = is;
+          MenhirLib.EngineTypes.startp = _startpos_is_;
+          MenhirLib.EngineTypes.endp = _endpos_is_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_is_ in
+        let _endpos = _endpos_is_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 938 "mo_frontend/parser.mly"
+                               ( raise (Imports is) )
+# 24339 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.inst) = 
+# 456 "mo_frontend/parser.mly"
+    ( { it = None; at = no_region; note = [] } )
+# 24357 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 458 "mo_frontend/parser.mly"
+    ( { it = Some ts; at = at _sloc; note = [] } )
+# 24400 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.inst))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 493 "mo_frontend/parser.mly"
+         ( NullLit )
+# 24426 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = b;
+          MenhirLib.EngineTypes.startp = _startpos_b_;
+          MenhirLib.EngineTypes.endp = _endpos_b_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let b : (
+# 233 "mo_frontend/parser.mly"
+      (bool)
+# 24447 "mo_frontend/parser.ml"
+        ) = Obj.magic b in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_b_ in
+        let _endpos = _endpos_b_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 494 "mo_frontend/parser.mly"
+           ( BoolLit b )
+# 24455 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let s : (
+# 230 "mo_frontend/parser.mly"
+      (string)
+# 24476 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_s_ in
+        let _endpos = _endpos_s_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 495 "mo_frontend/parser.mly"
+          ( PreLit (s, Type.Nat) )
+# 24484 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let s : (
+# 231 "mo_frontend/parser.mly"
+      (string)
+# 24505 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_s_ in
+        let _endpos = _endpos_s_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 496 "mo_frontend/parser.mly"
+            ( PreLit (s, Type.Float) )
+# 24513 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let c : (
+# 232 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 24534 "mo_frontend/parser.ml"
+        ) = Obj.magic c in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_c_ in
+        let _endpos = _endpos_c_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 497 "mo_frontend/parser.mly"
+           ( CharLit c )
+# 24542 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 24563 "mo_frontend/parser.ml"
+        ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 498 "mo_frontend/parser.mly"
+           ( PreLit (t, Type.Text) )
+# 24571 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 560 "mo_frontend/parser.mly"
+                       ( e )
+# 24596 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = dfs;
+            MenhirLib.EngineTypes.startp = _startpos_dfs_;
+            MenhirLib.EngineTypes.endp = _endpos_dfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 904 "mo_frontend/parser.mly"
+                                                    ( dfs )
+# 24635 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (unit option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 24653 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : unit = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (unit option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 24678 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 24696 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 24721 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_types.Type.shared_sort option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 24739 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let x = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 24765 "mo_frontend/parser.ml"
+           in
+          (
+# 113 "<standard.mly>"
+    ( Some x )
+# 24770 "mo_frontend/parser.ml"
+           : (Mo_types.Type.shared_sort option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let x = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 24804 "mo_frontend/parser.ml"
+           in
+          (
+# 113 "<standard.mly>"
+    ( Some x )
+# 24809 "mo_frontend/parser.ml"
+           : (Mo_types.Type.shared_sort option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ list option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 24828 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ list) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ list option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 24853 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : (Mo_def.Syntax.dec list) = Obj.magic _2 in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (unit) = 
+# 941 "mo_frontend/parser.mly"
+                          ()
+# 24892 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = is;
+              MenhirLib.EngineTypes.startp = _startpos_is_;
+              MenhirLib.EngineTypes.endp = _endpos_is_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = if _startpos_is_ != _endpos_is_ then
+            _startpos_is_
+          else
+            if _startpos_ds_ != _endpos_ds_ then
+              _startpos_ds_
+            else
+              _startpos__4_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 922 "mo_frontend/parser.mly"
+    (
+      let trivia = !triv_table in
+      fun filename -> { it = is @ ds; at = at _sloc; note = { filename; trivia }} )
+# 24950 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.prog))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = is;
+              MenhirLib.EngineTypes.startp = _startpos_is_;
+              MenhirLib.EngineTypes.endp = _endpos_is_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = if _startpos_is_ != _endpos_is_ then
+            _startpos_is_
+          else
+            if _startpos_ds_ != _endpos_ds_ then
+              _startpos_ds_
+            else
+              _startpos__4_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 928 "mo_frontend/parser.mly"
+    (
+      let trivia = !triv_table in
+      fun filename -> {
+        it = is @ ds;
+        at = at _sloc;
+        note = { filename; trivia }
+      }
+    )
+# 25014 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.prog))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = sfs;
+            MenhirLib.EngineTypes.startp = _startpos_sfs_;
+            MenhirLib.EngineTypes.endp = _endpos_sfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ds;
+                  MenhirLib.EngineTypes.startp = _startpos_ds_;
+                  MenhirLib.EngineTypes.endp = _endpos_ds_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let sfs : (Mo_def.Syntax.typ_field list) = Obj.magic sfs in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = if _startpos_ds_ != _endpos_ds_ then
+            _startpos_ds_
+          else
+            _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 953 "mo_frontend/parser.mly"
+    ( let trivia = !triv_table in
+      fun filename -> { it = (ds, sfs); at = at _sloc; note = { filename; trivia }}
+    )
+# 25084 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.stab_sig))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 827 "mo_frontend/parser.mly"
+    ( p )
+# 25110 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 819 "mo_frontend/parser.mly"
+    ( p )
+# 25135 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p2;
+          MenhirLib.EngineTypes.startp = _startpos_p2_;
+          MenhirLib.EngineTypes.endp = _endpos_p2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p1;
+              MenhirLib.EngineTypes.startp = _startpos_p1_;
+              MenhirLib.EngineTypes.endp = _endpos_p1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let p2 : (Mo_def.Syntax.pat) = Obj.magic p2 in
+        let _2 : unit = Obj.magic _2 in
+        let p1 : (Mo_def.Syntax.pat) = Obj.magic p1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p1_ in
+        let _endpos = _endpos_p2_ in
+        let _v =
+          let _endpos = _endpos_p2_ in
+          let _symbolstartpos = _startpos_p1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 821 "mo_frontend/parser.mly"
+    ( AltP(p1, p2) @! at _sloc )
+# 25178 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 823 "mo_frontend/parser.mly"
+    ( AnnotP(p, t) @! at _sloc )
+# 25222 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25251 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25264 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 831 "mo_frontend/parser.mly"
+    ( {id = x; pat = annot_pat (VarP x @! x.at) t} @@ at _sloc )
+# 25274 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25317 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25330 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 833 "mo_frontend/parser.mly"
+    ( {id = x; pat = annot_pat p t} @@ at _sloc )
+# 25340 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 796 "mo_frontend/parser.mly"
+    ( p )
+# 25366 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = fps;
+            MenhirLib.EngineTypes.startp = _startpos_fps_;
+            MenhirLib.EngineTypes.endp = _endpos_fps_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let fps : (Mo_def.Syntax.pat_field list) = Obj.magic fps in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 798 "mo_frontend/parser.mly"
+    ( ObjP(fps) @! at _sloc )
+# 25409 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Source.region -> Mo_def.Syntax.pat) = 
+# 837 "mo_frontend/parser.mly"
+    ( fun sloc -> p )
+# 25435 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Source.region -> Mo_def.Syntax.pat) = 
+# 839 "mo_frontend/parser.mly"
+    ( fun sloc -> WildP @! sloc )
+# 25453 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 786 "mo_frontend/parser.mly"
+    ( WildP @! at _sloc )
+# 25482 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25504 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25517 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 788 "mo_frontend/parser.mly"
+    ( VarP(x) @! at _sloc )
+# 25527 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_l_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_l_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 790 "mo_frontend/parser.mly"
+    ( LitP(ref l) @! at _sloc )
+# 25557 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ps;
+            MenhirLib.EngineTypes.startp = _startpos_ps_;
+            MenhirLib.EngineTypes.endp = _endpos_ps_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ps : (Mo_def.Syntax.pat list) = Obj.magic ps in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 792 "mo_frontend/parser.mly"
+    ( (match ps with [p] -> ParP(p) | _ -> TupP(ps)) @! at _sloc )
+# 25601 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 802 "mo_frontend/parser.mly"
+    ( p )
+# 25627 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25654 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25668 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 804 "mo_frontend/parser.mly"
+    ( TagP(x, TupP [] @! at _sloc) @! at _sloc )
+# 25678 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25713 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25727 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 806 "mo_frontend/parser.mly"
+    ( TagP(x, p) @! at _sloc )
+# 25736 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 808 "mo_frontend/parser.mly"
+    ( OptP(p) @! at _sloc )
+# 25773 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 501 "mo_frontend/parser.mly"
+          ( PosOp )
+# 25807 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 810 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 25821 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 502 "mo_frontend/parser.mly"
+          ( NegOp )
+# 25855 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 810 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 25869 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 503 "mo_frontend/parser.mly"
+          ( NotOp )
+# 25903 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 810 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 25917 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25939 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25952 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 381 "mo_frontend/parser.mly"
+    ( IdH x @! at _sloc )
+# 25962 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.path))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25996 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let p : (Mo_def.Syntax.path) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 26011 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 383 "mo_frontend/parser.mly"
+    ( DotH (p, x) @! at _sloc )
+# 26021 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.path))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 238 "<standard.mly>"
+    ( [ x ] )
+# 26047 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 240 "<standard.mly>"
+    ( x :: xs )
+# 26086 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.case list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26104 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.case list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26129 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.case list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26169 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26174 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.case list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26215 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26220 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26239 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26264 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26303 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26321 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26346 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26386 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26391 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26432 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26437 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26456 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26481 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26521 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26526 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26567 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26572 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26591 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26616 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26655 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26673 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26698 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26738 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26743 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 26784 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26789 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26808 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26833 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26872 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26890 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26915 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 26954 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 26972 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 26997 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27037 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27042 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27083 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27088 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27107 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.pat) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27132 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.pat) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27171 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.pat_field list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27189 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.pat_field list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27214 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27254 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27259 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27300 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27305 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27324 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27349 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27389 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27394 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27435 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27440 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27459 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27484 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27523 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27541 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_bind) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27566 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_bind list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ_bind) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27605 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27623 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27648 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27688 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27693 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27734 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27739 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27758 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27783 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27823 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27828 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 27869 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27874 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27893 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_item) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 27918 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_item list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ_item) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 27957 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 320 "mo_frontend/parser.mly"
+                ( [] )
+# 27975 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 321 "mo_frontend/parser.mly"
+        ( [x] )
+# 28000 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28040 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28045 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28086 "mo_frontend/parser.ml"
+           in
+          (
+# 322 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28091 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 28117 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28157 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28162 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28203 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28208 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 28234 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28274 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28279 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 333 "mo_frontend/parser.mly"
+                  ( () )
+# 28320 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 28325 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.stab option) = 
+# 777 "mo_frontend/parser.mly"
+                ( None )
+# 28344 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 778 "mo_frontend/parser.mly"
+             ( Some (Flexible @@ at _sloc) )
+# 28373 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.stab option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 779 "mo_frontend/parser.mly"
+           ( Some (Stable @@ at _sloc) )
+# 28403 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.stab option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28445 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28459 "mo_frontend/parser.ml"
+            
+          in
+          let mut = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 28465 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 949 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 28473 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _1_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28521 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28536 "mo_frontend/parser.ml"
+            
+          in
+          let mut =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 28547 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 949 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 28556 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (unit) = 
+# 918 "mo_frontend/parser.mly"
+                ( () )
+# 28575 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 441 "mo_frontend/parser.mly"
+    ( t )
+# 28600 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _2 : unit = Obj.magic _2 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 443 "mo_frontend/parser.mly"
+    ( AndT(t1, t2) @! at _sloc )
+# 28643 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _2 : unit = Obj.magic _2 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 445 "mo_frontend/parser.mly"
+    ( OrT(t1, t2) @! at _sloc )
+# 28687 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 452 "mo_frontend/parser.mly"
+                                 ( ts )
+# 28727 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28762 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28775 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 481 "mo_frontend/parser.mly"
+    ( {var = x; sort = Type.Type @@ no_region; bound = t} @= at _sloc )
+# 28785 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_bind))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28807 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28820 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 483 "mo_frontend/parser.mly"
+    ( {var = x; sort = Type.Type @@ no_region; bound = PrimT "Any" @! at _sloc} @= at _sloc )
+# 28830 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_bind))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28872 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 28882 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 28891 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 945 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 28900 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28963 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 28973 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 28982 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 945 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 28991 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29033 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 29043 "mo_frontend/parser.ml"
+           in
+          let c =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 29052 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 467 "mo_frontend/parser.mly"
+    ( TypF (c, tps, t) @@ at _sloc )
+# 29061 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29124 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 29134 "mo_frontend/parser.ml"
+           in
+          let c =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 339 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 29143 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 467 "mo_frontend/parser.mly"
+    ( TypF (c, tps, t) @@ at _sloc )
+# 29152 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _3 : unit = Obj.magic _3 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29188 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29201 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let mut = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 29208 "mo_frontend/parser.ml"
+           in
+          let (_endpos_mut_, _startpos_mut_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_mut_ != _endpos_mut_ then
+            _startpos_mut_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 469 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 29220 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _3 : unit = Obj.magic _3 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29262 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29276 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let mut =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 29287 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_mut_, _startpos_mut_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_mut_ != _endpos_mut_ then
+            _startpos_mut_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 469 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 29300 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29343 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 29352 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29361 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 471 "mo_frontend/parser.mly"
+    ( let t = funcT(Type.Local @@ no_region, tps, t1, t2)
+              @! span x.at t2.at in
+      ValF (x, t, Const @@ no_region) @@ at _sloc )
+# 29373 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29437 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 29446 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29455 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 471 "mo_frontend/parser.mly"
+    ( let t = funcT(Type.Local @@ no_region, tps, t1, t2)
+              @! span x.at t2.at in
+      ValF (x, t, Const @@ no_region) @@ at _sloc )
+# 29467 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 29503 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let i =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29516 "mo_frontend/parser.ml"
+            
+          in
+          (
+# 448 "mo_frontend/parser.mly"
+                     ( Some i, t )
+# 29522 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_item))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ_item) = 
+# 449 "mo_frontend/parser.mly"
+          ( None, t )
+# 29548 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 435 "mo_frontend/parser.mly"
+    ( t )
+# 29573 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 29613 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__0_, _endpos__0_) in
+          let s = 
+# 367 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 29619 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 29634 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 29696 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_) in
+          let s = 
+# 367 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 29702 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 29717 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = qo;
+                MenhirLib.EngineTypes.startp = _startpos_qo_;
+                MenhirLib.EngineTypes.endp = _endpos_qo_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 29772 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos_qo_, _endpos_qo_) in
+          let s =
+            let _endpos = _endpos_qo_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 368 "mo_frontend/parser.mly"
+                     ( Type.Shared (Lib.Option.get qo Type.Write) @@ at _sloc )
+# 29782 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos_qo_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 29798 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 29874 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let _endpos = _endpos_qo_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 368 "mo_frontend/parser.mly"
+                     ( Type.Shared (Lib.Option.get qo Type.Write) @@ at _sloc )
+# 29884 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos_qo_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 29900 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 29948 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__1_, _endpos__1_) in
+          let s =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 29955 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__1_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 369 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 29964 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 29980 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 30049 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 363 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 30056 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__1_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 369 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 30065 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 30081 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 462 "mo_frontend/parser.mly"
+                ( [] )
+# 30136 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__2_, _endpos__2_) in
+          let s =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 30143 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__2_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 369 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 30152 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__2_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 30168 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 463 "mo_frontend/parser.mly"
+                                      ( ts )
+# 30244 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 364 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 30251 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__2_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 369 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 30260 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__2_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 437 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 30276 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_item list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 400 "mo_frontend/parser.mly"
+    ( (match ts with
+       | [(Some id, t)] -> NamedT(id, t)
+       | [(None, t)] -> ParT t
+       | _ -> TupT(ts)) @! at _sloc )
+# 30323 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tso;
+          MenhirLib.EngineTypes.startp = _startpos_tso_;
+          MenhirLib.EngineTypes.endp = _endpos_tso_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tso : (Mo_def.Syntax.typ list option) = Obj.magic tso in
+        let p : (Mo_def.Syntax.path) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_tso_ in
+        let _v =
+          let _endpos = _endpos_tso_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 405 "mo_frontend/parser.mly"
+    ( PathT(p, Lib.Option.get tso []) @! at _sloc )
+# 30360 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 350 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 30401 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 407 "mo_frontend/parser.mly"
+    ( ArrayT(m, t) @! at _sloc )
+# 30409 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 351 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 30462 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 407 "mo_frontend/parser.mly"
+    ( ArrayT(m, t) @! at _sloc )
+# 30471 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_tfs_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_tfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 409 "mo_frontend/parser.mly"
+    ( ObjT(Type.Object @@ at _sloc, tfs) @! at _sloc )
+# 30501 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_tag list) = Obj.magic tfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_tfs_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_tfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 411 "mo_frontend/parser.mly"
+    ( VariantT tfs @! at _sloc )
+# 30531 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = tfs;
+            MenhirLib.EngineTypes.startp = _startpos_tfs_;
+            MenhirLib.EngineTypes.endp = _endpos_tfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 390 "mo_frontend/parser.mly"
+    ( tfs )
+# 30571 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 421 "mo_frontend/parser.mly"
+    ( t )
+# 30596 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 30623 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 423 "mo_frontend/parser.mly"
+    ( PrimT(s) @! at _sloc )
+# 30636 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 425 "mo_frontend/parser.mly"
+    ( AsyncT(Type.Fut, scopeT (at _sloc), t) @! at _sloc )
+# 30673 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 427 "mo_frontend/parser.mly"
+    ( AsyncT(Type.Cmp, scopeT (at _sloc), t) @! at _sloc )
+# 30710 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 354 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 30748 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 429 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 30760 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 30798 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 429 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 30810 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 356 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 30848 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 429 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 30860 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 30895 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 336 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 30909 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 477 "mo_frontend/parser.mly"
+    ( {tag = x; typ = Lib.Option.get t (TupT [] @! at _sloc)} @@ at _sloc )
+# 30918 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 415 "mo_frontend/parser.mly"
+    ( t )
+# 30944 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 417 "mo_frontend/parser.mly"
+    ( OptT(t) @! at _sloc )
+# 30980 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 394 "mo_frontend/parser.mly"
+    ( [] )
+# 31020 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = tfs;
+            MenhirLib.EngineTypes.startp = _startpos_tfs_;
+            MenhirLib.EngineTypes.endp = _endpos_tfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let tfs : (Mo_def.Syntax.typ_tag list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 396 "mo_frontend/parser.mly"
+    ( tfs )
+# 31059 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.vis' Source.phrase) = 
+# 767 "mo_frontend/parser.mly"
+                ( Private @@ no_region )
+# 31077 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 768 "mo_frontend/parser.mly"
+            ( Private @@ at _sloc )
+# 31106 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 769 "mo_frontend/parser.mly"
+           (
+    let at = at _sloc in
+    let trivia = Trivia.find_trivia !triv_table at in
+    let depr = Trivia.deprecated_of_trivia_info trivia in
+    Public depr @@ at )
+# 31140 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 774 "mo_frontend/parser.mly"
+           ( System @@ at _sloc )
+# 31170 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+    |]
+  
+  and trace =
+    None
+  
+end
+
+module MenhirInterpreter = struct
+  
+  module ET = MenhirLib.TableInterpreter.MakeEngineTable (Tables)
+  
+  module TI = MenhirLib.Engine.Make (ET)
+  
+  include TI
+  
+  module Symbols = struct
+    
+    type _ terminal = 
+      | T_error : unit terminal
+      | T_XOROP : unit terminal
+      | T_XORASSIGN : unit terminal
+      | T_WRAPSUBOP : unit terminal
+      | T_WRAPSUBASSIGN : unit terminal
+      | T_WRAPPOWOP : unit terminal
+      | T_WRAPPOWASSIGN : unit terminal
+      | T_WRAPMULOP : unit terminal
+      | T_WRAPMULASSIGN : unit terminal
+      | T_WRAPADDOP : unit terminal
+      | T_WRAPADDASSIGN : unit terminal
+      | T_WITH : unit terminal
+      | T_WHILE : unit terminal
+      | T_VAR : unit terminal
+      | T_UNDERSCORE : unit terminal
+      | T_TYPE : unit terminal
+      | T_TRY : unit terminal
+      | T_TO_CANDID : unit terminal
+      | T_THROW : unit terminal
+      | T_TEXT : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 31220 "mo_frontend/parser.ml"
+    ) terminal
+      | T_SYSTEM : unit terminal
+      | T_SWITCH : unit terminal
+      | T_SUBOP : unit terminal
+      | T_SUB : unit terminal
+      | T_STABLE : unit terminal
+      | T_SHROP : unit terminal
+      | T_SHRASSIGN : unit terminal
+      | T_SHLOP : unit terminal
+      | T_SHLASSIGN : unit terminal
+      | T_SHARED : unit terminal
+      | T_SEMICOLON_EOL : unit terminal
+      | T_SEMICOLON : unit terminal
+      | T_RPAR : unit terminal
+      | T_ROTROP : unit terminal
+      | T_ROTRASSIGN : unit terminal
+      | T_ROTLOP : unit terminal
+      | T_ROTLASSIGN : unit terminal
+      | T_RETURN : unit terminal
+      | T_RCURLY : unit terminal
+      | T_RBRACKET : unit terminal
+      | T_QUEST : unit terminal
+      | T_QUERY : unit terminal
+      | T_PUBLIC : unit terminal
+      | T_PRIVATE : unit terminal
+      | T_PRIM : unit terminal
+      | T_POWOP : unit terminal
+      | T_POWASSIGN : unit terminal
+      | T_PLUSASSIGN : unit terminal
+      | T_PIPE : unit terminal
+      | T_OROP : unit terminal
+      | T_ORASSIGN : unit terminal
+      | T_OR : unit terminal
+      | T_OLD : unit terminal
+      | T_OBJECT : unit terminal
+      | T_NULL : unit terminal
+      | T_NOT : unit terminal
+      | T_NEQOP : unit terminal
+      | T_NAT : (
+# 230 "mo_frontend/parser.mly"
+      (string)
+# 31262 "mo_frontend/parser.ml"
+    ) terminal
+      | T_MULOP : unit terminal
+      | T_MULASSIGN : unit terminal
+      | T_MODULE : unit terminal
+      | T_MODOP : unit terminal
+      | T_MODASSIGN : unit terminal
+      | T_MINUSASSIGN : unit terminal
+      | T_LTOP : unit terminal
+      | T_LT : unit terminal
+      | T_LPAR : unit terminal
+      | T_LOOP : unit terminal
+      | T_LET : unit terminal
+      | T_LEOP : unit terminal
+      | T_LCURLY : unit terminal
+      | T_LBRACKET : unit terminal
+      | T_LABEL : unit terminal
+      | T_INVARIANT : unit terminal
+      | T_IN : unit terminal
+      | T_IMPORT : unit terminal
+      | T_IMPLIES : unit terminal
+      | T_IGNORE : unit terminal
+      | T_IF : unit terminal
+      | T_ID : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 31288 "mo_frontend/parser.ml"
+    ) terminal
+      | T_HASH : unit terminal
+      | T_GTOP : unit terminal
+      | T_GT : unit terminal
+      | T_GEOP : unit terminal
+      | T_FUNC : unit terminal
+      | T_FROM_CANDID : unit terminal
+      | T_FOR : unit terminal
+      | T_FLOAT : (
+# 231 "mo_frontend/parser.mly"
+      (string)
+# 31300 "mo_frontend/parser.ml"
+    ) terminal
+      | T_FLEXIBLE : unit terminal
+      | T_EQOP : unit terminal
+      | T_EQ : unit terminal
+      | T_EOF : unit terminal
+      | T_ELSE : unit terminal
+      | T_DOT_NUM : (
+# 229 "mo_frontend/parser.mly"
+      (string)
+# 31310 "mo_frontend/parser.ml"
+    ) terminal
+      | T_DOT : unit terminal
+      | T_DO : unit terminal
+      | T_DIVOP : unit terminal
+      | T_DIVASSIGN : unit terminal
+      | T_DISALLOWED : unit terminal
+      | T_DEBUG_SHOW : unit terminal
+      | T_DEBUG : unit terminal
+      | T_CONTINUE : unit terminal
+      | T_COMPOSITE : unit terminal
+      | T_COMMA : unit terminal
+      | T_COLON : unit terminal
+      | T_CLASS : unit terminal
+      | T_CHAR : (
+# 232 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 31327 "mo_frontend/parser.ml"
+    ) terminal
+      | T_CATCH : unit terminal
+      | T_CATASSIGN : unit terminal
+      | T_CASE : unit terminal
+      | T_BREAK : unit terminal
+      | T_BOOL : (
+# 233 "mo_frontend/parser.mly"
+      (bool)
+# 31336 "mo_frontend/parser.ml"
+    ) terminal
+      | T_BANG : unit terminal
+      | T_AWAITSTAR : unit terminal
+      | T_AWAIT : unit terminal
+      | T_ASYNCSTAR : unit terminal
+      | T_ASYNC : unit terminal
+      | T_ASSIGN : unit terminal
+      | T_ASSERT : unit terminal
+      | T_ARROW : unit terminal
+      | T_ANDOP : unit terminal
+      | T_ANDASSIGN : unit terminal
+      | T_AND : unit terminal
+      | T_ADDOP : unit terminal
+      | T_ACTOR : unit terminal
+    
+    type _ nonterminal = 
+      | N_vis : (Mo_def.Syntax.vis' Source.phrase) nonterminal
+      | N_typ_variant : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_typ_un : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_tag : (Mo_def.Syntax.typ_tag' Source.phrase) nonterminal
+      | N_typ_pre : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_obj : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_typ_nullary : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_nobin : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_item : (Mo_def.Syntax.typ_item) nonterminal
+      | N_typ_field : (Mo_def.Syntax.typ_field' Source.phrase) nonterminal
+      | N_typ_dec : (Mo_def.Syntax.dec) nonterminal
+      | N_typ_bind : (Mo_def.Syntax.typ_bind) nonterminal
+      | N_typ_args : (Mo_def.Syntax.typ list) nonterminal
+      | N_typ : (Mo_def.Syntax.typ) nonterminal
+      | N_start : (unit) nonterminal
+      | N_stab_field : (Mo_def.Syntax.typ_field' Source.phrase) nonterminal
+      | N_stab : (Mo_def.Syntax.stab option) nonterminal
+      | N_seplist1_typ_tag_semicolon_ : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_seplist1_exp_field_semicolon_ : (Mo_def.Syntax.exp_field list) nonterminal
+      | N_seplist_typ_tag_semicolon_ : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_seplist_typ_item_COMMA_ : (Mo_def.Syntax.typ_item list) nonterminal
+      | N_seplist_typ_field_semicolon_ : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_seplist_typ_dec_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_typ_bind_COMMA_ : (Mo_def.Syntax.typ_bind list) nonterminal
+      | N_seplist_typ_COMMA_ : (Mo_def.Syntax.typ list) nonterminal
+      | N_seplist_stab_field_semicolon_ : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_seplist_pat_field_semicolon_ : (Mo_def.Syntax.pat_field list) nonterminal
+      | N_seplist_pat_bin_COMMA_ : (Mo_def.Syntax.pat list) nonterminal
+      | N_seplist_imp_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_imp_SEMICOLON_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_exp_nonvar_ob__COMMA_ : (Mo_def.Syntax.exp list) nonterminal
+      | N_seplist_exp_field_semicolon_ : (Mo_def.Syntax.exp_field list) nonterminal
+      | N_seplist_exp_ob__COMMA_ : (Mo_def.Syntax.exp list) nonterminal
+      | N_seplist_dec_field_semicolon_ : (Mo_def.Syntax.dec_field list) nonterminal
+      | N_seplist_dec_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_dec_SEMICOLON_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_case_semicolon_ : (Mo_def.Syntax.case list) nonterminal
+      | N_separated_nonempty_list_AND_exp_post_ob__ : (Mo_def.Syntax.exp list) nonterminal
+      | N_path : (Mo_def.Syntax.path) nonterminal
+      | N_pat_un : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_plain : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_opt : (Source.region -> Mo_def.Syntax.pat) nonterminal
+      | N_pat_nullary : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_field : (Mo_def.Syntax.pat_field) nonterminal
+      | N_pat_bin : (Mo_def.Syntax.pat) nonterminal
+      | N_pat : (Mo_def.Syntax.pat) nonterminal
+      | N_parse_stab_sig : (string -> Mo_def.Syntax.stab_sig) nonterminal
+      | N_parse_prog_interactive : (string -> Mo_def.Syntax.prog) nonterminal
+      | N_parse_prog : (string -> Mo_def.Syntax.prog) nonterminal
+      | N_parse_module_header : (unit) nonterminal
+      | N_option_typ_args_ : (Mo_def.Syntax.typ list option) nonterminal
+      | N_option_query_ : (Mo_types.Type.shared_sort option) nonterminal
+      | N_option_exp_nullary_ob__ : (Mo_def.Syntax.exp option) nonterminal
+      | N_option_EQ_ : (unit option) nonterminal
+      | N_obj_body : (Mo_def.Syntax.dec_field list) nonterminal
+      | N_ob : (Mo_def.Syntax.exp) nonterminal
+      | N_lit : (Mo_def.Syntax.lit) nonterminal
+      | N_inst : (Mo_def.Syntax.inst) nonterminal
+      | N_import_list : (Mo_def.Syntax.dec list) nonterminal
+      | N_imp : (Mo_def.Syntax.dec) nonterminal
+      | N_func_body : (bool * Mo_def.Syntax.exp) nonterminal
+      | N_exp_un_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_un_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_post_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_post_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_plain : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_obj : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nullary_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nullary_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nonvar_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nonvar_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nondec_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nondec_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nest : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_field : (Mo_def.Syntax.exp_field) nonterminal
+      | N_exp_bin_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_bin_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_dec_var : (Mo_def.Syntax.dec) nonterminal
+      | N_dec_nonvar : (Mo_def.Syntax.dec) nonterminal
+      | N_dec_field : (Mo_def.Syntax.dec_field) nonterminal
+      | N_dec : (Mo_def.Syntax.dec) nonterminal
+      | N_class_body : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) nonterminal
+      | N_catch : (Mo_def.Syntax.case) nonterminal
+      | N_case : (Mo_def.Syntax.case) nonterminal
+      | N_block : (Mo_def.Syntax.exp) nonterminal
+      | N_bl : (Mo_def.Syntax.exp) nonterminal
+      | N_annot_opt : (Mo_def.Syntax.typ option) nonterminal
+    
+  end
+  
+  include Symbols
+  
+  include MenhirLib.InspectionTableInterpreter.Make (Tables) (struct
+    
+    include TI
+    
+    include Symbols
+    
+    include MenhirLib.InspectionTableInterpreter.Symbols (Symbols)
+    
+    let terminal =
+      fun t ->
+        match t with
+        | 0 ->
+            X (T T_error)
+        | 1 ->
+            X (T T_XOROP)
+        | 2 ->
+            X (T T_XORASSIGN)
+        | 3 ->
+            X (T T_WRAPSUBOP)
+        | 4 ->
+            X (T T_WRAPSUBASSIGN)
+        | 5 ->
+            X (T T_WRAPPOWOP)
+        | 6 ->
+            X (T T_WRAPPOWASSIGN)
+        | 7 ->
+            X (T T_WRAPMULOP)
+        | 8 ->
+            X (T T_WRAPMULASSIGN)
+        | 9 ->
+            X (T T_WRAPADDOP)
+        | 10 ->
+            X (T T_WRAPADDASSIGN)
+        | 11 ->
+            X (T T_WITH)
+        | 12 ->
+            X (T T_WHILE)
+        | 13 ->
+            X (T T_VAR)
+        | 14 ->
+            X (T T_UNDERSCORE)
+        | 15 ->
+            X (T T_TYPE)
+        | 16 ->
+            X (T T_TRY)
+        | 17 ->
+            X (T T_TO_CANDID)
+        | 18 ->
+            X (T T_THROW)
+        | 19 ->
+            X (T T_TEXT)
+        | 20 ->
+            X (T T_SYSTEM)
+        | 21 ->
+            X (T T_SWITCH)
+        | 22 ->
+            X (T T_SUBOP)
+        | 23 ->
+            X (T T_SUB)
+        | 24 ->
+            X (T T_STABLE)
+        | 25 ->
+            X (T T_SHROP)
+        | 26 ->
+            X (T T_SHRASSIGN)
+        | 27 ->
+            X (T T_SHLOP)
+        | 28 ->
+            X (T T_SHLASSIGN)
+        | 29 ->
+            X (T T_SHARED)
+        | 30 ->
+            X (T T_SEMICOLON_EOL)
+        | 31 ->
+            X (T T_SEMICOLON)
+        | 32 ->
+            X (T T_RPAR)
+        | 33 ->
+            X (T T_ROTROP)
+        | 34 ->
+            X (T T_ROTRASSIGN)
+        | 35 ->
+            X (T T_ROTLOP)
+        | 36 ->
+            X (T T_ROTLASSIGN)
+        | 37 ->
+            X (T T_RETURN)
+        | 38 ->
+            X (T T_RCURLY)
+        | 39 ->
+            X (T T_RBRACKET)
+        | 40 ->
+            X (T T_QUEST)
+        | 41 ->
+            X (T T_QUERY)
+        | 42 ->
+            X (T T_PUBLIC)
+        | 43 ->
+            X (T T_PRIVATE)
+        | 44 ->
+            X (T T_PRIM)
+        | 45 ->
+            X (T T_POWOP)
+        | 46 ->
+            X (T T_POWASSIGN)
+        | 47 ->
+            X (T T_PLUSASSIGN)
+        | 48 ->
+            X (T T_PIPE)
+        | 49 ->
+            X (T T_OROP)
+        | 50 ->
+            X (T T_ORASSIGN)
+        | 51 ->
+            X (T T_OR)
+        | 52 ->
+            X (T T_OLD)
+        | 53 ->
+            X (T T_OBJECT)
+        | 54 ->
+            X (T T_NULL)
+        | 55 ->
+            X (T T_NOT)
+        | 56 ->
+            X (T T_NEQOP)
+        | 57 ->
+            X (T T_NAT)
+        | 58 ->
+            X (T T_MULOP)
+        | 59 ->
+            X (T T_MULASSIGN)
+        | 60 ->
+            X (T T_MODULE)
+        | 61 ->
+            X (T T_MODOP)
+        | 62 ->
+            X (T T_MODASSIGN)
+        | 63 ->
+            X (T T_MINUSASSIGN)
+        | 64 ->
+            X (T T_LTOP)
+        | 65 ->
+            X (T T_LT)
+        | 66 ->
+            X (T T_LPAR)
+        | 67 ->
+            X (T T_LOOP)
+        | 68 ->
+            X (T T_LET)
+        | 69 ->
+            X (T T_LEOP)
+        | 70 ->
+            X (T T_LCURLY)
+        | 71 ->
+            X (T T_LBRACKET)
+        | 72 ->
+            X (T T_LABEL)
+        | 73 ->
+            X (T T_INVARIANT)
+        | 74 ->
+            X (T T_IN)
+        | 75 ->
+            X (T T_IMPORT)
+        | 76 ->
+            X (T T_IMPLIES)
+        | 77 ->
+            X (T T_IGNORE)
+        | 78 ->
+            X (T T_IF)
+        | 79 ->
+            X (T T_ID)
+        | 80 ->
+            X (T T_HASH)
+        | 81 ->
+            X (T T_GTOP)
+        | 82 ->
+            X (T T_GT)
+        | 83 ->
+            X (T T_GEOP)
+        | 84 ->
+            X (T T_FUNC)
+        | 85 ->
+            X (T T_FROM_CANDID)
+        | 86 ->
+            X (T T_FOR)
+        | 87 ->
+            X (T T_FLOAT)
+        | 88 ->
+            X (T T_FLEXIBLE)
+        | 89 ->
+            X (T T_EQOP)
+        | 90 ->
+            X (T T_EQ)
+        | 91 ->
+            X (T T_EOF)
+        | 92 ->
+            X (T T_ELSE)
+        | 93 ->
+            X (T T_DOT_NUM)
+        | 94 ->
+            X (T T_DOT)
+        | 95 ->
+            X (T T_DO)
+        | 96 ->
+            X (T T_DIVOP)
+        | 97 ->
+            X (T T_DIVASSIGN)
+        | 98 ->
+            X (T T_DISALLOWED)
+        | 99 ->
+            X (T T_DEBUG_SHOW)
+        | 100 ->
+            X (T T_DEBUG)
+        | 101 ->
+            X (T T_CONTINUE)
+        | 102 ->
+            X (T T_COMPOSITE)
+        | 103 ->
+            X (T T_COMMA)
+        | 104 ->
+            X (T T_COLON)
+        | 105 ->
+            X (T T_CLASS)
+        | 106 ->
+            X (T T_CHAR)
+        | 107 ->
+            X (T T_CATCH)
+        | 108 ->
+            X (T T_CATASSIGN)
+        | 109 ->
+            X (T T_CASE)
+        | 110 ->
+            X (T T_BREAK)
+        | 111 ->
+            X (T T_BOOL)
+        | 112 ->
+            X (T T_BANG)
+        | 113 ->
+            X (T T_AWAITSTAR)
+        | 114 ->
+            X (T T_AWAIT)
+        | 115 ->
+            X (T T_ASYNCSTAR)
+        | 116 ->
+            X (T T_ASYNC)
+        | 117 ->
+            X (T T_ASSIGN)
+        | 118 ->
+            X (T T_ASSERT)
+        | 119 ->
+            X (T T_ARROW)
+        | 120 ->
+            X (T T_ANDOP)
+        | 121 ->
+            X (T T_ANDASSIGN)
+        | 122 ->
+            X (T T_AND)
+        | 123 ->
+            X (T T_ADDOP)
+        | 124 ->
+            X (T T_ACTOR)
+        | _ ->
+            assert false
+    
+    and nonterminal =
+      fun nt ->
+        match nt with
+        | 92 ->
+            X (N N_annot_opt)
+        | 91 ->
+            X (N N_bl)
+        | 90 ->
+            X (N N_block)
+        | 89 ->
+            X (N N_case)
+        | 88 ->
+            X (N N_catch)
+        | 87 ->
+            X (N N_class_body)
+        | 86 ->
+            X (N N_dec)
+        | 85 ->
+            X (N N_dec_field)
+        | 84 ->
+            X (N N_dec_nonvar)
+        | 83 ->
+            X (N N_dec_var)
+        | 82 ->
+            X (N N_exp_bl_)
+        | 81 ->
+            X (N N_exp_ob_)
+        | 80 ->
+            X (N N_exp_bin_bl_)
+        | 79 ->
+            X (N N_exp_bin_ob_)
+        | 78 ->
+            X (N N_exp_field)
+        | 77 ->
+            X (N N_exp_nest)
+        | 76 ->
+            X (N N_exp_nondec_bl_)
+        | 75 ->
+            X (N N_exp_nondec_ob_)
+        | 74 ->
+            X (N N_exp_nonvar_bl_)
+        | 73 ->
+            X (N N_exp_nonvar_ob_)
+        | 72 ->
+            X (N N_exp_nullary_bl_)
+        | 71 ->
+            X (N N_exp_nullary_ob_)
+        | 70 ->
+            X (N N_exp_obj)
+        | 69 ->
+            X (N N_exp_plain)
+        | 68 ->
+            X (N N_exp_post_bl_)
+        | 67 ->
+            X (N N_exp_post_ob_)
+        | 66 ->
+            X (N N_exp_un_bl_)
+        | 65 ->
+            X (N N_exp_un_ob_)
+        | 64 ->
+            X (N N_func_body)
+        | 63 ->
+            X (N N_imp)
+        | 62 ->
+            X (N N_import_list)
+        | 61 ->
+            X (N N_inst)
+        | 60 ->
+            X (N N_lit)
+        | 59 ->
+            X (N N_ob)
+        | 58 ->
+            X (N N_obj_body)
+        | 57 ->
+            X (N N_option_EQ_)
+        | 56 ->
+            X (N N_option_exp_nullary_ob__)
+        | 55 ->
+            X (N N_option_query_)
+        | 54 ->
+            X (N N_option_typ_args_)
+        | 53 ->
+            X (N N_parse_module_header)
+        | 52 ->
+            X (N N_parse_prog)
+        | 51 ->
+            X (N N_parse_prog_interactive)
+        | 50 ->
+            X (N N_parse_stab_sig)
+        | 49 ->
+            X (N N_pat)
+        | 48 ->
+            X (N N_pat_bin)
+        | 47 ->
+            X (N N_pat_field)
+        | 46 ->
+            X (N N_pat_nullary)
+        | 45 ->
+            X (N N_pat_opt)
+        | 44 ->
+            X (N N_pat_plain)
+        | 43 ->
+            X (N N_pat_un)
+        | 42 ->
+            X (N N_path)
+        | 41 ->
+            X (N N_separated_nonempty_list_AND_exp_post_ob__)
+        | 40 ->
+            X (N N_seplist_case_semicolon_)
+        | 39 ->
+            X (N N_seplist_dec_SEMICOLON_)
+        | 38 ->
+            X (N N_seplist_dec_semicolon_)
+        | 37 ->
+            X (N N_seplist_dec_field_semicolon_)
+        | 36 ->
+            X (N N_seplist_exp_ob__COMMA_)
+        | 35 ->
+            X (N N_seplist_exp_field_semicolon_)
+        | 34 ->
+            X (N N_seplist_exp_nonvar_ob__COMMA_)
+        | 33 ->
+            X (N N_seplist_imp_SEMICOLON_)
+        | 32 ->
+            X (N N_seplist_imp_semicolon_)
+        | 31 ->
+            X (N N_seplist_pat_bin_COMMA_)
+        | 30 ->
+            X (N N_seplist_pat_field_semicolon_)
+        | 29 ->
+            X (N N_seplist_stab_field_semicolon_)
+        | 28 ->
+            X (N N_seplist_typ_COMMA_)
+        | 27 ->
+            X (N N_seplist_typ_bind_COMMA_)
+        | 26 ->
+            X (N N_seplist_typ_dec_semicolon_)
+        | 25 ->
+            X (N N_seplist_typ_field_semicolon_)
+        | 24 ->
+            X (N N_seplist_typ_item_COMMA_)
+        | 23 ->
+            X (N N_seplist_typ_tag_semicolon_)
+        | 22 ->
+            X (N N_seplist1_exp_field_semicolon_)
+        | 21 ->
+            X (N N_seplist1_typ_tag_semicolon_)
+        | 20 ->
+            X (N N_stab)
+        | 19 ->
+            X (N N_stab_field)
+        | 18 ->
+            X (N N_start)
+        | 17 ->
+            X (N N_typ)
+        | 16 ->
+            X (N N_typ_args)
+        | 15 ->
+            X (N N_typ_bind)
+        | 14 ->
+            X (N N_typ_dec)
+        | 13 ->
+            X (N N_typ_field)
+        | 12 ->
+            X (N N_typ_item)
+        | 11 ->
+            X (N N_typ_nobin)
+        | 10 ->
+            X (N N_typ_nullary)
+        | 9 ->
+            X (N N_typ_obj)
+        | 8 ->
+            X (N N_typ_pre)
+        | 7 ->
+            X (N N_typ_tag)
+        | 6 ->
+            X (N N_typ_un)
+        | 5 ->
+            X (N N_typ_variant)
+        | 4 ->
+            X (N N_vis)
+        | _ ->
+            assert false
+    
+    and lr0_incoming =
+      (8, "\000%\152\030(nt\134\004\176\214\224y.yR\142\160\210<T\206ToR\134T\132\1600Z(l\142\028\160\210z\019\132\031\20877\166\142 \160\1327\166\182\144\028\160\206T\1327\166\011\r\240\232\234\250\019\r\017\019\021U\132\r\240\017\023\023#h#\246#\20899\166\190\160!m\017\023\r\240\023#P#P#\182#\160\1327\166\021\210#\210#\021\210#\162N\160\185\015>\162\015>/@//@/\027>3@3+N3N\r\240\023#\019#7\166\r\240\023\r\240\023\160\210#\025\208#11B\r\1327\166\r\240\023\r\240\023#\185\182\160\162\160Y]y\248yW]aha\210#c=N_>=@=W?Ba\208?]\182s(A}\184\127>A@Ak\000%A\004\006\030$\134\026Z(\134\028\160\185\182 \160\1327\166\182#\182#\"\004.R`p\128\134&\006\142\028\160\185\182,\160wy\139\141\143\142\220]\026\143\030\"$\134<oY[l\212\1327\166Y\185\142*VX\t2\178)LT[l\212\1327\166Y\185\182\160uuu\175\160\1327\166Y\185\175Y\185\175Y\185\175z\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\170\1327\166Y\185\142j&,\143\142QN\179>Q@Q.\144\028l\160su\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175suz\160su\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175su\136L\138c\182\146\160\185R\162\160\143\172\200\248\250\139\131\135\1329\166\144\156Z(`\131\143jp\131\128\131\134*\144\028\158\143\136\146\160\185\156\158\143\160\162\160\143\170\1327\166Y\185\182\174\134c\150\192R\181\181\202\172\131\174\134c\150\204\160\206T[l\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175z\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\170\1327\166Y\185\129\181\160\1327\166Y\185\129Y\185\129Y\185\129\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\250\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\222\160q\143\228\192R\181\181\198\200\131\202\204\160\222\160q\228\230\232\234\238\210*\248\131\250\160su\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175su\139\133\137\144\230\139\145\149\153\155\161\004\131\159\004\159\b\159\012\159\016\159\020\159.\1594\1598\159D\159H\159\\\159b\159d\159h\159r\159v\159|\159\130\159\140\159\154\159\162\159\164\159\168\159\180\159\194\159\210\023\242\159\246\159\248\159\006\232\155\165\167\169\181\183\234\155\238\210*\155L\155t\210\234\155\148\155\170\155\155\250\147\151\159\006\163\167\169\n\163\014\163\018\163\022\1636\163:\163F\163J\163^\163`\163f\163x\163~\163\128\163\196\163\218\163\236\163\244\163\163\b\159\n\163\012\159\014\163\016\159\018\163\020\159\022\163.\1594\1596\1638\159:\163D\159F\163H\159J\163\\\159^\163`\163b\159d\159f\163h\159r\159v\159x\163|\159~\163\128\163\130\159\140\159\154\159\162\159\164\159\168\159\180\159\194\159\196\163\210\023\218\163\236\163\242\159\244\163\246\159\248\159\163P\188\190\160\226{\143\155L\155t\210\234\155\148\155\170\155\155\155\155\155\155\155\155\163B\155\155\163B\155\163\129\160\1327\166Y\185\129Y\185\129Y\185\129\155\186\155\155\155\155\026\155\155\186\155EP\147\208EEP\137\190\160BIB\163\208I\155\155\163P\188\190\160\226{\143\131\131\131\155\163\163\155\026\155EPEP\131\155\155\138c\182\163\186\155MN\151\167\169\173>M@M\129\160\1327\166Y\185\129Y\185\129Y\185\129\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\250\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\163\173KN\171>K@K\175\160\1327\166Y\185\175Y\185\175Y\185\175z\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\170\1327\166Y\185\129\160\1327\166Y\185\129Y\185\129Y\185\129\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175\250\212\1327\166Y\185\175\160\1327\166Y\185\175Y\185\175Y\185\175IB\155\216]\155\177\155\155QN\163\160\185\182\163GNS\024\160-N\157>G\157>G@G@G\135\246SN\135\246S\131\155*\135\190\160B\131\131\131\131\131\131\155\177\163\143\155IB\131\131M\184i\000%CO>\173@O\127@Cg\000% \160\1327\166\182#\182#\029>5@55\250\1422\028\160\210#\160\210#'>;@;;Ne")
+    
+    and rhs =
+      ((8, "kige\210#\198\142MN\220]\155\216]\155\182\160u\182uu\167\169\151\138c\182\163\186\155\t)\173\138c\182\163 \160\182# \160\1327\166\182#l\160sulsu\250\160su\250suz\160suzsu\170\160Y\185\129\170\160\1327\166Y\185\129\170Y\185\129\170\1327\166Y\185\129<o[\170\160Y\185\129<o[\170\160\1327\166Y\185\129<o[\170Y\185\129<o[\170\1327\166Y\185\129T[\170\160Y\185\129T[\170\160\1327\166Y\185\129T[\170Y\185\129T[\170\1327\166Y\185\129\206T[\170\160Y\185\129\206T[\170\160\1327\166Y\185\129\206T[\170Y\185\129\206T[\170\1327\166Y\185\129\212\160Y\185\175\212\160\1327\166Y\185\175\212Y\185\175\212\1327\166Y\185\175l\212\160Y\185\175l\212\160\1327\166Y\185\175l\212Y\185\175l\212\1327\166Y\185\175\250\212\160Y\185\175\250\212\160\1327\166Y\185\175\250\212Y\185\175\250\212\1327\166Y\185\175z\212\160Y\185\175z\212\160\1327\166Y\185\175z\212Y\185\175z\212\1327\166Y\185\175<o[\212\160Y\185\175<o[\212\160\1327\166Y\185\175<o[\212Y\185\175<o[\212\1327\166Y\185\175<o[l\212\160Y\185\175<o[l\212\160\1327\166Y\185\175<o[l\212Y\185\175<o[l\212\1327\166Y\185\175<o[\250\212\160Y\185\175<o[\250\212\160\1327\166Y\185\175<o[\250\212Y\185\175<o[\250\212\1327\166Y\185\175<o[z\212\160Y\185\175<o[z\212\160\1327\166Y\185\175<o[z\212Y\185\175<o[z\212\1327\166Y\185\175T[\212\160Y\185\175T[\212\160\1327\166Y\185\175T[\212Y\185\175T[\212\1327\166Y\185\175T[l\212\160Y\185\175T[l\212\160\1327\166Y\185\175T[l\212Y\185\175T[l\212\1327\166Y\185\175T[\250\212\160Y\185\175T[\250\212\160\1327\166Y\185\175T[\250\212Y\185\175T[\250\212\1327\166Y\185\175T[z\212\160Y\185\175T[z\212\160\1327\166Y\185\175T[z\212Y\185\175T[z\212\1327\166Y\185\175\206T[\212\160Y\185\175\206T[\212\160\1327\166Y\185\175\206T[\212Y\185\175\206T[\212\1327\166Y\185\175\206T[l\212\160Y\185\175\206T[l\212\160\1327\166Y\185\175\206T[l\212Y\185\175\206T[l\212\1327\166Y\185\175\206T[\250\212\160Y\185\175\206T[\250\212\160\1327\166Y\185\175\206T[\250\212Y\185\175\206T[\250\212\1327\166Y\185\175\206T[z\212\160Y\185\175\206T[z\212\160\1327\166Y\185\175\206T[z\212Y\185\175\206T[z\212\1327\166Y\185\175\028\160\185\182\163\149\167\147\167\133\161\248\159\161.\159\161v\159\161\194\159\161|\159\161\\\159\161\020\159\161\b\159\161\016\159\161\012\159\161\242\159\161d\159\161\004\159\1618\159\1614\159\161H\159\161D\159\161\162\159\161\180\159\161r\159\161\130\159\161\140\159\161\164\159\161\168\159\161\246\159\161h\159\161\210\023\161b\159\161\154\159\131\159\248\159\159.\159\159v\159\159\194\159\159|\159\159\\\159\159\020\159\159\b\159\159\016\159\159\012\159\159\242\159\159d\159\159\004\159\1598\159\1594\159\159H\159\159D\159\159\162\159\159\180\159\159r\159\159\130\159\159\140\159\159\164\159\159\168\159\159\246\159\159h\159\159\210\023\159b\159\159\154\159\160\185\028\160\185\160\185\182\163\028\160\185\182\163\181\165\161\161\236\163\161`\163\161\128\163\161x\163\161\196\163\161~\163\161^\163\161\022\163\161\n\163\161\018\163\161\014\163\161\244\163\161f\163\161\006\163\161:\163\1616\163\161J\163\161F\163\161\218\163LL\163\234\155\232\155\230\155\228\155\238\155\146\160\185\155\222\160q\204\160\202\155\158\143\155\158\143\155\186\155\"\155\177&\155,\143\142QN\026\143\155\136\155\136\155\026\155\174\134c\150\163B\155\156\155\192\181\192R\181\238\210*\155\238\210\148\155\238\210\170\155\238\210L\155\238\210t\210\234\155j\155\159\159\236\163\159`\163\159\128\163\159x\163\159\196\163\159~\163\159^\163\159\022\163\159\n\163\159\018\163\159\014\163\159\244\163\159f\163\159\006\163\159:\163\1596\163\159J\163\159F\163\159\218\163LL\163\234\155\232\155\230\155\228\155\238\155\146\160\185\155\222\160q\204\160\202\155\158\143\155\158\143\155\186\155\"\155\177&\155,\143\142QN\026\143\155\136\155\136\155\026\155\174\134c\150\163B\155\156\155\192\181\192R\181\238\210*\155\238\210\148\155\238\210\170\155\238\210L\155\238\210t\210\234\155j\155\153\169\151\169\183\139\160Z(\030w\139\160Z(\030\142GN\142\135\246SN\142S\024-Ny\134IB\145\144EP\144\028EP\137\144\163P\137\188\137\190\160\137{\143\137\226\134*\137\190\160B\143\144EP\144\028EP\135\144\163P\135\188\135\190\160\135{\143\135\226\134*\135\190\160B\137\162\160\162\160\143R\131\248\131.\131\004\131`\131\128\131\006\131\250\139p\131\200\131$\134IB\172\131\135\162\160\162\160\143R\131\248\131.\131\004\131`\131\128\131\006\131\250\139p\131\200\131$\134IB\172\131\182\163\181\152]s(A\1329\166n\224t\176\214(\141\142KN\182\143T\206T!%}\184%AM\184%CO>%5\250\142;NaWahaa\210#\160\185\160\185\182cY\142=NY\030\160y\134?B]\162\160\162\160]RW\248y.y\004y\160U\190\160\135\135\246S\179\179@Q\179>Q\173\173@O\173\173@M\173>M\171\171@K\171>K\163\163\208I\157\157@G\157>G\147\147\208E\127\127@C\127\127@A\127>Aaa\208?__@=_>=''@;'>;##\2089\031\031\2087\029\029@5\029>5\027\027@3\027>3\025\025\2081\015\015@/\015>/\157\157@G\157>G\015\015@/\015>/\17822\160\210#2\028\160\210#\023#\246##h#\1329\166\1600#\160 \160\182# \160\1327\166\182# \160\182# \160\1327\166\182#\160\210#\028\160\210#\160\021\210#\160\1327\166\021\210#\160\210##\017\r\240\023\1327\166\r\240\023<o\r\240\023<o\1327\166\r\240\023T\r\240\023T\1327\166\r\240\023\206T\r\240\023\206T\1327\166\r\240\023\1341BUm\144#P\144\028#P\019\011\1423N\rZ(\234\017\232\017l\019\250\019z\019\162\160\185\021R\r\142\162N\142+NXV*"), (16, "\000\000\000\001\000\002\000\003\000\004\000\006\000\006\000\007\000\n\000\r\000\016\000\019\000\021\000\022\000\023\000\024\000\025\000\031\000\"\000&\000*\0001\0005\0008\000<\000?\000C\000F\000K\000S\000W\000^\000f\000q\000x\000\130\000\137\000\147\000\153\000\162\000\170\000\181\000\188\000\198\000\203\000\211\000\215\000\222\000\228\000\237\000\242\000\250\001\000\001\t\001\014\001\022\001\028\001%\001*\0012\001:\001E\001L\001V\001_\001k\001s\001~\001\135\001\147\001\155\001\166\001\175\001\187\001\195\001\206\001\213\001\223\001\229\001\238\001\246\002\001\002\b\002\018\002\026\002%\002,\0026\002>\002I\002P\002Z\002b\002m\002t\002~\002\135\002\147\002\155\002\166\002\175\002\187\002\195\002\206\002\215\002\227\002\235\002\246\002\251\002\252\002\253\002\254\002\255\003\000\003\003\003\006\003\t\003\012\003\015\003\018\003\021\003\024\003\027\003\030\003!\003$\003'\003*\003-\0030\0033\0036\0039\003<\003?\003B\003E\003H\003K\003N\003Q\003T\003W\003X\003[\003^\003a\003d\003g\003j\003m\003p\003s\003v\003y\003|\003\127\003\130\003\133\003\136\003\139\003\142\003\145\003\148\003\151\003\154\003\157\003\160\003\163\003\166\003\169\003\172\003\175\003\177\003\180\003\184\003\189\003\190\003\191\003\192\003\195\003\198\003\201\003\204\003\207\003\210\003\213\003\216\003\219\003\222\003\225\003\228\003\231\003\234\003\237\003\240\003\243\003\246\003\249\003\250\003\252\003\254\004\000\004\002\004\004\004\006\004\n\004\r\004\015\004\017\004\020\004\025\004\028\004\030\004#\004&\004(\004,\0043\0045\0047\004:\004>\004B\004F\004J\004P\004R\004S\004V\004Y\004\\\004_\004b\004e\004h\004k\004n\004q\004t\004w\004z\004}\004\128\004\131\004\134\004\137\004\140\004\141\004\143\004\145\004\147\004\149\004\151\004\153\004\157\004\160\004\162\004\164\004\167\004\172\004\175\004\177\004\182\004\185\004\187\004\191\004\198\004\200\004\202\004\205\004\209\004\213\004\217\004\221\004\227\004\229\004\230\004\231\004\232\004\233\004\234\004\235\004\236\004\238\004\239\004\240\004\241\004\242\004\244\004\245\004\248\004\253\005\002\005\003\005\006\005\007\005\n\005\014\005\018\005\020\005\023\005\026\005\028\005\"\005#\005&\005*\005.\0050\0053\0056\0058\005>\005?\005A\005D\005F\005H\005J\005L\005N\005P\005R\005T\005V\005X\005\\\005^\005_\005a\005d\005f\005h\005j\005l\005n\005p\005r\005t\005v\005x\005|\005~\005\128\005\129\005\133\005\134\005\134\005\137\005\138\005\139\005\140\005\141\005\142\005\143\005\144\005\147\005\147\005\148\005\148\005\149\005\149\005\150\005\152\005\152\005\153\005\156\005\160\005\164\005\170\005\171\005\172\005\175\005\178\005\180\005\184\005\185\005\188\005\189\005\189\005\190\005\191\005\192\005\195\005\196\005\198\005\201\005\203\005\205\005\207\005\209\005\210\005\213\005\214\005\217\005\217\005\218\005\221\005\224\005\224\005\225\005\228\005\228\005\229\005\232\005\235\005\235\005\236\005\239\005\242\005\242\005\243\005\246\005\246\005\247\005\250\005\253\005\253\005\254\006\001\006\001\006\002\006\005\006\005\006\006\006\t\006\012\006\012\006\r\006\016\006\016\006\017\006\020\006\023\006\023\006\024\006\027\006\030\006\030\006\031\006\"\006\"\006#\006&\006&\006'\006*\006-\006-\006.\0061\0064\0064\0065\0068\0068\0069\006<\006?\006@\006C\006F\006G\006J\006M\006M\006N\006O\006S\006X\006X\006Y\006\\\006_\006b\006e\006f\006j\006q\006u\006|\006\127\006\131\006\135\006\142\006\145\006\146\006\147\006\150\006\156\006\161\006\169\006\173\006\180\006\185\006\193\006\196\006\198\006\201\006\205\006\206\006\207\006\210\006\211\006\213\006\215\006\217\006\219\006\221\006\223\006\226\006\227\006\229\006\232\006\235\006\235\006\236\006\237\006\238"))
+    
+    and lr0_core =
+      (16, "\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\b\000\t\000\n\000\011\000\012\000\r\000\014\000\015\000\016\000\017\000\018\000\019\000\020\000\021\000\022\000\023\000\024\000\025\000\026\000\027\000\028\000\029\000\030\000\031\000 \000!\000\"\000#\000$\000%\000&\000'\000(\000)\000*\000+\000,\000-\000.\000/\0000\0001\0002\0003\0004\0005\0006\0007\0008\0009\000:\000;\000<\000=\000>\000?\000@\000A\000B\000C\000D\000E\000F\000G\000H\000I\000J\000K\000L\000M\000N\000O\000P\000Q\000R\000S\000T\000U\000V\000W\000X\000Y\000Z\000[\000\\\000]\000^\000_\000`\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000l\000m\000n\000o\000p\000q\000r\000s\000t\000u\000v\000w\000x\000y\000z\000{\000|\000}\000~\000\127\000\128\000\129\000\130\000\131\000\132\000\133\000\134\000\135\000\136\000\137\000\138\000\139\000\140\000\141\000\142\000\143\000\144\000\145\000\146\000\147\000\148\000\149\000\150\000\151\000\152\000\153\000\154\000\155\000\156\000\157\000\158\000\159\000\160\000\161\000\162\000\163\000\164\000\165\000\166\000\167\000\168\000\169\000\170\000\171\000\172\000\173\000\174\000\175\000\176\000\177\000\178\000\179\000\180\000\181\000\182\000\183\000\184\000\185\000\186\000\187\000\188\000\189\000\190\000\191\000\192\000\193\000\194\000\195\000\196\000\197\000\198\000\199\000\200\000\201\000\202\000\203\000\204\000\205\000\206\000\207\000\208\000\209\000\210\000\211\000\212\000\213\000\214\000\215\000\216\000\217\000\218\000\219\000\220\000\221\000\222\000\223\000\224\000\225\000\226\000\227\000\228\000\229\000\230\000\231\000\232\000\233\000\234\000\235\000\236\000\237\000\238\000\239\000\240\000\241\000\242\000\243\000\244\000\245\000\246\000\247\000\248\000\249\000\250\000\251\000\252\000\253\000\254\000\255\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\b\001\t\001\n\001\011\001\012\001\r\001\014\001\015\001\016\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001\024\001\025\001\026\001\027\001\028\001\029\001\030\001\031\001 \001!\001\"\001#\001$\001%\001&\001'\001(\001)\001*\001+\001,\001-\001.\001/\0010\0011\0012\0013\0014\0015\0016\0017\0018\0019\001:\001;\001<\001=\001>\001?\001@\001A\001B\001C\001D\001E\001F\001G\001H\001I\001J\001K\001L\001M\001N\001O\001P\001Q\001R\001S\001T\001U\001V\001W\001X\001Y\001Z\001[\001\\\001]\001^\001_\001`\001a\001b\001c\001d\001e\001f\001g\001h\001i\001j\001k\001l\001m\001n\001o\001p\001q\001r\001s\001t\001u\001v\001w\001x\001y\001z\001{\001|\001}\001~\001\127\001\128\001\129\001\130\001\131\001\132\001\133\001\134\001\135\001\136\001\137\001\138\001\139\001\140\001\141\001\142\001\143\001\144\001\145\001\146\001\147\001\148\001\149\001\150\001\151\001\152\001\153\001\154\001\155\001\156\001\157\001\158\001\159\001\160\001\161\001\162\001\163\001\164\001\165\001\166\001\167\001\168\001\169\001\170\001\171\001\172\001\173\001\174\001\175\001\176\001\177\001\178\001\179\001\180\001\181\001\182\001\183\001\184\001\185\001\186\001\187\001\188\001\189\001\190\001\191\001\192\001\193\001\194\001\195\001\196\001\197\001\198\001\199\001\200\001\201\001\202\001\203\001\204\001\205\001\206\001\207\001\208\001\209\001\210\001\211\001\212\001\213\001\214\001\215\001\216\001\217\001\218\001\219\001\220\001\221\001\222\001\223\001\224\001\225\001\226\001\227\001\228\001\229\001\230\001\231\001\232\001\233\001\234\001\235\001\236\001\237\001\238\001\239\001\240\001\241\001\242\001\243\001\244\001\245\001\246\001\247\001\248\001\249\001\250\001\251\001\252\001\253\001\254\001\255\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\b\002\t\002\n\002\011\002\012\002\r\002\014\002\015\002\016\002\017\002\018\002\019\002\020\002\021\002\022\002\023\002\024\002\025\002\026\002\027\002\028\002\029\002\030\002\031\002 \002!\002\"\002#\002$\002%\002&\002'\002(\002)\002*\002+\002,\002-\002.\002/\0020\0021\0022\0023\0024\0025\0026\0027\0028\0029\002:\002;\002<\002=\002>\002?\002@\002A\002B\002C\002D\002E\002F\002G\002H\002I\002J\002K\002L\002M\002N\002O\002P\002Q\002R\002S\002T\002U\002V\002W\002X\002Y\002Z\002[\002\\\002]\002^\002_\002`\002a\002b\002c\002d\002e\002f\002g\002h\002i\002j\002k\002l\002m\002n\002o\002p\002q\002r\002s\002t\002u\002v\002w\002x\002y\002z\002{\002|\002}\002~\002\127\002\128\002\129\002\130\002\131\002\132\002\133\002\134\002\135\002\136\002\137\002\138\002\139\002\140\002\141\002\142\002\143\002\144\002\145\002\146\002\147\002\148\002\149\002\150\002\151\002\152\002\153\002\154\002\155\002\156\002\157\002\158\002\159\002\160\002\161\002\162\002\163\002\164\002\165\002\166\002\167\002\168\002\169\002\170\002\171\002\172\002\177\002\178\002\185\002\186\002\193\002\194\002\187\002\188\002\189\002\190\002\191\002\192\002\231\002\232\002\233\002\234\002\235\002\236\002\237\002\238\002\239\002\240\002\241\002\242\002\243\002\244\002\245\002\246\002\247\002\248\002\249\002\250\002\251\002\252\002\253\002\254\002\255\003\000\003\001\003\002\003\003\002\173\002\174\003\004\003\005\003\006\003\007\002\175\002\176\002\179\002\180\002\197\002\198\002\225\002\226\002\203\002\204\002\205\002\206\002\221\002\222\003\b\003\t\003\n\003\011\003\012\003\r\002\181\002\182\003\014\003\015\002\183\002\184\003\016\003\017\003\018\003\019\003\020\003\021\003\022\003\023\003\024\003\025\003\026\003\027\002\195\002\196\002\199\002\200\002\201\002\202\002\213\002\214\002\229\002\230\002\207\002\208\002\209\002\210\002\215\002\216\002\217\002\218\002\219\002\220\002\227\002\228\003\028\003\029\003\030\003\031\003 \003!\003\"\003#\002\211\002\212\002\223\002\224\003$\003%\003&\003'\003(\003)\003*\003+\003,\003-\003.\003/\0030\0031\0032\0033\0034\0035\0036\0037\0038\0039\003:\003;\003<\003=\003>\003?\003@\003A\003B\003C\003D\003E\003F\003G\003H\003I\003J\003K\003L\003M\003N\003O\003P\003Q\003R\003S\003T\003U\003V\003W\003X\003Y\003Z\003[\003\\\003]\003^\003_\003`\003a\003b\003c\003d\003e\003f\003g\003h\003i\003j\003k\003l\003m\003n\003o\003p\003q\003r\003s\003t\003u\003v\003w\003x\003y\003z\003{\003|\003}\003~\003\127\003\128\003\129\003\130\003\131\003\132\003\133\003\134\003\135\003\136\003\137\003\138\003\139\003\140\003\141\003\142\003\143\003\144\003\145\003\146\003\147\003\148\003\149\003\150\003\151\003\152\003\153\003\154\003\155\003\156\003\157\003\158\003\159\003\160\003\161\003\162\003\163\003\164\003\165\003\166\003\167\003\168\003\169\003\170\003\171\003\172\003\173\003\174\003\175\003\176\003\177\003\178\003\179\003\180\003\181\003\182\003\183\003\184\003\185\003\186\003\187\003\188\003\189\003\190\003\191\003\192\003\193\003\194\003\195\003\196\003\197\003\198\003\199\003\200\003\201\003\202\003\203\003\204\003\205\003\206\003\207\003\208\003\209\003\210\003\211\003\212\003\213\003\214\003\215\003\216\003\217\003\218\003\219\003\220\003\221\003\222\003\223\003\224\003\225\003\226\003\227\003\228\003\229\003\230\003\231\003\232\003\233\003\234\003\235\003\236\003\237\003\238\003\239\003\240\003\241\003\242\003\243\003\244\003\245\003\246\003\247\003\248\003\249\003\250\003\251\003\252\003\253\003\254\003\255\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\b\004\t\004\n\004\011\004\012\004\r\004\014\004\015\004\016\004\017\004\018\004\019\004\020\004\021\004\022\004\023\004\024\004\025\004\026\004\027\004\028\004\029\004\030\004\031\004 \004!\004\"\004#\004$\004%\004&\004'\004(\004)\004*\004+\004,\004-\004.\004/\0040\0041\0042\0043\0044\0045\0046\0047\0048\0049\004:\004;\004<\004=\004>\004?\004@\004A\004B\004C\004D\004E\004F\004G\004H\004I\004J\004K\004L\004M\004N\004O\004P\004Q\004R\004S\004T\004U\004V\004W\004X\004Y\004Z\004[\004\\\004]\004^\004_\004`\004a\004b\004c\004d\004e\004f\004g\004h\004i\004j\004k\004l\004m\004n\004o\004p\004q\004r\004s\004t\004u\004v\004w\004x\004y\004z\004{\004|\004}\004~\004\127\004\128\004\129\004\130\004\131\004\132\004\133\004\134\004\135\004\136\004\137\004\138\004\139\004\140\004\141\004\142\004\143\004\144\004\145\004\146\004\147\004\148\004\149\004\150\004\151\004\152\004\153\004\154\004\155\004\156\004\157\004\158\004\159\004\160\004\161\004\162\004\163\004\164\004\165\004\166\004\167\004\168\004\169\004\170\004\171\004\172\004\173\004\174\004\175\004\176\004\177\004\178\004\179\004\180\004\181\004\182\004\183\004\184\004\185\004\186\004\187\004\188\004\189\004\190\004\191\004\192\004\193\004\194\004\195\004\196\004\197\004\198\004\199\004\200\004\201\004\202\004\203\004\204\004\205\004\206\004\207\004\208\004\209\004\210\004\211\004\212\004\213\004\214\004\215\004\216\004\217\004\218\004\219\004\220\004\221\004\222\004\223\004\224\004\225\004\226\004\227\004\228\004\229\004\230\004\231\004\232\004\233\004\234\004\235\004\236\004\237\004\238\004\239\004\240\004\241\004\242\004\243\004\244\004\245\004\246\004\247\004\248\004\249\004\250\004\251\004\252\004\253\004\254\004\255\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\b\005\t\005\n\005\011\005\012\005\r")
+    
+    and lr0_items =
+      ((32, "\000\000\000\000\000\005\184\001\000\005d\001\000\005\240\001\000\005\136\001\000\005t\001\000\005|\001\000\005\252\001\000\006\024\001\000\005\128\001\000\005\132\001\000\005x\001\000\006\024\002\000\006\020\001\000\006\020\002\000\006\012\001\000\005\228\001\000\005\220\001\000\005\216\001\000\000\016\001\000\007\172\001\000\007\168\001\000\005\168\001\000\005\172\001\000\005\172\002\000\007\172\002\000\007\168\002\000\b\000\001\000\007\192\001\000\007\180\001\000\007\176\001\000\007\180\002\000\007p\001\000\007l\001\000\007l\002\000\007\224\001\000\007\224\002\000\007\236\001\000\007\216\001\000\007\136\001\000\007\136\002\000\007\136\003\000\007\244\001\000\007\244\002\000\007\164\001\000\006\236\001\000\006\232\001\000\006\236\002\000\006\236\003\000\007\164\002\000\007\164\003\000\b\b\001\000\b\004\001\000\007\216\001\000\007\128\001\000\007|\001\000\007\128\002\000\007|\002\000\007\128\003\000\007\128\004\000\007\128\005\000\007\128\006\000\007\204\001\000\007\200\001\000\007\204\002\000\006\028\001\000\007\188\001\000\007\184\001\000\007\188\002\000\007\184\002\000\007\188\003\000\007\188\004\000\007\188\005\000\007\212\001\000\007\188\006\000\007\188\007\000\007\232\001\000\007\228\001\000\007\240\001\000\007\240\002\000\007\220\001\000\007\228\002\000\007\208\001\000\007\252\001\000\007\196\001\000\006 \001\000\007h\001\000\007\220\001\000\007\160\001\000\007\160\002\000\007\156\001\000\007\160\003\000\007\\\001\000\007d\001\000\007`\001\000\006\224\001\000\006\220\001\000\007d\002\000\007d\003\000\007d\001\000\007`\001\000\007`\002\000\007d\001\000\007`\003\000\007`\001\000\006\224\002\000\006\224\003\000\007h\002\000\007h\003\000\006 \002\000\006 \003\000\005\180\001\000\007\196\002\000\007\232\002\000\007\188\b\000\007\184\003\000\007\184\004\000\007\184\005\000\007\204\003\000\007d\001\000\007`\001\000\007\204\004\000\007\200\002\000\007d\001\000\007`\001\000\007\200\003\000\007\128\007\000\007d\001\000\007`\001\000\007|\003\000\007|\004\000\007d\001\000\007`\001\000\007\144\001\000\007\140\001\000\007\132\001\000\007\144\002\000\007\144\003\000\007\144\004\000\007\144\005\000\007\144\006\000\007\144\007\000\007d\001\000\007`\001\000\007\132\002\000\007\132\003\000\007d\001\000\007`\001\000\007\140\002\000\007\140\003\000\007\140\004\000\007d\001\000\007`\001\000\b\004\002\000\007\248\001\000\b\004\003\000\007\248\002\000\007\248\003\000\007@\001\000\007<\001\000\0078\001\000\007@\002\000\007\248\001\000\007(\001\000\007$\001\000\007 \001\000\007(\002\000\007(\003\000\007$\002\000\007$\003\000\007@\003\000\007<\002\000\007<\003\000\007\012\001\000\007\b\001\000\007\004\001\000\007\012\002\000\007\012\003\000\007\b\002\000\007\b\003\000\b\b\002\000\b\b\003\000\007\216\002\000\007\216\003\000\007\164\004\000\007\164\005\000\007\164\006\000\007\136\004\000\007d\001\000\007`\001\000\007\236\002\000\007l\003\000\007d\001\000\007`\001\000\007\180\003\000\007\180\004\000\007\180\005\000\007\180\006\000\007\180\007\000\007\176\002\000\007\176\003\000\007\176\004\000\007\148\001\000\006\028\001\000\007\148\002\000\007\148\003\000\007d\001\000\007`\001\000\007\024\001\000\007\020\001\000\007\024\002\000\007\152\001\000\007d\001\000\007`\001\000\007\024\003\000\007\192\002\000\007\192\003\000\b\000\002\000\007\172\003\000\007\172\004\000\007\172\005\000\007\172\006\000\007\172\007\000\007\172\b\000\007\168\003\000\007\168\004\000\007\168\005\000\007d\001\000\007`\001\000\000\016\002\000\005\220\002\000\005\216\002\000\005\220\003\000\005\244\001\000\006\b\001\000\006\004\001\000\006\b\002\000\006\004\002\000\005\224\001\000\006\b\003\000\005\248\001\000\006\016\001\000\006\016\002\000\005\204\001\000\006\000\001\000\005\212\001\000\005\208\001\000\005\200\001\000\005\208\002\000\005\212\001\000\005\208\003\000\005\208\001\000\005\212\002\000\007d\001\000\007`\001\000\005\212\003\000\005\220\004\000\005\228\002\000\005\228\003\000\006\196\001\000\006\192\001\000\006\188\001\000\006\196\002\000\006\196\003\000\006\192\002\000\006\192\003\000\006\012\002\000\005\252\002\000\005\252\003\000\006\180\001\000\006\176\001\000\005\212\001\000\005\208\001\000\006\180\002\000\006\180\003\000\005d\002\000\005\152\001\000\005d\003\000\005d\004\000\005h\001\000\005\184\002\000\005\184\003\000\006\168\001\000\006\164\001\000\006\160\001\000\006\168\002\000\006\168\003\000\006\164\002\000\006\164\003\000\000\000\001\000\000\004\000\000\005\188\001\000\005\188\002\000\0058\001\000\005D\001\000\004\132\001\000\005T\001\000\005T\002\000\004\028\001\000\004\128\001\000\004\128\002\000\004\152\001\000\001\172\001\000\001\172\002\000\001\172\003\000\001\172\004\000\000P\001\000\000L\001\000\000P\002\000\000L\002\000\000P\003\000\000P\004\000\000P\005\000\000P\006\000\007d\001\000\007`\001\000\000P\007\000\000L\003\000\007d\001\000\007`\001\000\000L\004\000\004\016\001\000\004\252\001\000\0054\001\000\005,\001\000\005<\001\000\005L\001\000\005@\001\000\004\224\001\000\004\152\001\000\004\020\001\000\005\b\001\000\004\144\001\000\004\140\001\000\004\136\001\000\002\188\001\000\002\180\001\000\002\188\002\000\002\180\002\000\002\188\003\000\002\180\003\000\002\188\004\000\004\024\001\000\004|\001\000\004t\001\000\004\148\001\000\004x\001\000\005\140\001\000\004\024\002\000\004\024\003\000\000 \001\000\000 \002\000\003X\001\000\003X\002\000\004p\001\000\003L\001\000\005\024\001\000\005\024\002\000\001(\001\000\001$\001\000\001 \001\000\001\028\001\000\001\024\001\000\001\020\001\000\001\016\001\000\001\012\001\000\001\b\001\000\001\004\001\000\001\000\001\000\000\252\001\000\000\248\001\000\000\244\001\000\000\240\001\000\000\236\001\000\000\136\001\000\000\132\001\000\000\128\001\000\000|\001\000\001(\002\000\001$\002\000\001 \002\000\001\028\002\000\001\024\002\000\001\020\002\000\001\016\002\000\001\012\002\000\001\b\002\000\001\004\002\000\001\000\002\000\000\252\002\000\000\248\002\000\000\244\002\000\000\240\002\000\000\236\002\000\000\136\002\000\000\132\002\000\000\128\002\000\000|\002\000\005\232\001\000\001(\003\000\001$\003\000\001 \003\000\001\028\003\000\001\024\003\000\001\020\003\000\001\016\003\000\001\012\003\000\001\b\003\000\001\004\003\000\001\000\003\000\000\252\003\000\000\248\003\000\000\244\003\000\000\240\003\000\000\236\003\000\000\136\003\000\000\132\003\000\000\128\003\000\000|\003\000\001\b\004\000\001\004\004\000\001\000\004\000\000\252\004\000\001\b\005\000\001\004\005\000\001\000\005\000\000\252\005\000\001\b\006\000\001\b\007\000\001\b\b\000\001\b\t\000\001\b\n\000\005\144\001\000\b\024\001\000\b\020\001\000\b\016\001\000\000D\001\000\007L\001\000\007H\001\000\000D\002\000\003\224\001\000\003\220\001\000\001h\001\000\001d\001\000\001`\001\000\001\\\001\000\001X\001\000\001T\001\000\001P\001\000\001L\001\000\001H\001\000\001D\001\000\001@\001\000\001<\001\000\0018\001\000\0014\001\000\0010\001\000\001,\001\000\000\152\001\000\000\148\001\000\000\144\001\000\000\140\001\000\001h\002\000\001d\002\000\001`\002\000\001\\\002\000\001X\002\000\001T\002\000\001P\002\000\001L\002\000\001H\002\000\001D\002\000\001@\002\000\001<\002\000\0018\002\000\0014\002\000\0010\002\000\001,\002\000\000\152\002\000\000\148\002\000\000\144\002\000\000\140\002\000\001H\003\000\001D\003\000\001@\003\000\001<\003\000\001H\004\000\001D\004\000\001@\004\000\001<\004\000\001H\005\000\001H\006\000\001H\007\000\001H\b\000\001H\t\000\000,\001\000\000(\001\000\000(\002\000\000(\003\000\000,\002\000\0000\001\000\001H\n\000\005\244\001\000\001@\005\000\001<\005\000\001@\006\000\001@\007\000\001@\b\000\001@\t\000\001@\n\000\001@\011\000\001<\006\000\001<\007\000\001<\b\000\001D\005\000\001D\006\000\001D\007\000\001h\003\000\001d\003\000\001`\003\000\001\\\003\000\001h\004\000\001d\004\000\001`\004\000\001\\\004\000\001h\005\000\001h\006\000\001h\007\000\001h\b\000\001h\t\000\001h\n\000\005\244\001\000\001`\005\000\001\\\005\000\001`\006\000\001`\007\000\001`\b\000\001`\t\000\001`\n\000\001`\011\000\001\\\006\000\001\\\007\000\001\\\b\000\001d\005\000\001d\006\000\001d\007\000\000\152\003\000\000\148\003\000\000\144\003\000\000\140\003\000\000\152\004\000\000\152\005\000\000\152\006\000\000\152\007\000\000\152\b\000\000\028\001\000\004L\001\000\003P\001\000\003T\001\000\003T\002\000\003T\003\000\003T\004\000\003T\005\000\0068\001\000\0064\001\000\0060\001\000\0068\002\000\0068\003\000\0064\002\000\0064\003\000\004\248\001\000\004\200\001\000\004\196\001\000\004\200\002\000\000\200\001\000\000\196\001\000\000\192\001\000\000\188\001\000\000X\001\000\000T\001\000\000T\002\000\000T\003\000\000T\004\000\000\200\002\000\000\196\002\000\000\192\002\000\000\188\002\000\000\200\003\000\000\200\004\000\000\200\005\000\000\200\006\000\000\200\007\000\000\200\b\000\005\244\001\000\000\192\003\000\000\188\003\000\000\192\004\000\000\192\005\000\000\192\006\000\000\192\007\000\000\192\b\000\000\192\t\000\000\188\004\000\000\188\005\000\000\188\006\000\000\196\003\000\000\196\004\000\000\196\005\000\000X\002\000\000X\003\000\000\232\001\000\000\228\001\000\000\224\001\000\000\220\001\000\000h\001\000\000d\001\000\000d\002\000\000d\003\000\000d\004\000\000\232\002\000\000\228\002\000\000\224\002\000\000\220\002\000\000\232\003\000\000\232\004\000\000\232\005\000\000\232\006\000\000\232\007\000\000\232\b\000\005\244\001\000\000\224\003\000\000\220\003\000\000\224\004\000\000\224\005\000\000\224\006\000\000\224\007\000\000\224\b\000\000\224\t\000\000\220\004\000\000\220\005\000\000\220\006\000\000\228\003\000\000\228\004\000\000\228\005\000\000h\002\000\000h\003\000\004$\001\000\004 \001\000\003\028\001\000\003\024\001\000\000H\001\000\000H\002\000\000H\003\000\003\248\001\000\003\248\002\000\003\248\003\000\004\240\001\000\005(\001\000\005$\001\000\005(\002\000\005$\002\000\005(\003\000\005X\001\000\005P\001\000\0050\001\000\005H\001\000\005H\002\000\0050\002\000\005 \001\000\004\220\001\000\004\216\001\000\004\212\001\000\004\208\001\000\004\204\001\000\005p\001\000\005p\002\000\005p\003\000\004\204\002\000\004,\001\000\004l\001\000\004l\002\000\005\000\001\000\005\000\002\000\004\192\001\000\003\136\001\000\005\016\001\000\005\016\002\000\005\004\001\000\005\004\002\000\004\188\001\000\004\152\001\000\004\188\002\000\004\164\001\000\004\160\001\000\004\164\002\000\004\012\001\000\004\b\001\000\004\012\002\000\004\b\002\000\003`\001\000\003\\\001\000\0034\001\000\0034\002\000\0034\003\000\003h\001\000\003H\001\000\003D\001\000\003H\002\000\003D\002\000\004h\001\000\004\236\001\000\004\232\001\000\004\236\002\000\004\232\002\000\004\236\003\000\000x\001\000\000t\001\000\000p\001\000\000l\001\000\000x\002\000\000x\003\000\000x\004\000\000x\005\000\000x\006\000\005\\\001\000\004(\001\000\004(\002\000\004(\003\000\004(\004\000\0044\001\000\0040\001\000\0044\002\000\0044\003\000\0040\002\000\004\004\001\000\005\028\001\000\005\028\002\000\003d\001\000\003d\002\000\003d\003\000\003d\004\000\004\000\001\000\004\000\002\000\001\168\001\000\001\164\001\000\001\160\001\000\001\156\001\000\001\152\001\000\001\148\001\000\001\144\001\000\001\140\001\000\001\136\001\000\001\132\001\000\001\128\001\000\001|\001\000\001x\001\000\001t\001\000\001p\001\000\001l\001\000\000\168\001\000\000\164\001\000\000\160\001\000\000\156\001\000\001\168\002\000\001\164\002\000\001\160\002\000\001\156\002\000\001\152\002\000\001\148\002\000\001\144\002\000\001\140\002\000\001\136\002\000\001\132\002\000\001\128\002\000\001|\002\000\001x\002\000\001t\002\000\001p\002\000\001l\002\000\000\168\002\000\000\164\002\000\000\160\002\000\000\156\002\000\001\168\003\000\001\164\003\000\001\160\003\000\001\156\003\000\001\152\003\000\001\148\003\000\001\144\003\000\001\140\003\000\001\136\003\000\001\132\003\000\001\128\003\000\001|\003\000\001x\003\000\001t\003\000\001p\003\000\001l\003\000\000\168\003\000\000\164\003\000\000\160\003\000\000\156\003\000\001\136\004\000\001\132\004\000\001\128\004\000\001|\004\000\001\136\005\000\001\132\005\000\001\128\005\000\001|\005\000\001\136\006\000\001\136\007\000\001\136\b\000\001\136\t\000\001\136\n\000\001\136\011\000\005\244\001\000\001\128\006\000\001|\006\000\001\128\007\000\001\128\b\000\001\128\t\000\001\128\n\000\001\128\011\000\001\128\012\000\001|\007\000\001|\b\000\001|\t\000\001\132\006\000\001\132\007\000\001\132\b\000\001\168\004\000\001\164\004\000\001\160\004\000\001\156\004\000\001\168\005\000\001\164\005\000\001\160\005\000\001\156\005\000\001\168\006\000\001\168\007\000\001\168\b\000\001\168\t\000\001\168\n\000\001\168\011\000\005\244\001\000\001\160\006\000\001\156\006\000\001\160\007\000\001\160\b\000\001\160\t\000\001\160\n\000\001\160\011\000\001\160\012\000\001\156\007\000\001\156\b\000\001\156\t\000\001\164\006\000\001\164\007\000\001\164\b\000\000\168\004\000\000\164\004\000\000\160\004\000\000\156\004\000\000\168\005\000\000\168\006\000\000\168\007\000\000\168\b\000\000\168\t\000\000\168\n\000\005`\001\000\005\244\001\000\000\160\005\000\000\156\005\000\000\160\006\000\000\160\007\000\000\160\b\000\000\160\t\000\000\160\n\000\000\160\011\000\000\156\006\000\000\156\007\000\000\156\b\000\000\164\005\000\000\164\006\000\000\164\007\000\001x\004\000\001t\004\000\001p\004\000\001l\004\000\001x\005\000\001x\006\000\001x\007\000\001x\b\000\001x\t\000\001x\n\000\005\244\001\000\001p\005\000\001l\005\000\001p\006\000\001p\007\000\001p\b\000\001p\t\000\001p\n\000\001p\011\000\001l\006\000\001l\007\000\001l\b\000\001t\005\000\001t\006\000\001t\007\000\001\152\004\000\001\148\004\000\001\144\004\000\001\140\004\000\001\152\005\000\001\148\005\000\001\144\005\000\001\140\005\000\001\152\006\000\001\152\007\000\001\152\b\000\001\152\t\000\001\152\n\000\001\152\011\000\005\244\001\000\001\144\006\000\001\140\006\000\001\144\007\000\001\144\b\000\001\144\t\000\001\144\n\000\001\144\011\000\001\144\012\000\001\140\007\000\001\140\b\000\001\140\t\000\001\148\006\000\001\148\007\000\001\148\b\000\000\184\001\000\000\180\001\000\000\176\001\000\000\172\001\000\000\184\002\000\000\184\003\000\000\184\004\000\000\184\005\000\000\184\006\000\000\184\007\000\005\244\001\000\000\176\002\000\000\172\002\000\000\176\003\000\000\176\004\000\000\176\005\000\000\176\006\000\000\176\007\000\000\176\b\000\000\172\003\000\000\172\004\000\000\172\005\000\000\180\002\000\000\180\003\000\000\180\004\000\003\252\001\000\003\252\002\000\003\252\003\000\005\160\001\000\003\240\001\000\003p\001\000\003l\001\000\003p\002\000\003p\003\000\003l\002\000\000\024\001\000\005\020\001\000\005\020\002\000\003@\001\000\003<\001\000\003<\002\000\0038\001\000\0038\002\000\0038\003\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\132\001\000\003\128\001\000\003|\001\000\003x\001\000\003t\001\000\0030\001\000\003\132\002\000\003\128\002\000\003|\002\000\003x\002\000\003t\002\000\003t\003\000\004\244\001\000\004\244\002\000\005\012\001\000\000\216\001\000\000\212\001\000\000\208\001\000\000\204\001\000\000`\001\000\000\\\001\000\000\\\002\000\000\\\003\000\000\\\004\000\000\216\002\000\000\212\002\000\000\208\002\000\000\204\002\000\000\216\003\000\000\216\004\000\000\216\005\000\000\216\006\000\000\216\007\000\000\216\b\000\005\244\001\000\000\208\003\000\000\204\003\000\000\208\004\000\000\208\005\000\000\208\006\000\000\208\007\000\000\208\b\000\000\208\t\000\000\204\004\000\000\204\005\000\000\204\006\000\000\212\003\000\000\212\004\000\000\212\005\000\000`\002\000\000`\003\000\005\012\002\000\001\192\001\000\004\228\001\000\004\184\001\000\004\180\001\000\004\176\001\000\004\172\001\000\004\168\001\000\004\168\002\000\003\236\001\000\004d\001\000\004\156\001\000\001\176\001\000\004P\001\000\003\236\002\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\216\001\000\002\212\001\000\002\208\001\000\002\204\001\000\002\200\001\000\0024\001\000\0020\001\000\002,\001\000\002(\001\000\002$\001\000\002 \001\000\002\028\001\000\002\024\001\000\002\020\001\000\002\016\001\000\002\012\001\000\002\b\001\000\002\004\001\000\002\000\001\000\001\252\001\000\001\248\001\000\001\244\001\000\001\240\001\000\001\236\001\000\001\232\001\000\001\228\001\000\001\224\001\000\001\220\001\000\001\216\001\000\001\212\001\000\001\208\001\000\001\204\001\000\001\200\001\000\001\196\001\000\001\244\002\000\0028\001\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\244\003\000\002l\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\003\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002X\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\003\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002`\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\003\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\\\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\003\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002T\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\003\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002@\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\003\000\002@\001\000\002<\001\000\002t\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\003\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002p\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\003\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002|\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\003\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002x\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\003\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002P\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\003\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\168\002\000\002\172\001\000\002\168\003\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002h\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\003\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\160\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\003\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\136\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\003\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002D\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\003\000\002D\001\000\002@\001\000\002<\001\000\002L\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\003\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\140\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\003\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\144\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\003\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\172\002\000\002\172\003\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\128\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\003\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\148\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\003\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\152\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\003\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\132\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\003\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002H\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\003\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\164\002\000\002\164\003\000\002d\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\003\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\156\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\003\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002<\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\003\000\002<\001\000\003\000\002\000\003\232\001\000\003\232\002\000\002\196\001\000\001\180\001\000\004T\001\000\002\192\001\000\004`\001\000\003\228\001\000\003\228\002\000\004H\001\000\004D\001\000\004@\001\000\004<\001\000\0048\001\000\003\244\001\000\004H\002\000\004D\002\000\004@\002\000\004<\002\000\0048\002\000\0048\003\000\0048\004\000\004D\003\000\004D\004\000\004H\003\000\004H\004\000\004H\005\000\004H\006\000\004<\003\000\004<\004\000\004@\003\000\004@\004\000\003\244\002\000\005H\001\000\000\216\001\000\000\212\001\000\000\208\001\000\000\204\001\000\000`\001\000\000\\\001\000\001\184\001\000\004X\001\000\003\216\001\000\003\212\001\000\003\208\001\000\003\204\001\000\003\200\001\000\003\196\001\000\003\192\001\000\003\188\001\000\003\184\001\000\003\180\001\000\003\176\001\000\003\172\001\000\003\168\001\000\003\164\001\000\003\160\001\000\003\156\001\000\003\152\001\000\003\148\001\000\003\144\001\000\003\140\001\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\003\196\002\000\003\196\003\000\001\188\001\000\004\\\001\000\003\176\002\000\003\176\003\000\003\184\002\000\003\184\003\000\003\180\002\000\003\180\003\000\003\172\002\000\003\172\003\000\003\204\002\000\003\204\003\000\003\200\002\000\003\200\003\000\003\212\002\000\003\212\003\000\003\208\002\000\003\208\003\000\003\168\002\000\003\168\003\000\003\148\002\000\003\148\003\000\003\192\002\000\003\192\003\000\003\156\002\000\003\156\003\000\003\164\002\000\003\164\003\000\003\152\002\000\003\152\003\000\003\160\002\000\003\160\003\000\003\216\002\000\003\216\003\000\003\144\002\000\003\144\003\000\003\188\002\000\003\188\003\000\003\000\003\000\001\224\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\224\003\000\002\236\002\000\002\236\003\000\001\232\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\232\003\000\002\244\002\000\002\244\003\000\001\228\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\228\003\000\002\240\002\000\002\240\003\000\001\220\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\220\003\000\002\232\002\000\002\232\003\000\001\200\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\200\003\000\001\252\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\252\003\000\003\b\002\000\003\b\003\000\001\248\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\248\003\000\003\004\002\000\003\004\003\000\002\004\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\004\003\000\003\016\002\000\003\016\003\000\002\000\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\000\003\000\003\012\002\000\003\012\003\000\001\216\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\216\003\000\002\228\002\000\002\228\003\000\002\208\002\000\002\208\003\000\0020\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\0020\003\000\001\240\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\240\003\000\002\252\002\000\002\252\003\000\002(\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002(\003\000\002\016\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\016\003\000\001\204\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\204\003\000\002\216\002\000\002\216\003\000\001\212\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\212\003\000\002\224\002\000\002\224\003\000\002\212\002\000\002\212\003\000\002\020\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\020\003\000\002\024\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\024\003\000\0024\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\0024\003\000\002\b\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\b\003\000\002\028\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\028\003\000\002 \002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002 \003\000\002\012\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002\012\003\000\001\208\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\208\003\000\002\220\002\000\002\220\003\000\002,\002\000\002,\003\000\003\020\002\000\003\020\003\000\002\204\002\000\002\204\003\000\001\236\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\236\003\000\002\248\002\000\002\248\003\000\002$\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\002$\003\000\001\196\002\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002`\001\000\002\\\001\000\002X\001\000\002T\001\000\002P\001\000\002L\001\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\001\196\003\000\004\168\003\000\004\168\004\000\004\172\002\000\004\176\002\000\004\176\003\000\004\184\002\000\004\180\002\000\004\180\003\000\003t\004\000\003\128\003\000\003\128\004\000\003\132\003\000\003\132\004\000\003\132\005\000\003\132\006\000\003x\003\000\003x\004\000\003|\003\000\003|\004\000\0030\002\000\003 \002\000\003$\002\000\003(\002\000\003,\002\000\003@\002\000\003\240\002\000\003d\005\000\003d\006\000\003d\007\000\004\004\002\000\004(\005\000\004(\006\000\004(\007\000\005\\\002\000\000x\007\000\005\244\001\000\000p\002\000\000l\002\000\000p\003\000\000p\004\000\000p\005\000\000p\006\000\000p\007\000\000p\b\000\000l\003\000\000l\004\000\000l\005\000\000t\002\000\000t\003\000\000t\004\000\003H\003\000\003D\003\000\003H\004\000\003H\005\000\003h\002\000\0034\004\000\003`\002\000\003\\\002\000\003`\003\000\003`\004\000\004\012\003\000\004\b\003\000\004\012\004\000\004\012\005\000\004\164\003\000\004\164\004\000\006\140\001\000\006\136\001\000\006\140\002\000\006\140\003\000\004\160\002\000\004\160\003\000\004\188\003\000\004\184\001\000\004\180\001\000\004\176\001\000\004\172\001\000\004\168\001\000\004\188\004\000\004\176\002\000\004\188\005\000\004\176\003\000\004\188\006\000\004\152\002\000\004\152\003\000\006p\001\000\006l\001\000\006p\002\000\006p\003\000\003\136\002\000\004,\002\000\004\204\003\000\004\204\004\000\004\208\002\000\004\212\002\000\004\212\003\000\004\220\002\000\004\216\002\000\004\216\003\000\005P\002\000\005X\002\000\004\240\002\000\003\248\004\000\000H\004\000\003\028\002\000\004$\002\000\004 \002\000\004$\003\000\004$\004\000\004\200\003\000\004\200\004\000\004\196\002\000\004\196\003\000\004\248\002\000\003P\002\000\004L\002\000\000H\001\000\000@\001\000\000H\002\000\000@\002\000\000H\003\000\000@\003\000\000H\004\000\000@\004\000\000@\005\000\000@\006\000\000\028\002\000\000\028\003\000\000<\001\000\0004\001\000\0008\001\000\006T\001\000\006P\001\000\006L\001\000\006T\002\000\006T\003\000\006P\002\000\006P\003\000\000\152\t\000\005\244\001\000\000\144\004\000\000\140\004\000\000\144\005\000\000\144\006\000\000\144\007\000\000\144\b\000\000\144\t\000\000\144\n\000\000\140\005\000\000\140\006\000\000\140\007\000\000\148\004\000\000\148\005\000\000\148\006\000\0018\003\000\0014\003\000\0010\003\000\001,\003\000\0018\004\000\0018\005\000\0018\006\000\0018\007\000\0018\b\000\0018\t\000\005\244\001\000\0010\004\000\001,\004\000\0010\005\000\0010\006\000\0010\007\000\0010\b\000\0010\t\000\0010\n\000\001,\005\000\001,\006\000\001,\007\000\0014\004\000\0014\005\000\0014\006\000\001X\003\000\001T\003\000\001P\003\000\001L\003\000\001X\004\000\001T\004\000\001P\004\000\001L\004\000\001X\005\000\001X\006\000\001X\007\000\001X\b\000\001X\t\000\001X\n\000\005\244\001\000\001P\005\000\001L\005\000\001P\006\000\001P\007\000\001P\b\000\001P\t\000\001P\n\000\001P\011\000\001L\006\000\001L\007\000\001L\b\000\001T\005\000\001T\006\000\001T\007\000\003\224\002\000\000D\003\000\005\144\002\000\005\144\003\000\006d\001\000\006`\001\000\006\\\001\000\006d\002\000\006d\003\000\006`\002\000\006`\003\000\001\b\011\000\005\244\001\000\001\000\006\000\000\252\006\000\001\000\007\000\001\000\b\000\001\000\t\000\001\000\n\000\001\000\011\000\001\000\012\000\000\252\007\000\000\252\b\000\000\252\t\000\001\004\006\000\001\004\007\000\001\004\b\000\001(\004\000\001$\004\000\001 \004\000\001\028\004\000\001(\005\000\001$\005\000\001 \005\000\001\028\005\000\001(\006\000\001(\007\000\001(\b\000\001(\t\000\001(\n\000\001(\011\000\005\244\001\000\001 \006\000\001\028\006\000\001 \007\000\001 \b\000\001 \t\000\001 \n\000\001 \011\000\001 \012\000\001\028\007\000\001\028\b\000\001\028\t\000\001$\006\000\001$\007\000\001$\b\000\000\136\004\000\000\132\004\000\000\128\004\000\000|\004\000\000\136\005\000\000\136\006\000\000\136\007\000\000\136\b\000\000\136\t\000\000\136\n\000\005\244\001\000\000\128\005\000\000|\005\000\000\128\006\000\000\128\007\000\000\128\b\000\000\128\t\000\000\128\n\000\000\128\011\000\000|\006\000\000|\007\000\000|\b\000\000\132\005\000\000\132\006\000\000\132\007\000\000\248\004\000\000\244\004\000\000\240\004\000\000\236\004\000\000\248\005\000\000\248\006\000\000\248\007\000\000\248\b\000\000\248\t\000\000\248\n\000\005\244\001\000\000\240\005\000\000\236\005\000\000\240\006\000\000\240\007\000\000\240\b\000\000\240\t\000\000\240\n\000\000\240\011\000\000\236\006\000\000\236\007\000\000\236\b\000\000\244\005\000\000\244\006\000\000\244\007\000\001\024\004\000\001\020\004\000\001\016\004\000\001\012\004\000\001\024\005\000\001\020\005\000\001\016\005\000\001\012\005\000\001\024\006\000\001\024\007\000\001\024\b\000\001\024\t\000\001\024\n\000\001\024\011\000\005\244\001\000\001\016\006\000\001\012\006\000\001\016\007\000\001\016\b\000\001\016\t\000\001\016\n\000\001\016\011\000\001\016\012\000\001\012\007\000\001\012\b\000\001\012\t\000\001\020\006\000\001\020\007\000\001\020\b\000\005\024\003\000\005\024\004\000\003L\002\000\000$\001\000\000$\002\000\000$\003\000\003L\003\000\003X\003\000\000 \003\000\004\024\004\000\004\024\005\000\002\188\005\000\004|\001\000\002\184\001\000\002\176\001\000\002\184\002\000\002\176\002\000\002\184\003\000\002\184\004\000\004\136\002\000\004\136\003\000\004\144\002\000\004\144\003\000\002\184\001\000\002\176\001\000\004\144\004\000\004\144\005\000\0074\001\000\0070\001\000\007,\001\000\0074\002\000\0074\003\000\006\128\001\000\006|\001\000\006x\001\000\006\128\002\000\006\128\003\000\006|\002\000\006|\003\000\0070\002\000\0070\003\000\006(\001\000\006$\001\000\004\220\001\000\004\216\001\000\004\212\001\000\004\208\001\000\004\204\001\000\004\140\002\000\006(\002\000\004\140\003\000\006(\003\000\004\140\004\000\004\140\005\000\006(\001\000\006$\001\000\004\220\001\000\004\216\001\000\004\212\001\000\004\208\001\000\004\204\001\000\006(\002\000\006(\003\000\005\b\002\000\004\020\002\000\004\224\002\000\004\224\003\000\004\220\001\000\004\216\001\000\004\212\001\000\004\208\001\000\004\204\001\000\004\224\004\000\004\212\002\000\004\224\005\000\004\212\003\000\004\224\006\000\005@\002\000\005L\002\000\005<\002\000\005,\002\000\0054\002\000\004\252\002\000\004\016\002\000\004\016\003\000\001\172\005\000\004\028\002\000\004\028\003\000\005T\003\000\005T\004\000\005D\002\000\0058\002\000\005\188\003\000\005\188\004\000\000\004\001\000\000\b\000\000\005\192\001\000\005\192\002\000\005\192\003\000\005\192\004\000\006D\001\000\006@\001\000\006D\002\000\006D\003\000\006\152\001\000\006\148\001\000\006\152\002\000\006\152\003\000\000\b\001\000\000\012\000\000\005\196\001\000\007x\001\000\007t\001\000\007x\002\000\007t\002\000\007x\003\000\007x\004\000\007x\005\000\007x\006\000\007x\007\000\007d\001\000\007`\001\000\007t\003\000\007t\004\000\007d\001\000\007`\001\000\006\252\001\000\006\248\001\000\006\244\001\000\006\252\002\000\006\252\003\000\006\248\002\000\006\248\003\000\005\196\002\000\005\196\003\000\005\196\004\000\007T\001\000\007P\001\000\007T\002\000\007T\003\000\007T\004\000\007d\001\000\007`\001\000\007T\005\000\007P\002\000\007P\003\000\007d\001\000\007`\001\000\007P\004\000\006\212\001\000\006\208\001\000\006\204\001\000\006\212\002\000\006\212\003\000\006\208\002\000\006\208\003\000\005\196\005\000\005\196\006\000\000\012\001"), (16, "\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\b\000\t\000\n\000\011\000\012\000\r\000\014\000\015\000\016\000\017\000\019\000\020\000\022\000\023\000\024\000\025\000\027\000\028\000\029\000\031\000 \000\"\000#\000$\000%\000&\000'\000(\000)\000*\000+\000,\000-\000/\0000\0001\0002\0003\0006\0008\000:\000;\000<\000=\000>\000@\000A\000B\000D\000F\000G\000H\000I\000J\000K\000L\000M\000N\000O\000P\000Q\000R\000S\000T\000V\000W\000Y\000Z\000[\000\\\000]\000a\000b\000e\000f\000i\000j\000k\000l\000m\000n\000o\000p\000q\000r\000s\000t\000u\000v\000y\000z\000}\000~\000\129\000\130\000\133\000\136\000\137\000\138\000\139\000\140\000\141\000\144\000\145\000\148\000\149\000\150\000\153\000\155\000\156\000\157\000\158\000\161\000\162\000\163\000\166\000\167\000\168\000\169\000\170\000\171\000\172\000\173\000\176\000\177\000\178\000\179\000\180\000\181\000\182\000\183\000\184\000\185\000\186\000\187\000\190\000\191\000\194\000\195\000\196\000\197\000\198\000\199\000\200\000\201\000\202\000\204\000\205\000\208\000\210\000\211\000\214\000\215\000\216\000\217\000\218\000\219\000\220\000\221\000\222\000\223\000\224\000\225\000\226\000\227\000\230\000\232\000\233\000\234\000\236\000\238\000\239\000\240\000\241\000\242\000\243\000\244\000\245\000\248\000\249\000\252\000\253\001\000\001\001\001\002\001\003\001\006\001\007\001\b\001\t\001\n\001\011\001\012\001\r\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001\024\001\025\001\026\001\029\001\030\001\031\001 \001!\001\"\001#\001$\001%\001&\001'\001(\001)\001*\001+\001,\001-\001.\001/\0010\0011\0012\0014\0016\0017\0018\0019\001:\001=\001>\001A\001B\001C\001D\001E\001F\001G\001H\001J\001K\001L\001O\001Q\001S\001U\001V\001W\001X\001Y\001Z\001[\001\\\001]\001^\001_\001`\001a\001b\001c\001d\001e\001f\001z\001\142\001\143\001\163\001\167\001\171\001\172\001\173\001\174\001\175\001\176\001\177\001\178\001\179\001\180\001\181\001\182\001\183\001\184\001\186\001\206\001\226\001\230\001\234\001\235\001\236\001\237\001\238\001\239\001\241\001\242\001\243\001\244\001\245\001\246\001\249\001\250\001\251\001\252\001\253\001\254\001\255\002\000\002\001\002\002\002\003\002\004\002\005\002\t\002\r\002\014\002\015\002\016\002\017\002\018\002\019\002\022\002\023\002\024\002\025\002\026\002\027\002\028\002\029\002\030\002\031\002 \002!\002\"\002&\002'\002(\002)\002*\002+\002,\002-\002.\002/\0020\0021\0022\0023\0026\0027\0028\0029\002:\002;\002=\002>\002D\002E\002F\002G\002K\002L\002M\002N\002O\002P\002Q\002T\002U\002V\002W\002X\002Y\002Z\002[\002\\\002]\002^\002_\002`\002a\002b\002h\002i\002j\002k\002o\002p\002q\002r\002s\002t\002u\002x\002y\002z\002{\002|\002}\002~\002\127\002\128\002\129\002\130\002\131\002\132\002\133\002\134\002\136\002\138\002\139\002\140\002\141\002\142\002\143\002\144\002\145\002\147\002\149\002\150\002\151\002\152\002\153\002\154\002\155\002\156\002\162\002\163\002\164\002\165\002\166\002\167\002\168\002\169\002\170\002\171\002\172\002\173\002\174\002\175\002\176\002\177\002\179\002\180\002\182\002\183\002\185\002\187\002\189\002\190\002\191\002\192\002\193\002\195\002\197\002\198\002\200\002\202\002\203\002\207\002\208\002\209\002\210\002\211\002\212\002\213\002\214\002\215\002\216\002\217\002\219\002\220\002\221\002\222\002\223\002\224\002\225\002\226\002\227\002\228\002\229\002\230\002\231\002\251\003\015\003#\003'\003+\003,\003-\003.\003/\0030\0031\0034\0035\0036\0037\0038\0039\003:\003;\003<\003=\003>\003?\003@\003D\003H\003I\003J\003K\003L\003M\003N\003Q\003R\003S\003T\003U\003V\003W\003X\003Y\003Z\003[\003\\\003]\003a\003b\003c\003d\003e\003f\003g\003h\003k\003l\003m\003n\003o\003p\003q\003r\003s\003t\003u\003v\003w\003{\003|\003}\003~\003\127\003\128\003\129\003\132\003\133\003\134\003\135\003\136\003\137\003\138\003\139\003\140\003\141\003\142\003\143\003\144\003\148\003\152\003\153\003\154\003\155\003\156\003\157\003\158\003\161\003\162\003\163\003\164\003\165\003\166\003\167\003\168\003\169\003\170\003\171\003\172\003\173\003\177\003\178\003\179\003\180\003\181\003\182\003\183\003\186\003\187\003\188\003\189\003\190\003\191\003\192\003\193\003\194\003\195\003\196\003\197\003\198\003\199\003\200\003\201\003\202\003\203\003\205\003\206\003\207\003\208\003\209\003\210\003\211\003\212\003\213\003\214\003\215\003\216\003\217\003\218\003\219\003\220\003\221\003\227\003\232\003\233\003\234\003\235\003\242\003\243\003\244\003\245\003\249\003\250\003\251\003\252\003\253\003\254\003\255\004\002\004\003\004\004\004\005\004\006\004\007\004\b\004\t\004\n\004\011\004\012\004\r\004\014\004\015\004\016\004\017\004\018\004\024\004\025\004\026\004\027\004\028\004\029\004\030\004\031\004P\004Q\004R\004p\004q\004\143\004\144\004\174\004\175\004\205\004\206\004\236\004\237\005\011\005\012\005*\005+\005I\005J\005h\005i\005\135\005\136\005\166\005\167\005\197\005\198\005\228\005\229\006\003\006\004\006\"\006#\006A\006B\006`\006a\006\127\006\128\006\158\006\159\006\189\006\190\006\220\006\221\006\251\006\252\007\026\007\027\0079\007:\007X\007Y\007w\007x\007y\007z\007\152\007\153\007\183\007\184\007\214\007\215\007\216\007\217\007\218\007\219\007\220\007\221\007\222\007\223\007\224\007\230\007\235\007\236\007\237\007\238\007\239\007\240\007\241\007\242\007\243\007\244\007\245\007\246\007\247\007\248\007\255\b\000\b\001\b2\b3\b4\b5\b6\b7\b8\b9\b:\b;\b<\b=\b>\b?\b@\bA\bB\bC\bD\bE\bF\bG\bH\bI\bJ\bK\bL\bM\bN\bO\bP\bQ\bR\bS\bT\bU\bV\bW\bX\bY\bZ\b[\b\\\bz\b{\b|\b}\b\155\b\156\b\157\b\158\b\188\b\189\b\190\b\191\b\221\b\222\b\223\b\224\b\254\b\255\t\029\t\030\t\031\t \t>\t?\t@\tA\t_\t`\ta\tb\t\128\t\129\t\130\t\131\t\161\t\162\t\163\t\164\t\165\t\166\t\196\t\197\t\227\t\228\t\229\t\230\n\004\n\005\n#\n$\nB\nC\nD\nE\nc\nd\ne\nf\ng\nh\n\134\n\135\n\165\n\166\n\196\n\197\n\227\n\228\011\002\011\003\011!\011\"\011@\011A\011_\011`\011a\011b\011c\011d\011e\011f\011g\011h\011\134\011\135\011\136\011\137\011\167\011\168\011\198\011\199\011\200\011\201\011\202\011\203\011\204\011\205\011\206\011\207\011\208\011\209\011\210\011\211\011\212\011\213\011\214\011\215\011\216\011\217\011\218\011\219\011\220\011\221\011\222\011\223\011\224\011\225\011\226\011\227\011\228\011\229\011\230\011\231\011\232\011\233\011\236\011\237\011\238\011\239\011\240\011\241\011\242\011\243\011\244\011\245\011\246\011\247\011\248\011\250\011\251\011\252\011\253\011\254\012\000\012\001\012\002\012\004\012\005\012\006\012\007\012\b\012\n\012\011\012\012\012\r\012\014\012\020\012\022\012\024\012\025\012\026\012\027\012\029\012\030\012\031\012 \012!\012\"\012#\012$\012%\012&\012'\012(\012)\012*\012+\012,\012-\012.\012/\0121\0122\0123\0124\0125\0126\0127\0128\0129\012:\012<\012>\012@\012B\012C\012D\012E\012F\012G\012H\012I\012L\012M\012N\012O\012P\012Q\012T\012U\012V\012W\012X\012Y\012Z\012[\012\\\012]\012^\012_\012`\012d\012e\012f\012g\012h\012i\012j\012m\012n\012o\012p\012q\012r\012s\012t\012u\012v\012w\012x\012y\012}\012\129\012\130\012\131\012\132\012\133\012\134\012\135\012\138\012\139\012\140\012\141\012\142\012\143\012\144\012\145\012\146\012\147\012\148\012\149\012\150\012\151\012\152\012\153\012\154\012\157\012\158\012\159\012\160\012\161\012\162\012\165\012\166\012\167\012\168\012\169\012\170\012\171\012\172\012\173\012\174\012\175\012\176\012\177\012\181\012\185\012\186\012\187\012\188\012\189\012\190\012\191\012\194\012\195\012\196\012\197\012\198\012\199\012\200\012\201\012\202\012\203\012\204\012\205\012\206\012\210\012\211\012\212\012\213\012\214\012\215\012\216\012\219\012\220\012\221\012\222\012\223\012\224\012\225\012\226\012\227\012\228\012\229\012\230\012\231\012\235\012\236\012\237\012\238\012\239\012\240\012\241\012\244\012\245\012\246\012\247\012\248\012\249\012\250\012\251\012\252\012\253\012\254\012\255\r\000\r\004\r\b\r\t\r\n\r\011\r\012\r\r\r\014\r\017\r\018\r\019\r\020\r\021\r\022\r\023\r\024\r\025\r\026\r\027\r\028\r\029\r\030\r\031\r \r!\r\"\r#\r$\r%\r&\r'\r(\r)\r,\r.\r/\r0\r1\r2\r3\r4\r6\r7\r8\r;\r<\r=\r@\rA\rB\rC\rD\rE\rF\rN\rP\rR\rS\rZ\r[\r\\\r]\r^\r_\re\rg\ri\rj\rk\rl\rm\rn\ro\rp\rq\rr\rs\rt\ru\rv\rw\rx\ry\rz\r{\r|\r}\r~\r\127\r\128\r\129\r\131\r\132\r\133\r\135\r\136\r\137\r\138\r\139\r\140\r\142\r\144\r\145\r\146\r\147\r\148\r\151\r\152\r\155\r\158\r\159\r\160\r\161\r\162\r\163\r\164\r\165\r\167\r\168\r\169\r\170\r\173\r\174\r\175\r\178\r\181\r\182\r\183\r\184\r\185\r\186\r\187\r\188"))
+    
+    and nullable =
+      "\b\000)\255\255\132\003\198\000\000\000\b"
+    
+    and first =
+      (125, "\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\127\1760&HzI\220\188x\b\243\027\208\216\003\253\129\0012C\210N\229\227\196G\152\222\134\000\000\000\000\000\000\000\000\000 \000 \000\000\000\000\000\000\128\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\140\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\136\004\b#\001\000\000\000\000\024\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\192@\000\000\000\000\000\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000@\012\128@\1340\016\000\000 \001\128\128\002\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000(\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\b\000B@\000\016\000H\004@0 \000\004 \002\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\024\002\253\129\0012C\210N\225\227\192G\152\222\134\000\b\000\000\000\000\000\000\000\002\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\176\007\255B\002|\135\164\157\195\199\192\1431\189\r\128?\216\016\019$=$\238\030<\004y\141\232l\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\128\000\000@\018\001\024\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\128\004$\000\001\000\004\128D\003\002\000\000B\000 \000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\b@\000\000\000\t\000\136\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000@\002\018\000\000\128\002@\"\001\129\000\000!\000\018\000\016\144\000\004\000\018\001\016\012\b\000\001\b\000\128\000@\000\000\000\000\000\000\000\000\000\000\000\000\002\192\031\236\012\t\146\030\146w/\030\002<\198\2446\000\255`@L\144\244\147\185x\241\017\2307\161\128\000\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000@\000\000\000\002\016\000\000\b\002@\"\001\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\001\000\000\000\000$\000\000\000\016\000\002\016\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\216\000\148\128\000\"@\208H@a@\012\b@\006\000\004 \000\000\016\004\128F\002\002\000\000B\000\000\000!\000\000\000\128$\002\016\016\016\002\002\016\000\000\000\b\000\000\000\001 \016\000\000\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000B\000\000\001\000H\004@  \000\004 \000\000\002\016\000\000\b\002@ \001\001\000 !\000\003\000_\176 &HzI\220<x\b\243\027\208\216\002\253\129\0012C\210Na\227\192O\152\222\134\192\021\236\000\t\018\022\130g\015\014\0028F\2446\000\175`\000H\144\180\019\024xp\019\1947\161\176\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003`\002R\000\000\137\003A!\001\133\0000!\000\027\000\127\176 &HzI\220<x\b\243\027\208\216\003\253\129\0012C\210Na\227\192O\152\222\134\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000@\004\000@\128\128\000\128\000$\000\000\176\007\255B\002|\135\164\157\195\199\192\1431\189\r\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000")
+    
+  end) (ET) (TI)
+  
+end
+
+let parse_stab_sig =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 1259 lexer lexbuf) : (string -> Mo_def.Syntax.stab_sig))
+
+and parse_prog_interactive =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 1247 lexer lexbuf) : (string -> Mo_def.Syntax.prog))
+
+and parse_prog =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 217 lexer lexbuf) : (string -> Mo_def.Syntax.prog))
+
+and parse_module_header =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 0 lexer lexbuf) : (unit))
+
+module Incremental = struct
+  
+  let parse_stab_sig =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 1259 initial_position) : (string -> Mo_def.Syntax.stab_sig) MenhirInterpreter.checkpoint)
+  
+  and parse_prog_interactive =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 1247 initial_position) : (string -> Mo_def.Syntax.prog) MenhirInterpreter.checkpoint)
+  
+  and parse_prog =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 217 initial_position) : (string -> Mo_def.Syntax.prog) MenhirInterpreter.checkpoint)
+  
+  and parse_module_header =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 0 initial_position) : (unit) MenhirInterpreter.checkpoint)
+  
+end
+
+# 957 "mo_frontend/parser.mly"
+  
+
+# 31956 "mo_frontend/parser.ml"
+
+# 52 "mo_frontend/assertions.mly"
+  
+
+# 31961 "mo_frontend/parser.ml"
+
+
+
+ + + diff --git a/coverage/mo_frontend/parser_lib.ml.html b/coverage/mo_frontend/parser_lib.ml.html new file mode 100644 index 00000000000..5ef9f4bfd48 --- /dev/null +++ b/coverage/mo_frontend/parser_lib.ml.html @@ -0,0 +1,56 @@ + + + + + parser_lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+
+
exception Imports of Mo_def.Syntax.dec list
+
+(* Temporary hack! *)
+let msg_store : Diag.msg_store option ref = ref None
+let mode : Lexer_lib.mode option ref = ref None
+
+let triv_table : Mo_def.Trivia.triv_table ref = ref Mo_def.Trivia.empty_triv_table
+
+
+
+ + + diff --git a/coverage/mo_frontend/parsing.ml.html b/coverage/mo_frontend/parsing.ml.html new file mode 100644 index 00000000000..5e51ba19328 --- /dev/null +++ b/coverage/mo_frontend/parsing.ml.html @@ -0,0 +1,380 @@ + + + + + parsing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+
+

+module P =
+  MenhirLib.Printers.Make
+    (Parser.MenhirInterpreter)
+    (Printers)
+
+(* Instantiate [ErrorReporting] for our parser. This requires
+   providing a few functions -- see [CalcErrorReporting]. *)
+
+module E =
+  Menhir_error_reporting.Make
+    (Parser.MenhirInterpreter)
+    (Error_reporting)
+
+(* Define a printer for explanations. We treat an explanation as if it
+   were just an item: that is, we ignore the position information that
+   is provided in the explanation. Indeed, this information is hard to
+   show in text mode. *)
+
+let uniq xs = List.fold_right (fun x ys -> if List.mem x ys then ys else x::ys) xs []
+
+let abstract_symbols explanations =
+  let symbols = List.sort Parser.MenhirInterpreter.compare_symbols
+    (List.map (fun e -> List.hd (E.future e))  explanations) in
+  let ss = List.map Printers.string_of_symbol symbols in
+  String.concat "\n  " (uniq ss)
+
+let abstract_future future =
+  let ss = List.map Printers.string_of_symbol future  in
+  String.concat " " ss
+
+let rec lex_compare_futures f1 f2 =
+  match f1,f2 with
+  | [], [] -> 0
+  | s1::ss1,s2::ss2 ->
+    (match Parser.MenhirInterpreter.compare_symbols s1 s2 with
+     | 0 -> lex_compare_futures ss1 ss2
+     | c -> c)
+  | _ -> assert false
+
+let compare_futures f1 f2 = match compare (List.length f1) (List.length f2) with
+      | 0 -> lex_compare_futures f1 f2
+      | c -> c
+
+let abstract_futures explanations =
+  let futures = List.sort compare_futures (List.map E.future explanations) in
+  let ss = List.map abstract_future futures in
+  String.concat "\n  " (uniq ss)
+
+let abstract_item item =
+  P.print_item item;
+  Printers.to_string()
+
+let abstract_items explanations =
+  let items = List.sort Parser.MenhirInterpreter.compare_items (List.map E.item explanations) in
+  let ss = List.map abstract_item items in
+  String.concat "  " (uniq ss)
+
+type error_detail = int
+
+exception Error of string * Lexing.position * Lexing.position
+
+(* The lexbuf is a 1024 byte wide window, we need to compute offsets before
+   accessing it, because token positions are absolute to the whole input *)
+let slice_lexeme lexbuf i1 i2 =
+  let open Lexing in
+  let offset = i1.pos_cnum - lexbuf.lex_abs_pos in
+  let len = i2.pos_cnum - i1.pos_cnum in
+  if offset < 0 || len < 0
+  then "<unknown>" (* Too rare to care *)
+  else Bytes.sub_string lexbuf.lex_buffer offset len
+
+let parse mode error_detail checkpoint lexer lexbuf =
+  Diag.with_message_store (fun m ->
+    try
+      (* Temporary hack! *)
+      Parser_lib.msg_store := Some m;
+      Parser_lib.mode := Some mode;
+      Some (E.entry checkpoint lexer)
+    with E.Error ((start, end_), explanations) ->
+      let at =
+        Source.{left = Lexer.convert_pos start; right = Lexer.convert_pos end_}
+      in
+      let lexeme = slice_lexeme lexbuf start end_ in
+      let token =
+        if lexeme = "" then "end of input" else
+        "token '" ^ String.escaped lexeme ^ "'"
+      in
+      let msg =
+        match error_detail with
+        | 1 ->
+          Printf.sprintf
+            "unexpected %s, expected one of token or <phrase>:\n  %s"
+            token (abstract_symbols explanations)
+        | 2 ->
+          Printf.sprintf
+            "unexpected %s, expected one of token or <phrase> sequence:\n  %s"
+            token (abstract_futures explanations)
+        | 3 ->
+          Printf.sprintf
+            "unexpected %s in position marked . of partially parsed item(s):\n%s"
+            token (abstract_items explanations)
+        | _ ->
+          Printf.sprintf "unexpected %s" token
+      in
+      Diag.add_msg m (Diag.error_message at "M0001" "syntax" msg);
+      None
+  )
+
+
+
+ + + diff --git a/coverage/mo_frontend/printers.ml.html b/coverage/mo_frontend/printers.ml.html new file mode 100644 index 00000000000..98a066c5f18 --- /dev/null +++ b/coverage/mo_frontend/printers.ml.html @@ -0,0 +1,912 @@ + + + + + printers.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+
+
open Parser.MenhirInterpreter
+
+(* In order to print syntax error messages and/or debugging information, we
+   need a symbol printer. *)
+
+let abstract abs con = abs
+
+let binop = abstract "<binop>"
+let relop = abstract "<relop>"
+let binassign = abstract "<binassign>"
+
+(* all unary operators are also binary operators, so keep them unary *)
+let unop = abstract "<unop>"
+let unassign = abstract "<unassign>"
+
+
+let string_of_symbol = function
+  | X (T T_error) -> "error"
+  | X (T T_XOROP) -> unop "^"
+  | X (T T_XORASSIGN) -> unassign "^="
+  | X (T T_WHILE) -> "while"
+  | X (T T_VAR) -> "var"
+  | X (T T_SHROP) -> binop " >>"
+  | X (T T_SHRASSIGN) -> binop ">>="
+  | X (T T_UNDERSCORE) -> "_"
+  | X (T T_TYPE) -> "type"
+  | X (T T_TRY) -> "try"
+  | X (T T_THROW) -> "throw"
+  | X (T T_TEXT) -> "<text>"
+  | X (T T_SWITCH) -> "switch"
+  | X (T T_SUBOP) -> unop "-"
+  | X (T T_SUB) -> "<:"
+  | X (T T_STABLE) -> "stable"
+  | X (T T_SHLOP) -> binop "<<"
+  | X (T T_SHLASSIGN) -> binassign "<<="
+  | X (T T_SHARED) -> "shared"
+  | X (T T_SEMICOLON_EOL) -> ";" (* suppress the \n *)
+  | X (T T_SEMICOLON) -> ";"
+  | X (T T_SYSTEM) -> "system"
+  | X (T T_WITH) -> "with"
+  | X (T T_RPAR) -> ")"
+  | X (T T_ROTROP) -> binop "<>>"
+  | X (T T_ROTRASSIGN) -> binassign "<>>="
+  | X (T T_ROTLOP) -> binop "<<>"
+  | X (T T_ROTLASSIGN) -> binassign "<<>="
+  | X (T T_RETURN) -> "return"
+  | X (T T_RCURLY) -> "}"
+  | X (T T_RBRACKET) -> "]"
+  | X (T T_QUEST) -> "?"
+  | X (T T_BANG) -> "!"
+  | X (T T_QUERY) -> "query"
+  | X (T T_PUBLIC) -> "public"
+  | X (T T_PRIVATE) -> "private"
+  | X (T T_PRIM) -> "prim"
+  | X (T T_POWOP) -> binop "**"
+  | X (T T_WRAPADDOP) -> binop "+%"
+  | X (T T_WRAPSUBOP) -> binop "-%"
+  | X (T T_WRAPMULOP) -> binop "*%"
+  | X (T T_WRAPPOWOP) -> binop "**%"
+  | X (T T_WRAPADDASSIGN) -> binassign "+%-"
+  | X (T T_WRAPSUBASSIGN) -> binassign "-%="
+  | X (T T_WRAPMULASSIGN) -> binassign "*%="
+  | X (T T_WRAPPOWASSIGN) -> binassign "**%="
+  | X (T T_POWASSIGN) -> binassign "**="
+  | X (T T_PLUSASSIGN) -> unassign "+="
+  | X (T T_OROP) -> binop "|"
+  | X (T T_ORASSIGN) -> binassign "|="
+  | X (T T_OR) -> "or"
+  | X (T T_OBJECT) -> "object"
+  | X (T T_NULL) -> "null"
+  | X (T T_NOT) -> "not"
+  | X (T T_NEQOP) -> binop "!="
+  | X (T T_NAT) -> "<nat>"
+  | X (T T_MULOP) -> binop "*"
+  | X (T T_MULASSIGN) -> binassign "*="
+  | X (T T_MODULE) -> "module"
+  | X (T T_MODOP) -> binop "%"
+  | X (T T_MODASSIGN) -> binassign "%="
+  | X (T T_MINUSASSIGN) -> unassign "-="
+  | X (T T_LTOP) -> relop " < "
+  | X (T T_LT) -> "<"
+  | X (T T_LPAR) -> "("
+  | X (T T_LOOP) -> "loop"
+  | X (T T_LET) -> "let"
+  | X (T T_LEOP) -> relop "<="
+  | X (T T_LCURLY) -> "{"
+  | X (T T_LBRACKET) -> "["
+  | X (T T_LABEL) -> "label"
+  | X (T T_IN) -> "in"
+  | X (T T_IMPORT) -> "import"
+  | X (T T_IGNORE) -> "ignore"
+  | X (T T_IF) -> "if"
+  | X (T T_ID) -> "<id>"
+  | X (T T_HASH) -> binop "#"
+  | X (T T_GTOP) -> relop " > "
+  | X (T T_GT) -> ">"
+  | X (T T_GEOP) -> relop ">="
+  | X (T T_FUNC) -> "func"
+  | X (T T_FOR) -> "for"
+  | X (T T_FLEXIBLE) -> "flexible"
+  | X (T T_FLOAT) -> "<float>"
+  | X (T T_EQOP) -> relop "=="
+  | X (T T_EQ) -> "="
+  | X (T T_EOF) -> "<eof>"
+  | X (T T_ELSE) -> "else"
+  | X (T T_DOT_NUM) -> ".<nat>"
+  | X (T T_DOT) -> "."
+  | X (T T_DO) -> "do"
+  | X (T T_DIVOP) -> binop "/"
+  | X (T T_DIVASSIGN) -> binassign "/="
+  | X (T T_DISALLOWED) -> "<disallowed>"
+  | X (T T_DEBUG_SHOW) -> "debug_show"
+  | X (T T_TO_CANDID) -> "to_candid"
+  | X (T T_FROM_CANDID) -> "from_candid"
+  | X (T T_DEBUG) -> "debug"
+  | X (T T_CONTINUE) -> "continue"
+  | X (T T_COMMA) -> ","
+  | X (T T_COMPOSITE) -> "composite"
+  | X (T T_COLON) -> ":"
+  | X (T T_CLASS) -> "class"
+  | X (T T_CHAR) ->  "<char>"
+  | X (T T_CATCH) -> "catch"
+  | X (T T_CATASSIGN) -> binassign "@="
+  | X (T T_CASE) -> "case"
+  | X (T T_BREAK) -> "break"
+  | X (T T_BOOL) -> "<bool>"
+  | X (T T_AWAIT) -> "await"
+  | X (T T_AWAITSTAR) -> "await*"
+  | X (T T_ASYNC) -> "async"
+  | X (T T_ASYNCSTAR) -> "async*"
+  | X (T T_ASSIGN) -> binassign "assign"
+  | X (T T_ASSERT) -> "assert"
+  | X (T T_ARROW) -> "->"
+  | X (T T_ANDOP) -> binop "&"
+  | X (T T_ANDASSIGN) -> binassign "&="
+  | X (T T_AND) -> "and"
+  | X (T T_IMPLIES) -> "implies"
+  | X (T T_OLD) -> "old"
+  | X (T T_ADDOP) -> unop "+"
+  | X (T T_ACTOR) -> "actor"
+  | X (T T_INVARIANT) -> "invariant"
+  | X (T T_PIPE) -> "|>"
+  (* non-terminals *)
+  | X (N N_bl) -> "<bl>"
+  | X (N N_case) -> "<case>"
+  | X (N N_catch) -> "<catch>"
+  | X (N N_class_body) -> "<class_body>"
+  | X (N N_dec) -> "<dec>"
+  | X (N N_dec_field) -> "<dec_field>"
+  | X (N N_dec_nonvar) -> "<dec_nonvar>"
+  | X (N N_dec_var) -> "<dec_var>"
+  | X (N N_exp_bl_) -> "<exp(bl)>"
+  | X (N N_exp_ob_) -> "<exp(ob)>"
+  | X (N N_exp_bin_bl_) -> "<exp_bin(bl)>"
+  | X (N N_exp_bin_ob_) -> "<exp_bin(ob)>"
+  | X (N N_exp_obj) -> "<exp_obj>"
+  | X (N N_exp_nest) -> "<exp_nest>"
+  | X (N N_block) -> "<block>"
+  | X (N N_exp_field) -> "<exp_field>"
+  | X (N N_exp_nondec_bl_) -> "<exp_nondec(bl)>"
+  | X (N N_exp_nondec_ob_) -> "<exp_nondec(ob)>"
+  | X (N N_exp_nonvar_bl_) -> "<exp_nonvar(bl)>"
+  | X (N N_exp_nonvar_ob_) -> "<exp_nonvar(ob)>"
+  | X (N N_exp_nullary_bl_) -> "<exp_nullary(bl)>"
+  | X (N N_exp_nullary_ob_) -> "<exp_nullary(ob)>"
+  | X (N N_exp_plain) -> "<exp_plain>"
+  | X (N N_exp_post_bl_) -> "<exp_post(bl)>"
+  | X (N N_exp_post_ob_) -> "<exp_post(ob)>"
+  | X (N N_exp_un_bl_) -> "<exp_un(bl)>"
+  | X (N N_exp_un_ob_) -> "<exp_un(ob)>"
+  | X (N N_func_body) -> "<func_body>"
+  | X (N N_imp) -> "<imp>"
+  | X (N N_import_list) -> "<import_list>"
+  | X (N N_inst) -> "<inst>"
+  | X (N N_lit) -> "<lit>"
+  | X (N N_ob) -> "<ob>"
+  | X (N N_obj_body) -> "<obj_body>"
+  | X (N N_option_EQ_) -> "=?"
+  | X (N N_option_exp_nullary_ob__) -> "<exp_nullary(ob)>?"
+  | X (N N_option_typ_args_) -> "<typ_args>?"
+  | X (N N_option_query_) -> "<query>?"
+  | X (N N_parse_module_header) -> "<parse_module_header>"
+  | X (N N_parse_prog) -> "<parse_prog>"
+  | X (N N_parse_prog_interactive) -> "<parse_prog_interactive>"
+  | X (N N_parse_stab_sig) -> "<parse_stab_sig>"
+  | X (N N_pat) -> "<pat>"
+  | X (N N_pat_bin) -> "<pat_bin>"
+  | X (N N_pat_field) -> "<pat_field>"
+  | X (N N_pat_nullary) -> "<pat_nullary>"
+  | X (N N_pat_plain) -> "<pat_plain>"
+  | X (N N_pat_un) -> "<pat_un>"
+  | X (N N_path) -> "<path>"
+  | X (N N_annot_opt) -> "<annot_opt>"
+  | X (N N_seplist_case_semicolon_) ->  "seplist(<case>,<semicolon>)"
+  | X (N N_seplist_dec_SEMICOLON_) -> "seplist(<dec>,;)"
+  | X (N N_seplist_dec_semicolon_) -> "seplist(<dec>,<semicolon>)"
+  | X (N N_seplist_typ_dec_semicolon_) -> "seplist(<typ_dec>,<semicolon>)"
+  | X (N N_seplist_dec_field_semicolon_) -> "seplist(<dec_field>,<semicolon>)"
+  | X (N N_seplist_exp_ob__COMMA_) -> "seplist(<exp(ob)>,,)"
+  | X (N N_seplist_exp_field_semicolon_) -> "seplist(<exp_field>,<semicolon>)"
+  | X (N N_seplist1_exp_field_semicolon_) -> "seplist1(<exp_field>,<semicolon>)"
+  | X (N N_separated_nonempty_list_AND_exp_post_ob__) -> "seplist+(<exp_post(ob)>,and)"
+  | X (N N_seplist_exp_nonvar_ob__COMMA_) -> "seplist(<exp_nonvar(ob)>,,)"
+  | X (N N_seplist_imp_SEMICOLON_) -> "seplist(<imp>,;)"
+  | X (N N_seplist_imp_semicolon_) -> "seplist(<imp>,<semicolon>)"
+  | X (N N_seplist_pat_bin_COMMA_) -> "seplist(<pat_bin>,,)"
+  | X (N N_seplist_pat_field_semicolon_) -> "seplist(<pat_field>,<semicolon>)"
+  | X (N N_seplist_typ_COMMA_) -> "seplist(<typ>,,)"
+  | X (N N_seplist_typ_bind_COMMA_) -> "seplist(<typ_bind>,,)"
+  | X (N N_seplist_typ_field_semicolon_) -> "seplist(<typ_field>,<semicolon>)"
+  | X (N N_seplist_stab_field_semicolon_) -> "seplist(<stab_field>,<semicolon>)"
+  | X (N N_seplist_typ_item_COMMA_) -> "seplist(<typ_item>,,)"
+  | X (N N_seplist_typ_tag_semicolon_) -> "seplist(<typ_tag>,<semicolon>)"
+  | X (N N_seplist1_typ_tag_semicolon_) -> "seplist1(<typ_tag>,<semicolon>)"
+  | X (N N_pat_opt) -> "<pat_opt>"
+  | X (N N_typ) -> "<typ>"
+  | X (N N_typ_dec) -> "<typ_dec>"
+  | X (N N_typ_args) -> "<typ_args>"
+  | X (N N_typ_bind) -> "<typ_bind>"
+  | X (N N_typ_field) -> "<typ_field>"
+  | X (N N_typ_item) -> "<typ_item>"
+  | X (N N_typ_nobin) -> "<typ_nobin>"
+  | X (N N_typ_nullary) -> "<typ_nullary>"
+  | X (N N_typ_obj) -> "<typ_obj>"
+  | X (N N_typ_pre) -> "<typ_pre>"
+  | X (N N_typ_tag) -> "<typ_tag>"
+  | X (N N_typ_un) -> "<typ_un>"
+  | X (N N_typ_variant) -> "<typ_variant>"
+  | X (N N_vis) -> "<vis>"
+  | X (N N_stab) -> "<stab>"
+  | X (N N_stab_field) -> "<stab_field>"
+  | X (N N_start) -> "<start>" (* dummy non-terminal, don't display *)
+
+(* In order to print a view of the stack that includes semantic values,
+   we need an element printer. (If we don't need this feature, then
+   [print_symbol] above suffices.) *)
+
+(* The public functions. *)
+
+let buff :string list ref = ref []
+let print s = buff := s::!buff
+let print_symbol s = print (string_of_symbol s)
+let print_element = None
+let to_string() = let s = String.concat "" (List.rev (!buff)) in
+                  buff := [];
+                  s
+
+
+
+ + + diff --git a/coverage/mo_frontend/source_lexer.ml.html b/coverage/mo_frontend/source_lexer.ml.html new file mode 100644 index 00000000000..accbc6cad2a --- /dev/null +++ b/coverage/mo_frontend/source_lexer.ml.html @@ -0,0 +1,21084 @@ + + + + + source_lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+
+
# 1 "mo_frontend/source_lexer.mll"
+ 
+open Mo_def.Trivia
+open Source_token
+open Lexer_lib
+module Utf8 = Lib.Utf8
+
+let region lexbuf =
+  let left = convert_pos (Lexing.lexeme_start_p lexbuf) in
+  let right = convert_pos (Lexing.lexeme_end_p lexbuf) in
+  {Source.left = left; Source.right = right}
+
+let error lexbuf msg = raise (Error (region lexbuf, msg))
+let error_nest start lexbuf msg =
+  lexbuf.Lexing.lex_start_p <- start;
+  error lexbuf msg
+
+let utf8 s i =
+  let len = if s.[!i] < '\xe0' then 1 else if s.[!i] < '\xf0' then 2 else 3 in
+  i := !i + len;
+  List.hd (Utf8.decode (String.sub s (!i - len) (1 + len)))
+
+let codepoint lexbuf s i =
+  let u =
+    if s.[!i] >= '\x80' then Utf8.encode [utf8 s i] else
+    if s.[!i] <> '\\' then Utf8.encode [Char.code s.[!i]] else
+    match (incr i; s.[!i]) with
+    | 'n' -> Utf8.encode [Char.code '\n']
+    | 'r' -> Utf8.encode [Char.code '\r']
+    | 't' -> Utf8.encode [Char.code '\t']
+    | '\\' -> Utf8.encode [Char.code '\\']
+    | '\'' -> Utf8.encode [Char.code '\'']
+    | '\"' -> Utf8.encode [Char.code '\"']
+    | 'u' ->
+      let j = !i + 2 in
+      i := String.index_from s j '}';
+      Utf8.encode [
+        try
+          let n = int_of_string ("0x" ^ String.sub s j (!i - j)) in
+          if 0 <= n && n < 0xD800 || 0xE000 <= n && n < 0x110000 then n else raise (Failure "")
+        with Failure _ -> error lexbuf "unicode escape out of range"
+      ]
+    | h ->
+      incr i;
+      let b = int_of_string ("0x" ^ String.make 1 h ^ String.make 1 s.[!i]) in
+      String.of_seq (Seq.return (Char.chr b))
+  in incr i; u
+
+let text lexbuf s =
+  let b = Buffer.create (String.length s) in
+  let i = ref 1 in
+  while !i < String.length s - 1 do
+    if s.[!i] = '\n' then Lexing.new_line lexbuf;
+    let bs = codepoint lexbuf s i in
+    Buffer.add_substring b bs 0 (String.length bs)
+  done;
+  Buffer.contents b
+
+let char lexbuf s =
+  let t = text lexbuf s in
+  try
+    match Utf8.decode t with
+    | [n] -> n
+    | [] -> error lexbuf "empty character literal"
+    | _ -> error lexbuf "overlong character literal"
+  with Lib.Utf8.Utf8 ->
+    error lexbuf "invalid utf8 in character literal"
+
+# 70 "mo_frontend/source_lexer.ml"
+let __ocaml_lex_tables = {
+  Lexing.lex_base =
+   "\000\000\123\255\000\000\129\000\129\000\193\000\001\001\001\001\
+    \065\001\124\255\125\255\126\255\182\000\161\000\236\000\192\001\
+    \011\002\086\002\161\002\236\002\055\003\130\003\205\003\024\004\
+    \099\004\174\004\249\004\068\005\143\005\218\005\037\006\112\006\
+    \187\006\006\007\081\007\204\007\195\008\191\007\138\009\194\009\
+    \185\000\186\000\187\000\189\000\190\000\207\007\213\007\214\007\
+    \216\007\191\000\193\000\194\000\244\255\249\007\011\002\222\001\
+    \248\255\249\255\250\255\251\255\252\255\253\255\254\255\255\255\
+    \217\255\218\255\222\001\224\001\246\255\207\255\227\001\205\255\
+    \009\002\204\255\018\009\003\008\220\255\221\255\013\002\219\255\
+    \206\255\216\255\014\002\203\255\198\255\215\255\041\002\202\255\
+    \214\255\042\002\219\007\211\255\043\002\200\255\201\255\131\255\
+    \189\009\213\255\062\010\078\008\110\010\174\010\204\008\206\010\
+    \014\011\078\011\142\011\206\011\014\012\078\012\142\012\206\012\
+    \014\013\078\013\212\255\210\255\209\255\231\255\208\255\199\255\
+    \066\009\222\013\232\013\013\008\033\014\160\009\098\014\136\014\
+    \174\014\239\014\255\013\170\009\009\014\163\014\066\014\006\015\
+    \016\015\038\015\066\002\063\015\053\015\006\015\101\015\165\015\
+    \229\015\229\015\037\016\101\016\165\016\229\016\037\017\101\017\
+    \165\017\229\017\037\018\101\018\240\001\245\018\175\007\193\255\
+    \012\019\050\019\073\019\111\019\172\019\190\255\191\255\192\255\
+    \019\020\020\020\149\020\054\019\197\020\005\021\069\021\069\021\
+    \133\021\197\021\005\022\069\022\133\022\197\022\005\023\069\023\
+    \133\023\197\023\189\255\021\002\133\024\120\024\143\024\086\025\
+    \147\025\185\025\004\026\079\026\154\026\229\026\048\027\123\027\
+    \198\027\017\028\092\028\167\028\248\028\185\255\067\029\142\029\
+    \217\029\036\030\111\030\192\030\182\255\011\031\086\031\161\031\
+    \236\031\055\032\130\032\205\032\024\033\099\033\174\033\249\033\
+    \068\034\143\034\218\034\037\035\112\035\187\035\006\036\081\036\
+    \156\036\231\036\050\037\125\037\200\037\019\038\094\038\169\038\
+    \244\038\063\039\138\039\213\039\032\040\107\040\182\040\001\041\
+    \076\041\151\041\226\041\045\042\120\042\195\042\014\043\089\043\
+    \164\043\239\043\058\044\133\044\208\044\027\045\102\045\177\045\
+    \252\045\071\046\146\046\221\046\040\047\115\047\190\047\009\048\
+    \084\048\159\048\234\048\053\049\128\049\203\049\022\050\097\050\
+    \172\050\247\050\066\051\141\051\216\051\035\052\110\052\185\052\
+    \004\053\079\053\154\053\229\053\048\054\123\054\198\054\017\055\
+    \092\055\167\055\242\055\061\056\136\056\211\056\030\057\105\057\
+    \180\057\255\057\074\058\149\058\224\058\043\059\118\059\193\059\
+    \012\060\087\060\162\060\237\060\056\061\131\061\206\061\025\062\
+    \100\062\175\062\250\062\069\063\144\063\219\063\038\064\113\064\
+    \188\064\007\065\082\065\157\065\232\065\051\066\126\066\201\066\
+    \020\067\095\067\170\067\245\067\064\068\139\068\214\068\033\069\
+    \108\069\183\069\002\070\077\070\152\070\227\070\046\071\121\071\
+    \196\071\015\072\090\072\165\072\240\072\059\073\134\073\209\073\
+    \028\074\103\074\178\074\253\074\072\075\147\075\222\075\041\076\
+    \116\076\191\076\010\077\085\077\160\077\235\077\054\078\129\078\
+    \204\078\023\079\098\079\173\079\248\079\067\080\142\080\217\080\
+    \036\081\111\081\186\081\005\082\080\082\155\082\230\082\049\083\
+    \124\083\199\083\018\084\093\084\168\084\243\084\062\085\137\085\
+    \128\255\132\085\196\085\004\086\068\086\132\086\196\086\004\087\
+    \068\087\132\087\058\088\250\255\234\087\115\019\171\088\235\088\
+    \043\089\043\089\107\089\251\255\252\255\253\255\103\002\099\002\
+    \255\255\254\255\171\089\235\089\043\090\107\090\171\090\235\090\
+    \043\091\107\091\171\091";
+  Lexing.lex_backtrk =
+   "\255\255\255\255\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\255\255\255\255\255\255\128\000\126\000\125\000\131\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\131\000\131\000\060\000\060\000\058\000\
+    \033\000\025\000\023\000\022\000\020\000\019\000\018\000\017\000\
+    \016\000\015\000\013\000\012\000\255\255\010\000\014\000\008\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\026\000\255\255\255\255\027\000\255\255\
+    \028\000\255\255\059\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\029\000\255\255\255\255\255\255\030\000\255\255\
+    \255\255\031\000\021\000\255\255\032\000\255\255\255\255\255\255\
+    \123\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\061\000\255\255\255\255\060\000\255\255\061\000\255\255\
+    \061\000\255\255\061\000\255\255\255\255\061\000\255\255\061\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\066\000\066\000\066\000\255\255\255\255\
+    \255\255\121\000\121\000\121\000\121\000\121\000\121\000\067\000\
+    \068\000\121\000\121\000\121\000\069\000\255\255\121\000\121\000\
+    \071\000\121\000\121\000\072\000\255\255\121\000\121\000\121\000\
+    \074\000\121\000\121\000\121\000\121\000\121\000\075\000\121\000\
+    \076\000\121\000\121\000\077\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\078\000\121\000\121\000\121\000\121\000\
+    \079\000\082\000\121\000\121\000\121\000\080\000\121\000\121\000\
+    \121\000\121\000\081\000\121\000\121\000\083\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\084\000\121\000\121\000\
+    \121\000\121\000\121\000\085\000\086\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\087\000\121\000\088\000\
+    \121\000\091\000\121\000\089\000\121\000\121\000\121\000\090\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\092\000\121\000\
+    \121\000\121\000\121\000\121\000\093\000\121\000\095\000\100\000\
+    \121\000\121\000\094\000\121\000\121\000\121\000\099\000\121\000\
+    \121\000\121\000\121\000\096\000\121\000\121\000\097\000\121\000\
+    \098\000\121\000\121\000\121\000\121\000\121\000\101\000\102\000\
+    \121\000\103\000\121\000\121\000\121\000\120\000\121\000\121\000\
+    \121\000\104\000\121\000\121\000\121\000\105\000\121\000\121\000\
+    \121\000\106\000\121\000\121\000\121\000\121\000\107\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\108\000\121\000\
+    \121\000\121\000\109\000\121\000\121\000\121\000\110\000\121\000\
+    \121\000\121\000\111\000\121\000\121\000\121\000\121\000\121\000\
+    \112\000\115\000\121\000\121\000\113\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\114\000\121\000\116\000\121\000\117\000\
+    \121\000\121\000\121\000\121\000\118\000\121\000\119\000\122\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\255\255\255\255\255\255\004\000\004\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255";
+  Lexing.lex_default =
+   "\001\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\168\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\255\255\255\255\000\000\000\000\255\255\000\000\
+    \255\255\000\000\255\255\255\255\000\000\000\000\255\255\000\000\
+    \000\000\000\000\255\255\000\000\000\000\000\000\255\255\000\000\
+    \000\000\255\255\255\255\000\000\255\255\000\000\000\000\000\000\
+    \096\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\
+    \255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\
+    \168\000\186\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\000\000\255\255\168\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\163\001\000\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\
+    \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255";
+  Lexing.lex_trans =
+   "\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\014\000\011\000\009\000\009\000\012\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \013\000\051\000\035\000\040\000\009\000\044\000\043\000\036\000\
+    \063\000\062\000\046\000\048\000\056\000\047\000\053\000\045\000\
+    \038\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\037\000\055\000\057\000\054\000\050\000\049\000\052\000\
+    \015\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\061\000\009\000\060\000\041\000\039\000\
+    \009\000\034\000\033\000\032\000\031\000\030\000\029\000\016\000\
+    \016\000\028\000\016\000\016\000\024\000\026\000\025\000\027\000\
+    \023\000\022\000\021\000\020\000\019\000\016\000\018\000\017\000\
+    \016\000\016\000\016\000\059\000\042\000\058\000\009\000\009\000\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \144\001\013\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \007\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\006\000\005\000\005\000\
+    \004\000\002\000\002\000\002\000\003\000\014\000\119\000\118\000\
+    \116\000\117\000\115\000\114\000\079\000\078\000\077\000\076\000\
+    \010\000\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\064\000\072\000\069\000\070\000\143\001\
+    \071\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\068\000\073\000\067\000\
+    \065\000\066\000\080\000\083\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\087\000\094\000\
+    \093\000\159\000\016\000\162\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \190\000\169\001\168\001\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\137\001\136\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\134\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\117\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\116\001\016\000\016\000\118\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\115\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\098\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\097\001\016\000\016\000\096\001\016\000\
+    \095\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\090\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\086\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\075\001\016\000\016\000\074\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\067\001\016\000\016\000\016\000\
+    \066\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\065\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\061\001\016\000\016\000\
+    \016\000\016\000\016\000\060\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \055\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\048\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \049\001\016\000\016\000\016\000\016\000\016\000\047\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\027\001\026\001\016\000\
+    \016\000\016\000\016\000\016\000\024\001\025\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\002\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\001\001\016\000\
+    \016\000\000\001\016\000\016\000\255\000\016\000\016\000\254\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\251\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\242\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\241\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\219\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\218\000\
+    \016\000\016\000\217\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \213\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\196\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\195\000\
+    \016\000\016\000\016\000\016\000\194\000\016\000\016\000\016\000\
+    \193\000\016\000\016\000\016\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\159\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\000\000\121\000\167\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\095\000\089\000\086\000\000\000\082\000\096\000\090\000\
+    \092\000\000\000\000\000\000\000\120\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\160\000\097\000\000\000\000\000\000\000\
+    \000\000\000\000\088\000\085\000\084\000\081\000\000\000\000\000\
+    \091\000\000\000\000\000\000\000\000\000\000\000\123\000\000\000\
+    \000\000\000\000\000\000\000\000\120\000\000\000\000\000\000\000\
+    \169\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\037\000\037\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\000\000\
+    \000\000\000\000\000\000\165\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\175\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\174\000\173\000\173\000\172\000\170\000\170\000\170\000\
+    \171\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\166\000\138\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\000\000\000\000\
+    \000\000\000\000\000\000\138\000\138\000\000\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\139\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\000\000\136\000\000\000\136\000\
+    \000\000\075\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\145\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \144\000\143\000\143\000\142\000\140\000\140\000\140\000\141\000\
+    \121\000\000\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\037\000\037\000\037\000\000\000\000\000\000\000\255\255\
+    \000\000\000\000\000\000\131\000\000\000\131\000\000\000\120\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\000\000\000\000\000\000\000\000\
+    \000\000\123\000\000\000\000\000\000\000\000\000\000\000\120\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\122\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\103\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\102\000\101\000\101\000\100\000\098\000\098\000\
+    \098\000\099\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\000\000\120\000\000\000\000\000\000\000\000\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\120\000\000\000\000\000\000\000\000\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\126\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\000\000\000\000\000\000\132\000\000\000\
+    \000\000\000\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\125\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\000\000\000\000\000\000\000\000\
+    \127\000\000\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\125\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\125\000\000\000\000\000\000\000\000\000\000\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\000\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\124\000\124\000\124\000\124\000\124\000\124\000\000\000\
+    \000\000\000\000\125\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\000\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \120\000\124\000\124\000\124\000\124\000\124\000\124\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\125\000\000\000\
+    \000\000\000\000\134\000\000\000\000\000\000\000\000\000\000\000\
+    \120\000\000\000\000\000\000\000\000\000\129\000\000\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\125\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \000\000\138\000\000\000\000\000\000\000\137\000\138\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\000\000\000\000\
+    \000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\138\000\000\000\000\000\
+    \000\000\138\000\000\000\138\000\156\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\000\000\000\000\000\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\000\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \000\000\000\000\000\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\000\000\000\000\000\000\000\000\000\000\000\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\000\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\164\000\000\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\138\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\000\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\000\000\000\000\167\000\188\000\000\000\
+    \000\000\000\000\000\000\188\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\
+    \188\000\000\000\000\000\000\000\000\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\188\000\000\000\000\000\000\000\188\000\000\000\
+    \188\000\187\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\165\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\175\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \174\000\173\000\173\000\172\000\170\000\170\000\170\000\171\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\166\000\255\255\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\000\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\000\000\000\000\167\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\168\000\168\000\168\000\168\000\168\000\168\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\000\000\000\000\
+    \000\000\168\000\168\000\168\000\168\000\168\000\168\000\000\000\
+    \000\000\169\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\165\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\175\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\174\000\173\000\173\000\172\000\170\000\170\000\
+    \170\000\171\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\166\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\192\000\000\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\168\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\209\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\201\000\
+    \016\000\016\000\016\000\016\000\016\000\202\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\200\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\197\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\198\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\199\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\206\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\203\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\204\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\205\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\207\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\208\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\210\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\211\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\212\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \214\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\215\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\216\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\229\000\228\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\225\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \221\000\220\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\223\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \222\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\224\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\226\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\227\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\236\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\230\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\231\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\232\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\233\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\234\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\235\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\237\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\238\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\239\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\240\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\243\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\244\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\245\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\246\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\247\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\248\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\249\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\250\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \252\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\253\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\022\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \013\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\012\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\006\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\003\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \004\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\005\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\007\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\008\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\009\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\010\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\011\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \014\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\015\001\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\017\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\018\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\019\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\020\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\021\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\023\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\039\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\032\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \028\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\029\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\030\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\031\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\033\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\034\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\035\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\036\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\037\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\038\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\041\001\016\000\016\000\
+    \040\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\045\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \042\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\043\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \044\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\046\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\051\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\050\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\052\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\053\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\054\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\056\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\057\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\058\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\059\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\063\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\062\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\064\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\072\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\071\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\068\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\069\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\070\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\073\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\082\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\076\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\077\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\078\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\079\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\080\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\081\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\083\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\084\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\085\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\087\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\088\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\089\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\091\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\092\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\093\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\094\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\111\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\107\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \103\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\099\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\100\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\101\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\102\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\104\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \105\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\106\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\108\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\109\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\110\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\112\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\113\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\114\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\132\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\125\001\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\122\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\119\001\016\000\016\000\016\000\120\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\121\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\123\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\124\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\126\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\127\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\128\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \129\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \130\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\131\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\133\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \135\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \141\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \138\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\139\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\140\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\142\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\000\000\000\000\000\000\000\000\
+    \143\001\000\000\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\165\001\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\167\001\000\000\000\000\000\000\
+    \000\000\166\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\161\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\160\001\
+    \159\001\159\001\158\001\156\001\156\001\156\001\157\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\164\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000";
+  Lexing.lex_check =
+   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \012\000\013\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\040\000\041\000\
+    \042\000\042\000\043\000\044\000\049\000\049\000\050\000\051\000\
+    \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\055\000\066\000\067\000\067\000\015\000\
+    \070\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\054\000\072\000\054\000\
+    \054\000\054\000\078\000\082\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\086\000\089\000\
+    \092\000\138\000\016\000\156\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \187\000\166\001\167\001\255\255\255\255\255\255\255\255\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\255\255\255\255\255\255\255\255\017\000\255\255\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\255\255\255\255\255\255\255\255\
+    \018\000\255\255\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\255\255\
+    \255\255\255\255\255\255\019\000\255\255\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\255\255\255\255\255\255\255\255\020\000\255\255\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\255\255\255\255\255\255\
+    \255\255\021\000\255\255\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \255\255\255\255\255\255\255\255\022\000\255\255\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\255\255\255\255\255\255\255\255\023\000\
+    \255\255\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\255\255\255\255\
+    \255\255\255\255\024\000\255\255\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\255\255\255\255\255\255\255\255\025\000\255\255\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\255\255\255\255\255\255\255\255\
+    \026\000\255\255\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\255\255\
+    \255\255\255\255\255\255\027\000\255\255\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\255\255\255\255\255\255\255\255\028\000\255\255\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\255\255\255\255\255\255\
+    \255\255\029\000\255\255\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \255\255\255\255\255\255\255\255\030\000\255\255\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\255\255\255\255\255\255\255\255\031\000\
+    \255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\
+    \255\255\255\255\032\000\255\255\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\255\255\255\255\255\255\255\255\033\000\255\255\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\
+    \034\000\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\158\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\255\255\037\000\035\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\045\000\046\000\047\000\255\255\048\000\045\000\046\000\
+    \090\000\255\255\255\255\255\255\037\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\158\000\045\000\255\255\255\255\255\255\
+    \255\255\255\255\046\000\047\000\047\000\048\000\255\255\255\255\
+    \090\000\255\255\255\255\255\255\255\255\255\255\037\000\255\255\
+    \255\255\255\255\255\255\255\255\037\000\255\255\255\255\255\255\
+    \035\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\075\000\075\000\075\000\075\000\075\000\
+    \075\000\075\000\075\000\075\000\075\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\255\255\
+    \255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\036\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\255\255\255\255\
+    \255\255\255\255\255\255\036\000\036\000\255\255\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\255\255\120\000\255\255\120\000\
+    \255\255\074\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \038\000\255\255\038\000\038\000\038\000\038\000\038\000\038\000\
+    \038\000\038\000\038\000\038\000\255\255\255\255\255\255\096\000\
+    \255\255\255\255\255\255\125\000\255\255\125\000\255\255\038\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\255\255\255\255\255\255\255\255\
+    \255\255\038\000\255\255\255\255\255\255\255\255\255\255\038\000\
+    \255\255\255\255\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\038\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\255\255\255\255\255\255\
+    \255\255\039\000\255\255\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\255\255\121\000\255\255\255\255\255\255\255\255\
+    \255\255\122\000\122\000\122\000\122\000\122\000\122\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\121\000\255\255\255\255\255\255\255\255\
+    \255\255\122\000\122\000\122\000\122\000\122\000\122\000\124\000\
+    \255\255\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\255\255\255\255\255\255\130\000\255\255\
+    \255\255\255\255\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\255\255\255\255\255\255\255\255\
+    \124\000\255\255\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\126\000\126\000\126\000\126\000\126\000\
+    \126\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\126\000\255\255\255\255\255\255\255\255\255\255\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\255\255\126\000\126\000\126\000\126\000\126\000\
+    \126\000\127\000\127\000\127\000\127\000\127\000\127\000\255\255\
+    \255\255\255\255\126\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\255\255\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \133\000\127\000\127\000\127\000\127\000\127\000\127\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\128\000\255\255\
+    \255\255\255\255\133\000\255\255\255\255\255\255\255\255\255\255\
+    \133\000\255\255\255\255\255\255\255\255\128\000\255\255\128\000\
+    \128\000\128\000\128\000\128\000\128\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\128\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\000\129\000\129\000\129\000\129\000\129\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\000\129\000\129\000\129\000\129\000\129\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \255\255\139\000\255\255\255\255\255\255\135\000\139\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \139\000\139\000\139\000\139\000\139\000\139\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\255\255\255\255\
+    \255\255\255\255\255\255\139\000\255\255\255\255\255\255\255\255\
+    \139\000\139\000\139\000\139\000\139\000\139\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\139\000\255\255\255\255\
+    \255\255\139\000\255\255\139\000\139\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\157\000\157\000\
+    \157\000\157\000\157\000\157\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\160\000\160\000\160\000\
+    \160\000\160\000\160\000\255\255\255\255\255\255\157\000\157\000\
+    \157\000\157\000\157\000\157\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\255\255\160\000\160\000\160\000\
+    \160\000\160\000\160\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\162\000\162\000\162\000\162\000\162\000\162\000\
+    \255\255\255\255\255\255\161\000\161\000\161\000\161\000\161\000\
+    \161\000\255\255\255\255\255\255\255\255\255\255\255\255\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\255\255\162\000\162\000\162\000\162\000\162\000\162\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\163\000\255\255\
+    \163\000\163\000\163\000\163\000\163\000\163\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\163\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\157\001\157\001\157\001\157\001\157\001\
+    \157\001\157\001\157\001\157\001\157\001\157\001\157\001\157\001\
+    \157\001\157\001\157\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\164\000\164\000\164\000\
+    \164\000\164\000\164\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\255\255\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\255\255\255\255\168\000\169\000\255\255\
+    \255\255\255\255\255\255\169\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\169\000\169\000\169\000\
+    \169\000\169\000\169\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\168\000\
+    \169\000\255\255\255\255\255\255\255\255\169\000\169\000\169\000\
+    \169\000\169\000\169\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\169\000\255\255\255\255\255\255\169\000\255\255\
+    \169\000\169\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\169\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\255\255\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\255\255\255\255\188\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\189\000\189\000\189\000\189\000\189\000\189\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \190\000\190\000\190\000\190\000\190\000\190\000\255\255\255\255\
+    \255\255\189\000\189\000\189\000\189\000\189\000\189\000\255\255\
+    \255\255\188\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \190\000\190\000\190\000\190\000\190\000\190\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\191\000\
+    \191\000\191\000\191\000\191\000\191\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\191\000\255\255\191\000\
+    \191\000\191\000\191\000\191\000\191\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\191\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\255\255\192\000\192\000\192\000\192\000\
+    \192\000\192\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\255\255\255\255\255\255\255\255\
+    \193\000\255\255\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\255\255\
+    \255\255\255\255\255\255\194\000\255\255\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\255\255\255\255\255\255\255\255\195\000\255\255\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\255\255\255\255\255\255\
+    \255\255\196\000\255\255\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \255\255\255\255\255\255\255\255\197\000\255\255\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\255\255\255\255\255\255\255\255\198\000\
+    \255\255\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\255\255\255\255\
+    \255\255\255\255\199\000\255\255\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\255\255\255\255\255\255\255\255\200\000\255\255\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\255\255\255\255\255\255\255\255\
+    \201\000\255\255\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\255\255\
+    \255\255\255\255\255\255\202\000\255\255\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\255\255\255\255\255\255\255\255\203\000\255\255\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\204\000\255\255\255\255\255\255\255\255\255\255\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\255\255\255\255\255\255\255\255\204\000\
+    \255\255\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\255\255\255\255\
+    \255\255\255\255\206\000\255\255\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\255\255\255\255\255\255\255\255\207\000\255\255\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\255\255\255\255\255\255\255\255\
+    \208\000\255\255\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\255\255\
+    \255\255\255\255\255\255\209\000\255\255\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\255\255\255\255\255\255\255\255\210\000\255\255\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\211\000\255\255\255\255\255\255\255\255\255\255\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\255\255\255\255\255\255\255\255\211\000\
+    \255\255\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\255\255\255\255\
+    \255\255\255\255\213\000\255\255\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\255\255\255\255\255\255\255\255\214\000\255\255\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\255\255\255\255\255\255\255\255\
+    \215\000\255\255\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\255\255\
+    \255\255\255\255\255\255\216\000\255\255\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\255\255\255\255\255\255\255\255\217\000\255\255\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\255\255\255\255\255\255\
+    \255\255\218\000\255\255\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \255\255\255\255\255\255\255\255\219\000\255\255\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\255\255\255\255\255\255\255\255\220\000\
+    \255\255\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\255\255\255\255\
+    \255\255\255\255\221\000\255\255\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\255\255\255\255\255\255\255\255\222\000\255\255\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\255\255\255\255\255\255\255\255\
+    \223\000\255\255\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\255\255\
+    \255\255\255\255\255\255\224\000\255\255\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\255\255\255\255\255\255\255\255\225\000\255\255\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\255\255\255\255\255\255\
+    \255\255\226\000\255\255\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \255\255\255\255\255\255\255\255\227\000\255\255\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\255\255\255\255\255\255\255\255\228\000\
+    \255\255\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\255\255\255\255\
+    \255\255\255\255\229\000\255\255\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\255\255\255\255\255\255\255\255\230\000\255\255\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\255\255\255\255\255\255\255\255\
+    \231\000\255\255\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\255\255\
+    \255\255\255\255\255\255\232\000\255\255\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\255\255\255\255\255\255\255\255\233\000\255\255\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\255\255\255\255\255\255\
+    \255\255\234\000\255\255\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \255\255\255\255\255\255\255\255\235\000\255\255\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\255\255\255\255\255\255\255\255\236\000\
+    \255\255\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\255\255\255\255\
+    \255\255\255\255\237\000\255\255\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\255\255\255\255\255\255\255\255\238\000\255\255\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\255\255\255\255\255\255\255\255\
+    \239\000\255\255\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\255\255\
+    \255\255\255\255\255\255\240\000\255\255\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\255\255\255\255\255\255\255\255\241\000\255\255\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\255\255\255\255\255\255\
+    \255\255\242\000\255\255\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \255\255\255\255\255\255\255\255\243\000\255\255\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\255\255\255\255\255\255\255\255\244\000\
+    \255\255\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\255\255\255\255\
+    \255\255\255\255\245\000\255\255\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\255\255\255\255\255\255\255\255\246\000\255\255\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\255\255\255\255\255\255\255\255\
+    \247\000\255\255\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\255\255\
+    \255\255\255\255\255\255\248\000\255\255\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\255\255\255\255\255\255\255\255\249\000\255\255\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\255\255\255\255\255\255\
+    \255\255\250\000\255\255\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \255\255\255\255\255\255\255\255\251\000\255\255\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\255\255\255\255\255\255\255\255\252\000\
+    \255\255\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\255\255\255\255\
+    \255\255\255\255\253\000\255\255\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\255\255\255\255\255\255\255\255\254\000\255\255\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\255\255\255\255\255\255\255\
+    \255\000\255\255\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\255\255\
+    \255\255\255\255\255\255\000\001\255\255\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\255\255\255\255\255\255\255\255\001\001\255\255\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\255\255\255\255\255\255\
+    \255\255\002\001\255\255\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \255\255\255\255\255\255\255\255\003\001\255\255\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\255\255\255\255\255\255\255\255\004\001\
+    \255\255\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\255\255\255\255\
+    \255\255\255\255\005\001\255\255\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\255\255\255\255\255\255\255\255\006\001\255\255\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\255\255\255\255\255\255\255\255\
+    \007\001\255\255\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\255\255\
+    \255\255\255\255\255\255\008\001\255\255\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\255\255\255\255\255\255\255\255\009\001\255\255\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\255\255\255\255\255\255\
+    \255\255\010\001\255\255\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \255\255\255\255\255\255\255\255\011\001\255\255\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\255\255\255\255\255\255\255\255\012\001\
+    \255\255\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\255\255\255\255\
+    \255\255\255\255\013\001\255\255\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\255\255\255\255\255\255\255\255\014\001\255\255\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\255\255\255\255\255\255\255\255\
+    \015\001\255\255\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\255\255\
+    \255\255\255\255\255\255\016\001\255\255\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\255\255\255\255\255\255\255\255\017\001\255\255\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\255\255\255\255\255\255\
+    \255\255\018\001\255\255\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \255\255\255\255\255\255\255\255\019\001\255\255\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\255\255\255\255\255\255\255\255\020\001\
+    \255\255\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\255\255\255\255\
+    \255\255\255\255\021\001\255\255\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\255\255\255\255\255\255\255\255\022\001\255\255\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\255\255\255\255\255\255\255\255\
+    \023\001\255\255\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\255\255\
+    \255\255\255\255\255\255\024\001\255\255\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\255\255\255\255\255\255\255\255\025\001\255\255\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\255\255\255\255\255\255\
+    \255\255\026\001\255\255\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \255\255\255\255\255\255\255\255\027\001\255\255\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\255\255\255\255\255\255\255\255\028\001\
+    \255\255\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\255\255\255\255\
+    \255\255\255\255\029\001\255\255\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\255\255\255\255\255\255\255\255\030\001\255\255\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\255\255\255\255\255\255\255\255\
+    \031\001\255\255\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\255\255\
+    \255\255\255\255\255\255\032\001\255\255\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\255\255\255\255\255\255\255\255\033\001\255\255\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\255\255\255\255\255\255\
+    \255\255\034\001\255\255\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \255\255\255\255\255\255\255\255\035\001\255\255\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\255\255\255\255\255\255\255\255\036\001\
+    \255\255\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\255\255\255\255\
+    \255\255\255\255\037\001\255\255\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\255\255\255\255\255\255\255\255\038\001\255\255\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\255\255\255\255\255\255\255\255\
+    \039\001\255\255\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\255\255\
+    \255\255\255\255\255\255\040\001\255\255\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\255\255\255\255\255\255\255\255\041\001\255\255\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\255\255\255\255\255\255\
+    \255\255\042\001\255\255\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \255\255\255\255\255\255\255\255\043\001\255\255\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\255\255\255\255\255\255\255\255\044\001\
+    \255\255\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\255\255\255\255\
+    \255\255\255\255\045\001\255\255\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\255\255\255\255\255\255\255\255\046\001\255\255\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\255\255\255\255\255\255\255\255\
+    \047\001\255\255\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\255\255\
+    \255\255\255\255\255\255\048\001\255\255\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\255\255\255\255\255\255\255\255\049\001\255\255\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\255\255\255\255\255\255\
+    \255\255\050\001\255\255\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \255\255\255\255\255\255\255\255\051\001\255\255\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\255\255\255\255\255\255\255\255\052\001\
+    \255\255\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\255\255\255\255\
+    \255\255\255\255\053\001\255\255\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\255\255\255\255\255\255\255\255\054\001\255\255\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\255\255\255\255\255\255\255\255\
+    \055\001\255\255\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\255\255\
+    \255\255\255\255\255\255\056\001\255\255\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\255\255\255\255\255\255\255\255\057\001\255\255\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\255\255\255\255\255\255\
+    \255\255\058\001\255\255\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \255\255\255\255\255\255\255\255\059\001\255\255\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\255\255\255\255\255\255\255\255\060\001\
+    \255\255\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\255\255\255\255\
+    \255\255\255\255\061\001\255\255\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\255\255\255\255\255\255\255\255\062\001\255\255\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\255\255\255\255\255\255\255\255\
+    \063\001\255\255\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\255\255\
+    \255\255\255\255\255\255\064\001\255\255\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\255\255\255\255\255\255\255\255\065\001\255\255\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\255\255\255\255\255\255\
+    \255\255\066\001\255\255\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \255\255\255\255\255\255\255\255\067\001\255\255\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\255\255\255\255\255\255\255\255\068\001\
+    \255\255\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\255\255\255\255\
+    \255\255\255\255\069\001\255\255\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\255\255\255\255\255\255\255\255\070\001\255\255\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\255\255\255\255\255\255\255\255\
+    \071\001\255\255\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\255\255\
+    \255\255\255\255\255\255\072\001\255\255\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\255\255\255\255\255\255\255\255\073\001\255\255\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\255\255\255\255\255\255\
+    \255\255\074\001\255\255\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \255\255\255\255\255\255\255\255\075\001\255\255\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\255\255\255\255\255\255\255\255\076\001\
+    \255\255\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\255\255\255\255\
+    \255\255\255\255\077\001\255\255\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\255\255\255\255\255\255\255\255\078\001\255\255\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\255\255\255\255\255\255\255\255\
+    \079\001\255\255\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\255\255\
+    \255\255\255\255\255\255\080\001\255\255\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\255\255\255\255\255\255\255\255\081\001\255\255\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\255\255\255\255\255\255\
+    \255\255\082\001\255\255\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \255\255\255\255\255\255\255\255\083\001\255\255\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\255\255\255\255\255\255\255\255\084\001\
+    \255\255\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\255\255\255\255\
+    \255\255\255\255\085\001\255\255\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\255\255\255\255\255\255\255\255\086\001\255\255\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\255\255\255\255\255\255\255\255\
+    \087\001\255\255\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\255\255\
+    \255\255\255\255\255\255\088\001\255\255\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\255\255\255\255\255\255\255\255\089\001\255\255\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\255\255\255\255\255\255\
+    \255\255\090\001\255\255\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \255\255\255\255\255\255\255\255\091\001\255\255\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\255\255\255\255\255\255\255\255\092\001\
+    \255\255\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\255\255\255\255\
+    \255\255\255\255\093\001\255\255\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\255\255\255\255\255\255\255\255\094\001\255\255\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\255\255\255\255\255\255\255\255\
+    \095\001\255\255\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\255\255\
+    \255\255\255\255\255\255\096\001\255\255\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\255\255\255\255\255\255\255\255\097\001\255\255\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\255\255\255\255\255\255\
+    \255\255\098\001\255\255\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \255\255\255\255\255\255\255\255\099\001\255\255\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\255\255\255\255\255\255\255\255\100\001\
+    \255\255\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\255\255\255\255\
+    \255\255\255\255\101\001\255\255\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\255\255\255\255\255\255\255\255\102\001\255\255\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\255\255\255\255\255\255\255\255\
+    \103\001\255\255\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\255\255\
+    \255\255\255\255\255\255\104\001\255\255\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\255\255\255\255\255\255\255\255\105\001\255\255\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\255\255\255\255\255\255\
+    \255\255\106\001\255\255\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \255\255\255\255\255\255\255\255\107\001\255\255\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\255\255\255\255\255\255\255\255\108\001\
+    \255\255\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\255\255\255\255\
+    \255\255\255\255\109\001\255\255\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\255\255\255\255\255\255\255\255\110\001\255\255\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\255\255\255\255\255\255\255\255\
+    \111\001\255\255\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\255\255\
+    \255\255\255\255\255\255\112\001\255\255\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\255\255\255\255\255\255\255\255\113\001\255\255\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\255\255\255\255\255\255\
+    \255\255\114\001\255\255\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \255\255\255\255\255\255\255\255\115\001\255\255\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\255\255\255\255\255\255\255\255\116\001\
+    \255\255\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\255\255\255\255\
+    \255\255\255\255\117\001\255\255\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\255\255\255\255\255\255\255\255\118\001\255\255\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\255\255\255\255\255\255\255\255\
+    \119\001\255\255\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\255\255\
+    \255\255\255\255\255\255\120\001\255\255\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\255\255\255\255\255\255\255\255\121\001\255\255\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\255\255\255\255\255\255\
+    \255\255\122\001\255\255\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \255\255\255\255\255\255\255\255\123\001\255\255\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\255\255\255\255\255\255\255\255\124\001\
+    \255\255\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\255\255\255\255\
+    \255\255\255\255\125\001\255\255\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\255\255\255\255\255\255\255\255\126\001\255\255\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\255\255\255\255\255\255\255\255\
+    \127\001\255\255\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\255\255\
+    \255\255\255\255\255\255\128\001\255\255\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\255\255\255\255\255\255\255\255\129\001\255\255\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\255\255\255\255\255\255\
+    \255\255\130\001\255\255\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \255\255\255\255\255\255\255\255\131\001\255\255\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\255\255\255\255\255\255\255\255\132\001\
+    \255\255\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\255\255\255\255\
+    \255\255\255\255\133\001\255\255\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\255\255\255\255\255\255\255\255\134\001\255\255\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\255\255\255\255\255\255\255\255\
+    \135\001\255\255\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\255\255\
+    \255\255\255\255\255\255\136\001\255\255\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\255\255\255\255\255\255\255\255\137\001\255\255\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\255\255\255\255\255\255\
+    \255\255\138\001\255\255\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \255\255\255\255\255\255\255\255\139\001\255\255\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\255\255\255\255\255\255\255\255\140\001\
+    \255\255\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\255\255\255\255\
+    \255\255\255\255\141\001\255\255\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\255\255\255\255\255\255\255\255\142\001\255\255\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\255\255\255\255\255\255\255\255\
+    \143\001\255\255\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\154\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\154\001\255\255\255\255\255\255\
+    \255\255\154\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_base_code =
+   "";
+  Lexing.lex_backtrk_code =
+   "";
+  Lexing.lex_default_code =
+   "";
+  Lexing.lex_trans_code =
+   "";
+  Lexing.lex_check_code =
+   "";
+  Lexing.lex_code =
+   "";
+}
+
+let rec token mode lexbuf =
+   __ocaml_lex_token_rec mode lexbuf 0
+and __ocaml_lex_token_rec mode lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 120 "mo_frontend/source_lexer.mll"
+        ( LPAR )
+# 6195 "mo_frontend/source_lexer.ml"
+
+  | 1 ->
+# 121 "mo_frontend/source_lexer.mll"
+        ( RPAR )
+# 6200 "mo_frontend/source_lexer.ml"
+
+  | 2 ->
+# 122 "mo_frontend/source_lexer.mll"
+        ( LBRACKET )
+# 6205 "mo_frontend/source_lexer.ml"
+
+  | 3 ->
+# 123 "mo_frontend/source_lexer.mll"
+        ( RBRACKET )
+# 6210 "mo_frontend/source_lexer.ml"
+
+  | 4 ->
+# 124 "mo_frontend/source_lexer.mll"
+        ( LCURLY )
+# 6215 "mo_frontend/source_lexer.ml"
+
+  | 5 ->
+# 125 "mo_frontend/source_lexer.mll"
+        ( RCURLY )
+# 6220 "mo_frontend/source_lexer.ml"
+
+  | 6 ->
+# 126 "mo_frontend/source_lexer.mll"
+        ( SEMICOLON )
+# 6225 "mo_frontend/source_lexer.ml"
+
+  | 7 ->
+# 127 "mo_frontend/source_lexer.mll"
+        ( COMMA )
+# 6230 "mo_frontend/source_lexer.ml"
+
+  | 8 ->
+# 128 "mo_frontend/source_lexer.mll"
+        ( COLON )
+# 6235 "mo_frontend/source_lexer.ml"
+
+  | 9 ->
+# 129 "mo_frontend/source_lexer.mll"
+         ( SUB )
+# 6240 "mo_frontend/source_lexer.ml"
+
+  | 10 ->
+# 130 "mo_frontend/source_lexer.mll"
+        ( DOT )
+# 6245 "mo_frontend/source_lexer.ml"
+
+  | 11 ->
+# 131 "mo_frontend/source_lexer.mll"
+        ( QUEST )
+# 6250 "mo_frontend/source_lexer.ml"
+
+  | 12 ->
+# 132 "mo_frontend/source_lexer.mll"
+        ( BANG )
+# 6255 "mo_frontend/source_lexer.ml"
+
+  | 13 ->
+# 133 "mo_frontend/source_lexer.mll"
+        ( EQ )
+# 6260 "mo_frontend/source_lexer.ml"
+
+  | 14 ->
+# 134 "mo_frontend/source_lexer.mll"
+        ( LT )
+# 6265 "mo_frontend/source_lexer.ml"
+
+  | 15 ->
+# 135 "mo_frontend/source_lexer.mll"
+        ( GT )
+# 6270 "mo_frontend/source_lexer.ml"
+
+  | 16 ->
+# 136 "mo_frontend/source_lexer.mll"
+        ( ADDOP )
+# 6275 "mo_frontend/source_lexer.ml"
+
+  | 17 ->
+# 137 "mo_frontend/source_lexer.mll"
+        ( SUBOP )
+# 6280 "mo_frontend/source_lexer.ml"
+
+  | 18 ->
+# 138 "mo_frontend/source_lexer.mll"
+        ( MULOP )
+# 6285 "mo_frontend/source_lexer.ml"
+
+  | 19 ->
+# 139 "mo_frontend/source_lexer.mll"
+        ( DIVOP )
+# 6290 "mo_frontend/source_lexer.ml"
+
+  | 20 ->
+# 140 "mo_frontend/source_lexer.mll"
+        ( MODOP )
+# 6295 "mo_frontend/source_lexer.ml"
+
+  | 21 ->
+# 141 "mo_frontend/source_lexer.mll"
+         ( POWOP )
+# 6300 "mo_frontend/source_lexer.ml"
+
+  | 22 ->
+# 142 "mo_frontend/source_lexer.mll"
+        ( ANDOP )
+# 6305 "mo_frontend/source_lexer.ml"
+
+  | 23 ->
+# 143 "mo_frontend/source_lexer.mll"
+        ( OROP )
+# 6310 "mo_frontend/source_lexer.ml"
+
+  | 24 ->
+# 144 "mo_frontend/source_lexer.mll"
+         ( PIPE )
+# 6315 "mo_frontend/source_lexer.ml"
+
+  | 25 ->
+# 145 "mo_frontend/source_lexer.mll"
+        ( XOROP )
+# 6320 "mo_frontend/source_lexer.ml"
+
+  | 26 ->
+# 146 "mo_frontend/source_lexer.mll"
+         ( SHLOP )
+# 6325 "mo_frontend/source_lexer.ml"
+
+  | 27 ->
+# 147 "mo_frontend/source_lexer.mll"
+          ( ROTLOP )
+# 6330 "mo_frontend/source_lexer.ml"
+
+  | 28 ->
+# 148 "mo_frontend/source_lexer.mll"
+          ( ROTROP )
+# 6335 "mo_frontend/source_lexer.ml"
+
+  | 29 ->
+# 149 "mo_frontend/source_lexer.mll"
+         ( WRAPADDOP )
+# 6340 "mo_frontend/source_lexer.ml"
+
+  | 30 ->
+# 150 "mo_frontend/source_lexer.mll"
+         ( WRAPSUBOP )
+# 6345 "mo_frontend/source_lexer.ml"
+
+  | 31 ->
+# 151 "mo_frontend/source_lexer.mll"
+         ( WRAPMULOP )
+# 6350 "mo_frontend/source_lexer.ml"
+
+  | 32 ->
+# 152 "mo_frontend/source_lexer.mll"
+          ( WRAPPOWOP )
+# 6355 "mo_frontend/source_lexer.ml"
+
+  | 33 ->
+# 153 "mo_frontend/source_lexer.mll"
+        ( HASH )
+# 6360 "mo_frontend/source_lexer.ml"
+
+  | 34 ->
+# 155 "mo_frontend/source_lexer.mll"
+         ( EQOP )
+# 6365 "mo_frontend/source_lexer.ml"
+
+  | 35 ->
+# 156 "mo_frontend/source_lexer.mll"
+         ( NEQOP )
+# 6370 "mo_frontend/source_lexer.ml"
+
+  | 36 ->
+# 157 "mo_frontend/source_lexer.mll"
+         ( GEOP )
+# 6375 "mo_frontend/source_lexer.ml"
+
+  | 37 ->
+# 158 "mo_frontend/source_lexer.mll"
+         ( LEOP )
+# 6380 "mo_frontend/source_lexer.ml"
+
+  | 38 ->
+# 159 "mo_frontend/source_lexer.mll"
+         ( ASSIGN )
+# 6385 "mo_frontend/source_lexer.ml"
+
+  | 39 ->
+# 161 "mo_frontend/source_lexer.mll"
+         ( PLUSASSIGN )
+# 6390 "mo_frontend/source_lexer.ml"
+
+  | 40 ->
+# 162 "mo_frontend/source_lexer.mll"
+         ( MINUSASSIGN )
+# 6395 "mo_frontend/source_lexer.ml"
+
+  | 41 ->
+# 163 "mo_frontend/source_lexer.mll"
+         ( MULASSIGN )
+# 6400 "mo_frontend/source_lexer.ml"
+
+  | 42 ->
+# 164 "mo_frontend/source_lexer.mll"
+         ( DIVASSIGN )
+# 6405 "mo_frontend/source_lexer.ml"
+
+  | 43 ->
+# 165 "mo_frontend/source_lexer.mll"
+         ( MODASSIGN )
+# 6410 "mo_frontend/source_lexer.ml"
+
+  | 44 ->
+# 166 "mo_frontend/source_lexer.mll"
+          ( POWASSIGN )
+# 6415 "mo_frontend/source_lexer.ml"
+
+  | 45 ->
+# 167 "mo_frontend/source_lexer.mll"
+         ( ANDASSIGN )
+# 6420 "mo_frontend/source_lexer.ml"
+
+  | 46 ->
+# 168 "mo_frontend/source_lexer.mll"
+         ( ORASSIGN )
+# 6425 "mo_frontend/source_lexer.ml"
+
+  | 47 ->
+# 169 "mo_frontend/source_lexer.mll"
+         ( XORASSIGN )
+# 6430 "mo_frontend/source_lexer.ml"
+
+  | 48 ->
+# 170 "mo_frontend/source_lexer.mll"
+          ( SHLASSIGN )
+# 6435 "mo_frontend/source_lexer.ml"
+
+  | 49 ->
+# 171 "mo_frontend/source_lexer.mll"
+          ( SHRASSIGN )
+# 6440 "mo_frontend/source_lexer.ml"
+
+  | 50 ->
+# 172 "mo_frontend/source_lexer.mll"
+           ( ROTLASSIGN )
+# 6445 "mo_frontend/source_lexer.ml"
+
+  | 51 ->
+# 173 "mo_frontend/source_lexer.mll"
+           ( ROTRASSIGN )
+# 6450 "mo_frontend/source_lexer.ml"
+
+  | 52 ->
+# 174 "mo_frontend/source_lexer.mll"
+          ( WRAPADDASSIGN )
+# 6455 "mo_frontend/source_lexer.ml"
+
+  | 53 ->
+# 175 "mo_frontend/source_lexer.mll"
+          ( WRAPSUBASSIGN )
+# 6460 "mo_frontend/source_lexer.ml"
+
+  | 54 ->
+# 176 "mo_frontend/source_lexer.mll"
+          ( WRAPMULASSIGN )
+# 6465 "mo_frontend/source_lexer.ml"
+
+  | 55 ->
+# 177 "mo_frontend/source_lexer.mll"
+           ( WRAPPOWASSIGN )
+# 6470 "mo_frontend/source_lexer.ml"
+
+  | 56 ->
+# 178 "mo_frontend/source_lexer.mll"
+         ( CATASSIGN )
+# 6475 "mo_frontend/source_lexer.ml"
+
+  | 57 ->
+# 179 "mo_frontend/source_lexer.mll"
+         ( ARROW )
+# 6480 "mo_frontend/source_lexer.ml"
+
+  | 58 ->
+# 180 "mo_frontend/source_lexer.mll"
+        ( UNDERSCORE )
+# 6485 "mo_frontend/source_lexer.ml"
+
+  | 59 ->
+let
+# 182 "mo_frontend/source_lexer.mll"
+                s
+# 6491 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 1) lexbuf.Lexing.lex_curr_pos in
+# 182 "mo_frontend/source_lexer.mll"
+                   ( DOT_NUM s )
+# 6495 "mo_frontend/source_lexer.ml"
+
+  | 60 ->
+let
+# 183 "mo_frontend/source_lexer.mll"
+           s
+# 6501 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 183 "mo_frontend/source_lexer.mll"
+             ( NAT s )
+# 6505 "mo_frontend/source_lexer.ml"
+
+  | 61 ->
+let
+# 184 "mo_frontend/source_lexer.mll"
+             s
+# 6511 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 184 "mo_frontend/source_lexer.mll"
+               ( FLOAT s )
+# 6515 "mo_frontend/source_lexer.ml"
+
+  | 62 ->
+let
+# 185 "mo_frontend/source_lexer.mll"
+            s
+# 6521 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 185 "mo_frontend/source_lexer.mll"
+              ( CHAR (char lexbuf s) )
+# 6525 "mo_frontend/source_lexer.ml"
+
+  | 63 ->
+let
+# 186 "mo_frontend/source_lexer.mll"
+            s
+# 6531 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 186 "mo_frontend/source_lexer.mll"
+              ( TEXT (text lexbuf s) )
+# 6535 "mo_frontend/source_lexer.ml"
+
+  | 64 ->
+# 188 "mo_frontend/source_lexer.mll"
+    ( error lexbuf "unclosed text literal" )
+# 6540 "mo_frontend/source_lexer.ml"
+
+  | 65 ->
+# 190 "mo_frontend/source_lexer.mll"
+    ( error lexbuf "illegal control character in text literal" )
+# 6545 "mo_frontend/source_lexer.ml"
+
+  | 66 ->
+# 192 "mo_frontend/source_lexer.mll"
+    ( error_nest (Lexing.lexeme_end_p lexbuf) lexbuf "illegal escape" )
+# 6550 "mo_frontend/source_lexer.ml"
+
+  | 67 ->
+# 199 "mo_frontend/source_lexer.mll"
+            ( ACTOR )
+# 6555 "mo_frontend/source_lexer.ml"
+
+  | 68 ->
+# 200 "mo_frontend/source_lexer.mll"
+          ( AND )
+# 6560 "mo_frontend/source_lexer.ml"
+
+  | 69 ->
+# 201 "mo_frontend/source_lexer.mll"
+            ( ASYNC )
+# 6565 "mo_frontend/source_lexer.ml"
+
+  | 70 ->
+# 202 "mo_frontend/source_lexer.mll"
+             ( ASYNCSTAR )
+# 6570 "mo_frontend/source_lexer.ml"
+
+  | 71 ->
+# 203 "mo_frontend/source_lexer.mll"
+             ( ASSERT )
+# 6575 "mo_frontend/source_lexer.ml"
+
+  | 72 ->
+# 204 "mo_frontend/source_lexer.mll"
+            ( AWAIT )
+# 6580 "mo_frontend/source_lexer.ml"
+
+  | 73 ->
+# 205 "mo_frontend/source_lexer.mll"
+             ( AWAITSTAR )
+# 6585 "mo_frontend/source_lexer.ml"
+
+  | 74 ->
+# 206 "mo_frontend/source_lexer.mll"
+            ( BREAK )
+# 6590 "mo_frontend/source_lexer.ml"
+
+  | 75 ->
+# 207 "mo_frontend/source_lexer.mll"
+           ( CASE )
+# 6595 "mo_frontend/source_lexer.ml"
+
+  | 76 ->
+# 208 "mo_frontend/source_lexer.mll"
+            ( CATCH )
+# 6600 "mo_frontend/source_lexer.ml"
+
+  | 77 ->
+# 209 "mo_frontend/source_lexer.mll"
+            ( CLASS )
+# 6605 "mo_frontend/source_lexer.ml"
+
+  | 78 ->
+# 210 "mo_frontend/source_lexer.mll"
+                ( COMPOSITE )
+# 6610 "mo_frontend/source_lexer.ml"
+
+  | 79 ->
+# 211 "mo_frontend/source_lexer.mll"
+               ( CONTINUE )
+# 6615 "mo_frontend/source_lexer.ml"
+
+  | 80 ->
+# 212 "mo_frontend/source_lexer.mll"
+            ( DEBUG )
+# 6620 "mo_frontend/source_lexer.ml"
+
+  | 81 ->
+# 213 "mo_frontend/source_lexer.mll"
+                 ( DEBUG_SHOW )
+# 6625 "mo_frontend/source_lexer.ml"
+
+  | 82 ->
+# 214 "mo_frontend/source_lexer.mll"
+         ( DO )
+# 6630 "mo_frontend/source_lexer.ml"
+
+  | 83 ->
+# 215 "mo_frontend/source_lexer.mll"
+           ( ELSE )
+# 6635 "mo_frontend/source_lexer.ml"
+
+  | 84 ->
+# 216 "mo_frontend/source_lexer.mll"
+            ( BOOL false )
+# 6640 "mo_frontend/source_lexer.ml"
+
+  | 85 ->
+# 217 "mo_frontend/source_lexer.mll"
+               ( FLEXIBLE )
+# 6645 "mo_frontend/source_lexer.ml"
+
+  | 86 ->
+# 218 "mo_frontend/source_lexer.mll"
+          ( FOR )
+# 6650 "mo_frontend/source_lexer.ml"
+
+  | 87 ->
+# 219 "mo_frontend/source_lexer.mll"
+                  ( FROM_CANDID )
+# 6655 "mo_frontend/source_lexer.ml"
+
+  | 88 ->
+# 220 "mo_frontend/source_lexer.mll"
+           ( FUNC )
+# 6660 "mo_frontend/source_lexer.ml"
+
+  | 89 ->
+# 221 "mo_frontend/source_lexer.mll"
+         ( IF )
+# 6665 "mo_frontend/source_lexer.ml"
+
+  | 90 ->
+# 222 "mo_frontend/source_lexer.mll"
+             ( IGNORE )
+# 6670 "mo_frontend/source_lexer.ml"
+
+  | 91 ->
+# 223 "mo_frontend/source_lexer.mll"
+         ( IN )
+# 6675 "mo_frontend/source_lexer.ml"
+
+  | 92 ->
+let
+# 224 "mo_frontend/source_lexer.mll"
+                   s
+# 6681 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 9) in
+# 224 "mo_frontend/source_lexer.mll"
+                     ( if mode.verification then INVARIANT else ID s )
+# 6685 "mo_frontend/source_lexer.ml"
+
+  | 93 ->
+let
+# 225 "mo_frontend/source_lexer.mll"
+                 s
+# 6691 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 7) in
+# 225 "mo_frontend/source_lexer.mll"
+                   ( if mode.verification then IMPLIES else ID s )
+# 6695 "mo_frontend/source_lexer.ml"
+
+  | 94 ->
+let
+# 226 "mo_frontend/source_lexer.mll"
+             s
+# 6701 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 3) in
+# 226 "mo_frontend/source_lexer.mll"
+               ( if mode.verification then OLD else ID s )
+# 6705 "mo_frontend/source_lexer.ml"
+
+  | 95 ->
+# 227 "mo_frontend/source_lexer.mll"
+             ( IMPORT )
+# 6710 "mo_frontend/source_lexer.ml"
+
+  | 96 ->
+# 228 "mo_frontend/source_lexer.mll"
+             ( MODULE )
+# 6715 "mo_frontend/source_lexer.ml"
+
+  | 97 ->
+# 229 "mo_frontend/source_lexer.mll"
+          ( NOT )
+# 6720 "mo_frontend/source_lexer.ml"
+
+  | 98 ->
+# 230 "mo_frontend/source_lexer.mll"
+           ( NULL )
+# 6725 "mo_frontend/source_lexer.ml"
+
+  | 99 ->
+# 231 "mo_frontend/source_lexer.mll"
+             ( OBJECT )
+# 6730 "mo_frontend/source_lexer.ml"
+
+  | 100 ->
+# 232 "mo_frontend/source_lexer.mll"
+         ( OR )
+# 6735 "mo_frontend/source_lexer.ml"
+
+  | 101 ->
+# 233 "mo_frontend/source_lexer.mll"
+            ( LABEL )
+# 6740 "mo_frontend/source_lexer.ml"
+
+  | 102 ->
+# 234 "mo_frontend/source_lexer.mll"
+          ( LET )
+# 6745 "mo_frontend/source_lexer.ml"
+
+  | 103 ->
+# 235 "mo_frontend/source_lexer.mll"
+           ( LOOP )
+# 6750 "mo_frontend/source_lexer.ml"
+
+  | 104 ->
+# 236 "mo_frontend/source_lexer.mll"
+              ( PRIVATE )
+# 6755 "mo_frontend/source_lexer.ml"
+
+  | 105 ->
+# 237 "mo_frontend/source_lexer.mll"
+             ( PUBLIC )
+# 6760 "mo_frontend/source_lexer.ml"
+
+  | 106 ->
+# 238 "mo_frontend/source_lexer.mll"
+            ( QUERY )
+# 6765 "mo_frontend/source_lexer.ml"
+
+  | 107 ->
+# 239 "mo_frontend/source_lexer.mll"
+             ( RETURN )
+# 6770 "mo_frontend/source_lexer.ml"
+
+  | 108 ->
+# 240 "mo_frontend/source_lexer.mll"
+             ( SHARED )
+# 6775 "mo_frontend/source_lexer.ml"
+
+  | 109 ->
+# 241 "mo_frontend/source_lexer.mll"
+             ( STABLE )
+# 6780 "mo_frontend/source_lexer.ml"
+
+  | 110 ->
+# 242 "mo_frontend/source_lexer.mll"
+             ( SWITCH )
+# 6785 "mo_frontend/source_lexer.ml"
+
+  | 111 ->
+# 243 "mo_frontend/source_lexer.mll"
+             ( SYSTEM )
+# 6790 "mo_frontend/source_lexer.ml"
+
+  | 112 ->
+# 244 "mo_frontend/source_lexer.mll"
+          ( TRY )
+# 6795 "mo_frontend/source_lexer.ml"
+
+  | 113 ->
+# 245 "mo_frontend/source_lexer.mll"
+            ( THROW )
+# 6800 "mo_frontend/source_lexer.ml"
+
+  | 114 ->
+# 246 "mo_frontend/source_lexer.mll"
+                ( TO_CANDID )
+# 6805 "mo_frontend/source_lexer.ml"
+
+  | 115 ->
+# 247 "mo_frontend/source_lexer.mll"
+           ( BOOL true )
+# 6810 "mo_frontend/source_lexer.ml"
+
+  | 116 ->
+# 248 "mo_frontend/source_lexer.mll"
+           ( TYPE )
+# 6815 "mo_frontend/source_lexer.ml"
+
+  | 117 ->
+# 249 "mo_frontend/source_lexer.mll"
+          ( VAR )
+# 6820 "mo_frontend/source_lexer.ml"
+
+  | 118 ->
+# 250 "mo_frontend/source_lexer.mll"
+            ( WHILE )
+# 6825 "mo_frontend/source_lexer.ml"
+
+  | 119 ->
+# 251 "mo_frontend/source_lexer.mll"
+           ( WITH )
+# 6830 "mo_frontend/source_lexer.ml"
+
+  | 120 ->
+let
+# 253 "mo_frontend/source_lexer.mll"
+              s
+# 6836 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 4) in
+# 253 "mo_frontend/source_lexer.mll"
+                ( if mode.privileged then PRIM else ID s )
+# 6840 "mo_frontend/source_lexer.ml"
+
+  | 121 ->
+let
+# 254 "mo_frontend/source_lexer.mll"
+          s
+# 6846 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 254 "mo_frontend/source_lexer.mll"
+            ( ID s )
+# 6850 "mo_frontend/source_lexer.ml"
+
+  | 122 ->
+let
+# 255 "mo_frontend/source_lexer.mll"
+                     s
+# 6856 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 255 "mo_frontend/source_lexer.mll"
+                       ( if mode.privileged then ID s else error lexbuf "privileged identifier" )
+# 6860 "mo_frontend/source_lexer.ml"
+
+  | 123 ->
+let
+# 257 "mo_frontend/source_lexer.mll"
+                       s
+# 6866 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 257 "mo_frontend/source_lexer.mll"
+                         ( COMMENT s )
+# 6870 "mo_frontend/source_lexer.ml"
+
+  | 124 ->
+let
+# 258 "mo_frontend/source_lexer.mll"
+            s
+# 6876 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 258 "mo_frontend/source_lexer.mll"
+              (
+    let buf = Buffer.create 100 in
+    Buffer.add_string buf s;
+    (comment buf (Lexing.lexeme_start_p lexbuf) lexbuf);
+    COMMENT (Buffer.contents buf)
+  )
+# 6885 "mo_frontend/source_lexer.ml"
+
+  | 125 ->
+let
+# 264 "mo_frontend/source_lexer.mll"
+             t
+# 6891 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 264 "mo_frontend/source_lexer.mll"
+               ( TAB (String.length t) )
+# 6895 "mo_frontend/source_lexer.ml"
+
+  | 126 ->
+let
+# 265 "mo_frontend/source_lexer.mll"
+            s
+# 6901 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 265 "mo_frontend/source_lexer.mll"
+              ( let len = String.length s in if len = 1 then SINGLESPACE else SPACE len )
+# 6905 "mo_frontend/source_lexer.ml"
+
+  | 127 ->
+# 266 "mo_frontend/source_lexer.mll"
+           ( Lexing.new_line lexbuf; LINEFEED CRLF )
+# 6910 "mo_frontend/source_lexer.ml"
+
+  | 128 ->
+# 267 "mo_frontend/source_lexer.mll"
+         ( Lexing.new_line lexbuf; LINEFEED CRLF )
+# 6915 "mo_frontend/source_lexer.ml"
+
+  | 129 ->
+# 268 "mo_frontend/source_lexer.mll"
+         ( Lexing.new_line lexbuf; LINEFEED LF )
+# 6920 "mo_frontend/source_lexer.ml"
+
+  | 130 ->
+# 269 "mo_frontend/source_lexer.mll"
+        ( EOF )
+# 6925 "mo_frontend/source_lexer.ml"
+
+  | 131 ->
+# 271 "mo_frontend/source_lexer.mll"
+         ( error lexbuf "malformed operator" )
+# 6930 "mo_frontend/source_lexer.ml"
+
+  | 132 ->
+# 272 "mo_frontend/source_lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 6935 "mo_frontend/source_lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_token_rec mode lexbuf __ocaml_lex_state
+
+and comment buf start lexbuf =
+   __ocaml_lex_comment_rec buf start lexbuf 410
+and __ocaml_lex_comment_rec buf start lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+let
+# 275 "mo_frontend/source_lexer.mll"
+            s
+# 6948 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 275 "mo_frontend/source_lexer.mll"
+              ( Buffer.add_string buf s )
+# 6952 "mo_frontend/source_lexer.ml"
+
+  | 1 ->
+let
+# 276 "mo_frontend/source_lexer.mll"
+            s
+# 6958 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 276 "mo_frontend/source_lexer.mll"
+              (
+    Buffer.add_string buf s;
+    comment buf (Lexing.lexeme_start_p lexbuf) lexbuf;
+    comment buf start lexbuf
+  )
+# 6966 "mo_frontend/source_lexer.ml"
+
+  | 2 ->
+let
+# 281 "mo_frontend/source_lexer.mll"
+            s
+# 6972 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
+# 281 "mo_frontend/source_lexer.mll"
+              (
+    Lexing.new_line lexbuf;
+    Buffer.add_char buf s;
+    comment buf start lexbuf
+  )
+# 6980 "mo_frontend/source_lexer.ml"
+
+  | 3 ->
+# 286 "mo_frontend/source_lexer.mll"
+        ( error_nest start lexbuf "unclosed comment" )
+# 6985 "mo_frontend/source_lexer.ml"
+
+  | 4 ->
+let
+# 287 "mo_frontend/source_lexer.mll"
+            s
+# 6991 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 287 "mo_frontend/source_lexer.mll"
+              (
+    Buffer.add_string buf s;
+    comment buf start lexbuf
+  )
+# 6998 "mo_frontend/source_lexer.ml"
+
+  | 5 ->
+# 291 "mo_frontend/source_lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 7003 "mo_frontend/source_lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_comment_rec buf start lexbuf __ocaml_lex_state
+
+;;
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/source_token.ml.html b/coverage/mo_frontend/source_token.ml.html new file mode 100644 index 00000000000..783e15335e5 --- /dev/null +++ b/coverage/mo_frontend/source_token.ml.html @@ -0,0 +1,1419 @@ + + + + + source_token.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+
+
open Mo_def.Trivia
+
+type token =
+  | EOF
+  | DISALLOWED
+  | LET
+  | VAR
+  | LPAR
+  | RPAR
+  | LBRACKET
+  | RBRACKET
+  | LCURLY
+  | RCURLY
+  | AWAIT
+  | AWAITSTAR
+  | ASYNC
+  | ASYNCSTAR
+  | BREAK
+  | CASE
+  | CATCH
+  | CONTINUE
+  | LABEL
+  | DEBUG
+  | DO
+  | FLEXIBLE
+  | IF
+  | IGNORE
+  | IN
+  | ELSE
+  | SWITCH
+  | LOOP
+  | WHILE
+  | FOR
+  | RETURN
+  | SYSTEM
+  | STABLE
+  | TRY
+  | THROW
+  | WITH
+  | ARROW
+  | ASSIGN
+  | FUNC
+  | TYPE
+  | OBJECT
+  | ACTOR
+  | CLASS
+  | PUBLIC
+  | PRIVATE
+  | SHARED
+  | QUERY
+  | SEMICOLON
+  | COMMA
+  | COLON
+  | SUB
+  | DOT
+  | QUEST
+  | BANG
+  | AND
+  | OR
+  | IMPLIES
+  | OLD
+  | NOT
+  | IMPORT
+  | MODULE
+  | DEBUG_SHOW
+  | TO_CANDID
+  | FROM_CANDID
+  | ASSERT
+  | ADDOP
+  | SUBOP
+  | MULOP
+  | DIVOP
+  | MODOP
+  | POWOP
+  | WRAPADDOP
+  | WRAPSUBOP
+  | WRAPMULOP
+  | WRAPPOWOP
+  | WRAPADDASSIGN
+  | WRAPSUBASSIGN
+  | WRAPMULASSIGN
+  | WRAPPOWASSIGN
+  | ANDOP
+  | OROP
+  | XOROP
+  | SHLOP
+  | ROTLOP
+  | ROTROP
+  | EQOP
+  | NEQOP
+  | LEOP
+  | GEOP
+  | HASH
+  | EQ
+  | LT
+  | GT
+  | PLUSASSIGN
+  | MINUSASSIGN
+  | MULASSIGN
+  | DIVASSIGN
+  | MODASSIGN
+  | POWASSIGN
+  | CATASSIGN
+  | ANDASSIGN
+  | ORASSIGN
+  | XORASSIGN
+  | SHLASSIGN
+  | SHRASSIGN
+  | ROTLASSIGN
+  | ROTRASSIGN
+  | NULL
+  | DOT_NUM of string
+  | NAT of string
+  | FLOAT of string
+  | CHAR of Mo_values.Value.unicode
+  | BOOL of bool
+  | ID of string
+  | TEXT of string
+  | PRIM
+  | UNDERSCORE
+  | COMPOSITE
+  | INVARIANT
+  (* Trivia *)
+  | LINEFEED of line_feed
+  | SINGLESPACE
+  | SPACE of int
+  | TAB of int (* shudders *)
+  | COMMENT of string
+  | PIPE
+
+let to_parser_token :
+    token -> (Parser.token, line_feed trivia) result = function
+  | EOF -> Ok Parser.EOF
+  | DISALLOWED -> Ok Parser.DISALLOWED
+  | LET -> Ok Parser.LET
+  | VAR -> Ok Parser.VAR
+  | LPAR -> Ok Parser.LPAR
+  | RPAR -> Ok Parser.RPAR
+  | LBRACKET -> Ok Parser.LBRACKET
+  | RBRACKET -> Ok Parser.RBRACKET
+  | LCURLY -> Ok Parser.LCURLY
+  | RCURLY -> Ok Parser.RCURLY
+  | AWAIT -> Ok Parser.AWAIT
+  | AWAITSTAR -> Ok Parser.AWAITSTAR
+  | ASYNC -> Ok Parser.ASYNC
+  | ASYNCSTAR -> Ok Parser.ASYNCSTAR
+  | BREAK -> Ok Parser.BREAK
+  | CASE -> Ok Parser.CASE
+  | CATCH -> Ok Parser.CATCH
+  | CONTINUE -> Ok Parser.CONTINUE
+  | LABEL -> Ok Parser.LABEL
+  | DO -> Ok Parser.DO
+  | DEBUG -> Ok Parser.DEBUG
+  | FLEXIBLE -> Ok Parser.FLEXIBLE
+  | IF -> Ok Parser.IF
+  | IGNORE -> Ok Parser.IGNORE
+  | IN -> Ok Parser.IN
+  | ELSE -> Ok Parser.ELSE
+  | SWITCH -> Ok Parser.SWITCH
+  | LOOP -> Ok Parser.LOOP
+  | WHILE -> Ok Parser.WHILE
+  | FOR -> Ok Parser.FOR
+  | RETURN -> Ok Parser.RETURN
+  | TRY -> Ok Parser.TRY
+  | THROW -> Ok Parser.THROW
+  | WITH -> Ok Parser.WITH
+  | ARROW -> Ok Parser.ARROW
+  | ASSIGN -> Ok Parser.ASSIGN
+  | FUNC -> Ok Parser.FUNC
+  | TYPE -> Ok Parser.TYPE
+  | OBJECT -> Ok Parser.OBJECT
+  | ACTOR -> Ok Parser.ACTOR
+  | CLASS -> Ok Parser.CLASS
+  | PUBLIC -> Ok Parser.PUBLIC
+  | PRIVATE -> Ok Parser.PRIVATE
+  | SHARED -> Ok Parser.SHARED
+  | STABLE -> Ok Parser.STABLE
+  | SYSTEM -> Ok Parser.SYSTEM
+  | QUERY -> Ok Parser.QUERY
+  | SEMICOLON -> Ok Parser.SEMICOLON
+  | COMMA -> Ok Parser.COMMA
+  | COLON -> Ok Parser.COLON
+  | SUB -> Ok Parser.SUB
+  | DOT -> Ok Parser.DOT
+  | QUEST -> Ok Parser.QUEST
+  | BANG -> Ok Parser.BANG
+  | AND -> Ok Parser.AND
+  | OR -> Ok Parser.OR
+  | IMPLIES -> Ok Parser.IMPLIES
+  | OLD -> Ok Parser.OLD
+  | NOT -> Ok Parser.NOT
+  | IMPORT -> Ok Parser.IMPORT
+  | MODULE -> Ok Parser.MODULE
+  | DEBUG_SHOW -> Ok Parser.DEBUG_SHOW
+  | TO_CANDID -> Ok Parser.TO_CANDID
+  | FROM_CANDID -> Ok Parser.FROM_CANDID
+  | ASSERT -> Ok Parser.ASSERT
+  | ADDOP -> Ok Parser.ADDOP
+  | SUBOP -> Ok Parser.SUBOP
+  | MULOP -> Ok Parser.MULOP
+  | DIVOP -> Ok Parser.DIVOP
+  | MODOP -> Ok Parser.MODOP
+  | POWOP -> Ok Parser.POWOP
+  | WRAPADDOP -> Ok Parser.WRAPADDOP
+  | WRAPSUBOP -> Ok Parser.WRAPSUBOP
+  | WRAPMULOP -> Ok Parser.WRAPMULOP
+  | WRAPPOWOP -> Ok Parser.WRAPPOWOP
+  | WRAPADDASSIGN -> Ok Parser.WRAPADDASSIGN
+  | WRAPSUBASSIGN -> Ok Parser.WRAPSUBASSIGN
+  | WRAPMULASSIGN -> Ok Parser.WRAPMULASSIGN
+  | WRAPPOWASSIGN -> Ok Parser.WRAPPOWASSIGN
+  | ANDOP -> Ok Parser.ANDOP
+  | OROP -> Ok Parser.OROP
+  | XOROP -> Ok Parser.XOROP
+  | SHLOP -> Ok Parser.SHLOP
+  | ROTLOP -> Ok Parser.ROTLOP
+  | ROTROP -> Ok Parser.ROTROP
+  | EQOP -> Ok Parser.EQOP
+  | NEQOP -> Ok Parser.NEQOP
+  | LEOP -> Ok Parser.LEOP
+  | GEOP -> Ok Parser.GEOP
+  | HASH -> Ok Parser.HASH
+  | EQ -> Ok Parser.EQ
+  | LT -> Ok Parser.LT
+  | GT -> Ok Parser.GT
+  | PLUSASSIGN -> Ok Parser.PLUSASSIGN
+  | MINUSASSIGN -> Ok Parser.MINUSASSIGN
+  | MULASSIGN -> Ok Parser.MULASSIGN
+  | DIVASSIGN -> Ok Parser.DIVASSIGN
+  | MODASSIGN -> Ok Parser.MODASSIGN
+  | POWASSIGN -> Ok Parser.POWASSIGN
+  | CATASSIGN -> Ok Parser.CATASSIGN
+  | ANDASSIGN -> Ok Parser.ANDASSIGN
+  | ORASSIGN -> Ok Parser.ORASSIGN
+  | XORASSIGN -> Ok Parser.XORASSIGN
+  | SHLASSIGN -> Ok Parser.SHLASSIGN
+  | SHRASSIGN -> Ok Parser.SHRASSIGN
+  | ROTLASSIGN -> Ok Parser.ROTLASSIGN
+  | ROTRASSIGN -> Ok Parser.ROTRASSIGN
+  | NULL -> Ok Parser.NULL
+  | DOT_NUM s -> Ok (Parser.DOT_NUM s)
+  | NAT s -> Ok (Parser.NAT s)
+  | FLOAT s -> Ok (Parser.FLOAT s)
+  | CHAR u -> Ok (Parser.CHAR u)
+  | BOOL b -> Ok (Parser.BOOL b)
+  | ID s -> Ok (Parser.ID s)
+  | TEXT s -> Ok (Parser.TEXT s)
+  | PRIM -> Ok Parser.PRIM
+  | UNDERSCORE -> Ok Parser.UNDERSCORE
+  | COMPOSITE -> Ok Parser.COMPOSITE
+  | INVARIANT -> Ok Parser.INVARIANT
+  | PIPE -> Ok Parser.PIPE
+  (*Trivia *)
+  | SINGLESPACE -> Error (Space 1)
+  | SPACE n -> Error (Space n)
+  | LINEFEED lf -> Error (Line lf)
+  | TAB n -> Error (Tab n)
+  | COMMENT c -> Error (Comment c)
+
+let string_of_parser_token = function
+  | Parser.EOF -> "EOF"
+  | Parser.DISALLOWED -> "DISALLOWED"
+  | Parser.LET -> "LET"
+  | Parser.VAR -> "VAR"
+  | Parser.LPAR -> "LPAR"
+  | Parser.RPAR -> "RPAR"
+  | Parser.LBRACKET -> "LBRACKET"
+  | Parser.RBRACKET -> "RBRACKET"
+  | Parser.LCURLY -> "LCURLY"
+  | Parser.RCURLY -> "RCURLY"
+  | Parser.AWAIT -> "AWAIT"
+  | Parser.AWAITSTAR -> "AWAIT*"
+  | Parser.ASYNC -> "ASYNC"
+  | Parser.ASYNCSTAR -> "ASYNC*"
+  | Parser.BREAK -> "BREAK"
+  | Parser.CASE -> "CASE"
+  | Parser.CATCH -> "CATCH"
+  | Parser.CONTINUE -> "CONTINUE"
+  | Parser.LABEL -> "LABEL"
+  | Parser.DEBUG -> "DEBUG"
+  | Parser.DO -> "DO"
+  | Parser.FLEXIBLE -> "FLEXIBLE"
+  | Parser.IF -> "IF"
+  | Parser.IGNORE -> "IGNORE"
+  | Parser.IN -> "IN"
+  | Parser.ELSE -> "ELSE"
+  | Parser.SWITCH -> "SWITCH"
+  | Parser.LOOP -> "LOOP"
+  | Parser.WHILE -> "WHILE"
+  | Parser.FOR -> "FOR"
+  | Parser.RETURN -> "RETURN"
+  | Parser.TRY -> "TRY"
+  | Parser.THROW -> "THROW"
+  | Parser.WITH -> "WITH"
+  | Parser.ARROW -> "ARROW"
+  | Parser.ASSIGN -> "ASSIGN"
+  | Parser.FUNC -> "FUNC"
+  | Parser.TYPE -> "TYPE"
+  | Parser.OBJECT -> "OBJECT"
+  | Parser.ACTOR -> "ACTOR"
+  | Parser.CLASS -> "CLASS"
+  | Parser.PUBLIC -> "PUBLIC"
+  | Parser.PRIVATE -> "PRIVATE"
+  | Parser.SHARED -> "SHARED"
+  | Parser.STABLE -> "STABLE"
+  | Parser.SYSTEM -> "SYSTEM"
+  | Parser.QUERY -> "QUERY"
+  | Parser.SEMICOLON -> "SEMICOLON"
+  | Parser.SEMICOLON_EOL -> "SEMICOLON_EOL"
+  | Parser.COMMA -> "COMMA"
+  | Parser.COLON -> "COLON"
+  | Parser.SUB -> "SUB"
+  | Parser.DOT -> "DOT"
+  | Parser.QUEST -> "QUEST"
+  | Parser.BANG -> "BANG"
+  | Parser.AND -> "AND"
+  | Parser.OR -> "OR"
+  | Parser.NOT -> "NOT"
+  | Parser.IMPORT -> "IMPORT"
+  | Parser.MODULE -> "MODULE"
+  | Parser.DEBUG_SHOW -> "DEBUG_SHOW"
+  | Parser.TO_CANDID -> "TO_CANDID"
+  | Parser.FROM_CANDID -> "FROM_CANDID"
+  | Parser.ASSERT -> "ASSERT"
+  | Parser.ADDOP -> "ADDOP"
+  | Parser.SUBOP -> "SUBOP"
+  | Parser.MULOP -> "MULOP"
+  | Parser.DIVOP -> "DIVOP"
+  | Parser.MODOP -> "MODOP"
+  | Parser.POWOP -> "POWOP"
+  | Parser.WRAPADDOP -> "WRAPADDOP"
+  | Parser.WRAPSUBOP -> "WRAPSUBOP"
+  | Parser.WRAPMULOP -> "WRAPMULOP"
+  | Parser.WRAPPOWOP -> "WRAPPOWOP"
+  | Parser.WRAPADDASSIGN -> "WRAPADDASSIGN"
+  | Parser.WRAPSUBASSIGN -> "WRAPSUBASSIGN"
+  | Parser.WRAPMULASSIGN -> "WRAPMULASSIGN"
+  | Parser.WRAPPOWASSIGN -> "WRAPPOWASSIGN"
+  | Parser.ANDOP -> "ANDOP"
+  | Parser.OROP -> "OROP"
+  | Parser.XOROP -> "XOROP"
+  | Parser.SHLOP -> "SHLOP"
+  | Parser.SHROP -> "SHROP"
+  | Parser.ROTLOP -> "ROTLOP"
+  | Parser.ROTROP -> "ROTROP"
+  | Parser.EQOP -> "EQOP"
+  | Parser.NEQOP -> "NEQOP"
+  | Parser.LEOP -> "LEOP"
+  | Parser.LTOP -> "LTOP"
+  | Parser.GTOP -> "GTOP"
+  | Parser.GEOP -> "GEOP"
+  | Parser.HASH -> "HASH"
+  | Parser.EQ -> "EQ"
+  | Parser.LT -> "LT"
+  | Parser.GT -> "GT"
+  | Parser.PLUSASSIGN -> "PLUSASSIGN"
+  | Parser.MINUSASSIGN -> "MINUSASSIGN"
+  | Parser.MULASSIGN -> "MULASSIGN"
+  | Parser.DIVASSIGN -> "DIVASSIGN"
+  | Parser.MODASSIGN -> "MODASSIGN"
+  | Parser.POWASSIGN -> "POWASSIGN"
+  | Parser.CATASSIGN -> "CATASSIGN"
+  | Parser.ANDASSIGN -> "ANDASSIGN"
+  | Parser.ORASSIGN -> "ORASSIGN"
+  | Parser.XORASSIGN -> "XORASSIGN"
+  | Parser.SHLASSIGN -> "SHLASSIGN"
+  | Parser.SHRASSIGN -> "SHRASSIGN"
+  | Parser.ROTLASSIGN -> "ROTLASSIGN"
+  | Parser.ROTRASSIGN -> "ROTRASSIGN"
+  | Parser.NULL -> "NULL"
+  | Parser.DOT_NUM _ -> "DOT_NUM of string"
+  | Parser.NAT _ -> "NAT of string"
+  | Parser.FLOAT _ -> "FLOAT of string"
+  | Parser.CHAR _ -> "CHAR of Mo_values.Value.unicode"
+  | Parser.BOOL _ -> "BOOL of bool"
+  | Parser.ID _ -> "ID of string"
+  | Parser.TEXT _ -> "TEXT of string"
+  | Parser.PRIM -> "PRIM"
+  | Parser.UNDERSCORE -> "UNDERSCORE"
+  | Parser.COMPOSITE -> "COMPOSITE"
+  | Parser.INVARIANT -> "INVARIANT"
+  | Parser.IMPLIES -> "IMPLIES"
+  | Parser.OLD -> "OLD"
+  | Parser.PIPE -> "PIPE"
+
+let is_lineless_trivia : token -> void trivia option = function
+  | SINGLESPACE -> Some (Space 1)
+  | SPACE n -> Some (Space n)
+  | TAB n -> Some (Tab n)
+  | COMMENT c -> Some (Comment c)
+  | _ -> None
+
+let is_trivia : token -> line_feed trivia option = function
+  | LINEFEED lf -> Some (Line lf)
+  | t -> Option.map (map_trivia absurd) (is_lineless_trivia t)
+
+let is_whitespace : 'a trivia -> bool = function
+  | Space _ | Tab _ | Line _ -> true
+  | Comment _ -> false
+
+let is_line_feed : token -> bool = function
+  | LINEFEED _ -> true
+  | _ -> false
+
+type annotation = {
+  range : Lexing.position * Lexing.position;
+  leading_trivia : line_feed trivia list;
+  trailing_trivia : void trivia list;
+}
+
+let dummy_annotation = {
+   range = Lexing.dummy_pos, Lexing.dummy_pos;
+   leading_trivia = [];
+   trailing_trivia = [];
+}
+
+
+
+ + + diff --git a/coverage/mo_frontend/stability.ml.html b/coverage/mo_frontend/stability.ml.html new file mode 100644 index 00000000000..542ec630b2f --- /dev/null +++ b/coverage/mo_frontend/stability.ml.html @@ -0,0 +1,260 @@ + + + + + stability.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+
+
open Mo_types
+
+open Type
+
+(* Signature matching *)
+
+let cat = "Compatibility"
+
+(* signature matching with multiple error reporting
+   c.f. (simpler) Types.match_sig.
+*)
+
+let display_typ = Lib.Format.display Type.pp_typ
+
+let display_typ_expand = Lib.Format.display Type.pp_typ_expand
+
+let error_discard s tf =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0169" cat
+      (Format.asprintf "stable variable %s of previous type%a\ncannot be discarded; promote to type `Any` instead"
+        tf.lab
+        display_typ tf.typ))
+
+let error_sub s tf1 tf2 =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0170" cat
+      (Format.asprintf "stable variable %s of previous type%a\ncannot be consumed at new type%a"
+        tf1.lab
+        display_typ_expand tf1.typ
+        display_typ_expand tf2.typ))
+
+let error_mut s tf1 tf2 =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0171" cat
+      (Format.asprintf "stable variable %s changes mutability from previous type%a\nto new type %a"
+         tf1.lab
+         display_typ_expand tf1.typ
+         display_typ_expand tf2.typ))
+
+let match_stab_sig tfs1 tfs2 : unit Diag.result =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  let res = Diag.with_message_store (fun s ->
+    (* Should we insist on monotonic preservation of fields, or relax? *)
+    let rec go tfs1 tfs2 = match tfs1, tfs2 with
+      | [], _ ->
+        Some () (* no or additional fields ok *)
+      | tf1 :: tfs1', [] ->
+        error_discard s tf1;
+        go tfs1' []
+      | tf1::tfs1', tf2::tfs2' ->
+        (match Type.compare_field tf1 tf2 with
+         | 0 ->
+           (* Should we enforce equal mutability or not?
+              Seems unnecessary since upgrade is read-once *)
+            if Type.is_mut tf1.typ <> Type.is_mut tf2.typ then
+              error_mut s tf1 tf2;
+            if not (sub (as_immut tf1.typ) (as_immut tf2.typ)) then
+              error_sub s tf1 tf2;
+            go tfs1' tfs2'
+       | -1 ->
+          error_discard s tf1;
+          go tfs1' tfs2
+        | _ ->
+          go tfs1 tfs2' (* new field ok, recurse on tfs2' *)
+        )
+    in go tfs1 tfs2)
+  in
+  (* cross check with simpler definition *)
+  match res with
+  | Ok _ ->
+    assert (Type.match_stab_sig tfs1 tfs2);
+    res
+  | Error _ ->
+    assert (not (Type.match_stab_sig tfs1 tfs2));
+    res
+
+
+
+ + + diff --git a/coverage/mo_frontend/static.ml.html b/coverage/mo_frontend/static.ml.html new file mode 100644 index 00000000000..a48253d6edd --- /dev/null +++ b/coverage/mo_frontend/static.ml.html @@ -0,0 +1,439 @@ + + + + + static.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+
+
(*
+This module implements the staticity check, needed for modules and imported
+files.
+
+The guiding principle is: Static expressions are expressions that can be
+compiled to values without evaluation.
+
+There is some mushiness around let-expressions and variables, which do form
+some kind of beta-reduction, and can actually cause loops, but are required to
+allow re-exporting names in modules.
+*)
+
+open Mo_def
+
+open Source
+open Syntax
+
+let err m at =
+  let open Diag in
+  add_msg m
+    (error_message
+       at
+       "M0014"
+       "type"
+       "non-static expression in library or module")
+
+let pat_err m at =
+  let open Diag in
+  add_msg m
+    (error_message
+       at
+       "M0015"
+       "type"
+       "only trivial patterns allowed in static expressions")
+
+let rec exp m e = match e.it with
+  (* Plain values *)
+  | (PrimE _ | LitE _ | ActorUrlE _ | FuncE _) -> ()
+  | (TagE (_, exp1) | OptE exp1) -> exp m exp1
+  | TupE es -> List.iter (exp m) es
+  | ArrayE (mut, es) ->
+    begin
+      match mut.it with
+      | Const ->  List.iter (exp m) es
+      | Var -> err m e.at
+    end
+  | ObjBlockE (_, dfs) -> dec_fields m dfs
+  | ObjE (bases, efs) -> List.iter (exp m) bases; exp_fields m efs
+
+  (* Variable access. Dangerous, due to loops. *)
+  | (VarE _ | ImportE _) -> ()
+
+  (* Projections. These are a form of evaluation. *)
+  | ProjE (exp1, _)
+  | DotE (exp1, _) -> exp m exp1
+  | IdxE (exp1, exp2) -> err m e.at
+
+  (* Transparent *)
+  | AnnotE (exp1, _) | IgnoreE exp1 | DoOptE exp1 -> exp m exp1
+  | BlockE ds -> List.iter (dec m) ds
+
+  (* Clearly non-static *)
+  | UnE _
+  | ShowE _
+  | ToCandidE _
+  | FromCandidE _
+  | NotE _
+  | AssertE _
+  | LabelE _
+  | BreakE _
+  | RetE _
+  | AsyncE _ (* TBR - Cmp could be static *)
+  | AwaitE _
+  | LoopE _
+  | BinE _
+  | RelE _
+  | AssignE _
+  | CallE _
+  | AndE _
+  | OrE _
+  | WhileE _
+  | ForE _
+  | DebugE _
+  | IfE _
+  | SwitchE _
+  | ThrowE _
+  | TryE _
+  | BangE _
+  | ImpliesE _
+  | OldE _
+  -> err m e.at
+
+and dec_fields m dfs = List.iter (fun df -> dec m df.it.dec) dfs
+
+and exp_fields m efs = List.iter (fun (ef : exp_field) ->
+  if ef.it.mut.it = Var then err m ef.at;
+  exp m ef.it.exp) efs
+
+and dec m d = match d.it with
+  | TypD _ | ClassD _ -> ()
+  | ExpD e -> exp m e
+  | LetD (p, e, fail) -> pat m p; exp m e; Option.iter (exp m) fail
+  | VarD _ -> err m d.at
+
+and pat m p = match p.it with
+  | (WildP | VarP _) -> ()
+
+  (*
+  If we allow projections above, then we should allow irrefutable
+  patterns here.
+  *)
+  | TupP ps -> List.iter (pat m) ps
+  | ObjP fs -> List.iter (fun (f : pat_field) -> pat m f.it.pat) fs
+
+  (* TODO:
+    claudio: what about singleton variant patterns? These are irrefutable too.
+    Andreas suggests simply allowing all patterns: "The worst that can happen is that the program
+    is immediately terminated, but that doesn't break anything semantically."
+  *)
+
+  (* Everything else is forbidden *)
+  | _ -> pat_err m p.at
+
+let prog p =
+  Diag.with_message_store (fun m -> List.iter (dec m) p.it; Some ())
+
+
+
+ + + diff --git a/coverage/mo_frontend/traversals.ml.html b/coverage/mo_frontend/traversals.ml.html new file mode 100644 index 00000000000..e2df1d0de41 --- /dev/null +++ b/coverage/mo_frontend/traversals.ml.html @@ -0,0 +1,312 @@ + + + + + traversals.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
+
open Mo_def
+open Syntax
+open Source
+
+let rec over_exp (f : exp -> exp) (exp : exp) : exp = match exp.it with
+  | ImportE _ | PrimE _ | VarE _ | LitE _ | ActorUrlE _ -> f exp
+  | UnE (x, y, exp1) -> f { exp with it = UnE (x, y, over_exp f exp1) }
+  | ShowE (x, exp1) -> f { exp with it = ShowE (x, over_exp f exp1) }
+  | ToCandidE exps ->  f { exp with it = ToCandidE (List.map (over_exp f) exps) }
+  | FromCandidE (exp1) -> f { exp with it = FromCandidE (over_exp f exp1) }
+  | ProjE (exp1, x) -> f { exp with it = ProjE (over_exp f exp1, x) }
+  | OptE exp1 -> f { exp with it = OptE (over_exp f exp1) }
+  | DoOptE exp1 -> f { exp with it = DoOptE (over_exp f exp1) }
+  | BangE exp1 -> f { exp with it = BangE (over_exp f exp1) }
+  | TagE (x, exp1) -> f { exp with it = TagE (x, over_exp f exp1) }
+  | DotE (exp1, x) -> f { exp with it = DotE (over_exp f exp1, x) }
+  | NotE exp1 -> f { exp with it = NotE (over_exp f exp1) }
+  | AssertE (how, exp1) -> f { exp with it = AssertE (how, over_exp f exp1) }
+  | LabelE (x, y, exp1) -> f { exp with it = LabelE (x, y, over_exp f exp1) }
+  | BreakE (x, exp1) -> f { exp with it = BreakE (x, over_exp f exp1) }
+  | RetE exp1 -> f { exp with it = RetE (over_exp f exp1) }
+  | AnnotE (exp1, x) -> f { exp with it = AnnotE (over_exp f exp1, x) }
+  | AsyncE (s, tb, exp1) -> f { exp with it = AsyncE (s, tb, over_exp f exp1) }
+  | AwaitE (s, exp1) -> f { exp with it = AwaitE (s, over_exp f exp1) }
+  | ThrowE exp1 -> f { exp with it = ThrowE (over_exp f exp1) }
+  | BinE (x, exp1, y, exp2) ->
+     f { exp with it = BinE (x, over_exp f exp1, y, over_exp f exp2) }
+  | IdxE (exp1, exp2) ->
+     f { exp with it = IdxE (over_exp f exp1, over_exp f exp2) }
+  | RelE (x, exp1, y, exp2) ->
+     f { exp with it = RelE (x, over_exp f exp1, y, over_exp f exp2) }
+  | AssignE (exp1, exp2) ->
+     f { exp with it = AssignE (over_exp f exp1, over_exp f exp2) }
+  | CallE (exp1, x, exp2) ->
+     f { exp with it = CallE (over_exp f exp1, x, over_exp f exp2) }
+  | AndE (exp1, exp2) ->
+     f { exp with it = AndE (over_exp f exp1, over_exp f exp2) }
+  | OrE (exp1, exp2) ->
+     f { exp with it = OrE (over_exp f exp1, over_exp f exp2) }
+  | ImpliesE (exp1, exp2) ->
+     f { exp with it = ImpliesE (over_exp f exp1, over_exp f exp2) }
+  | OldE exp1 -> f { exp with it = OldE (over_exp f exp1) }
+  | WhileE (exp1, exp2) ->
+     f { exp with it = WhileE (over_exp f exp1, over_exp f exp2) }
+  | LoopE (exp1, exp2_opt) ->
+     f { exp with it = LoopE (over_exp f exp1, Option.map (over_exp f) exp2_opt) }
+  | ForE (x, exp1, exp2) ->
+     f { exp with it = ForE (x, over_exp f exp1, over_exp f exp2) }
+  | DebugE exp1 ->
+     f { exp with it = DebugE (over_exp f exp1) }
+  | TupE exps ->
+     f { exp with it = TupE (List.map (over_exp f) exps) }
+  | ArrayE (x, exps) ->
+     f { exp with it = ArrayE (x, List.map (over_exp f) exps) }
+  | BlockE ds ->
+     f { exp with it = BlockE (List.map (over_dec f) ds) }
+  | ObjBlockE (x, dfs) ->
+     f { exp with it = ObjBlockE (x, List.map (over_dec_field f) dfs) }
+  | ObjE (bases, efs) ->
+     f { exp with it = ObjE (List.map (over_exp f) bases, List.map (over_exp_field f) efs) }
+  | IfE (exp1, exp2, exp3) ->
+     f { exp with it = IfE(over_exp f exp1, over_exp f exp2, over_exp f exp3) }
+  | TryE (exp1, cases) ->
+     f { exp with it = TryE (over_exp f exp1, List.map (over_case f) cases) }
+  | SwitchE (exp1, cases) ->
+     f { exp with it = SwitchE (over_exp f exp1, List.map (over_case f) cases) }
+  | FuncE (name, sort_pat, typ_binds, pat, typ_opt, sugar, exp1) ->
+     f { exp with it = FuncE (name, sort_pat, typ_binds, pat, typ_opt, sugar, over_exp f exp1) }
+  | IgnoreE exp1 ->
+     f { exp with it = IgnoreE (over_exp f exp1)}
+
+and over_dec (f : exp -> exp) (d : dec) : dec = match d.it with
+  | TypD _ -> d
+  | ExpD e -> { d with it = ExpD (over_exp f e)}
+  | VarD (x, e) ->
+     { d with it = VarD (x, over_exp f e)}
+  | LetD (x, e, fail) ->
+     { d with it = LetD (x, over_exp f e, Option.map (over_exp f) fail)}
+  | ClassD (sp, cid, tbs, p, t_o, s, id, dfs) ->
+     { d with it = ClassD (sp, cid, tbs, p, t_o, s, id, List.map (over_dec_field f) dfs)}
+
+and over_dec_field (f : exp -> exp) (df : dec_field) : dec_field =
+  { df with it = { df.it with dec = over_dec f df.it.dec } }
+
+and over_exp_field (f : exp -> exp) (ef : exp_field) : exp_field =
+  { ef with it = { ef.it with exp = over_exp f ef.it.exp } }
+
+and over_case (f : exp -> exp) (case : case) : case =
+  { case with it = { case.it with exp = over_exp f case.it.exp } }
+
+and over_prog (f : exp -> exp) (prog : prog) : prog =
+  { prog with it = List.map (over_dec f) prog.it }
+
+
+
+ + + diff --git a/coverage/mo_frontend/typing.ml.html b/coverage/mo_frontend/typing.ml.html new file mode 100644 index 00000000000..78e1a603afc --- /dev/null +++ b/coverage/mo_frontend/typing.ml.html @@ -0,0 +1,8775 @@ + + + + + typing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+
+
open Mo_def
+open Mo_types
+open Mo_values
+module Flags = Mo_config.Flags
+
+open Syntax
+open Source
+
+module T = Type
+module A = Effect
+module C = Async_cap
+
+
+(* Contexts  *)
+
+(* availability, used to mark actor constructors as unavailable in compiled code
+   FUTURE: mark unavailable, non-shared variables *)
+type avl = Available | Unavailable
+
+type lab_env = T.typ T.Env.t
+type ret_env = T.typ option
+type val_env  = (T.typ * avl) T.Env.t
+
+(* separate maps for values and types; entries only for _public_ elements *)
+type visibility_env = (region * string option) T.Env.t * (region * string option) T.Env.t
+
+let available env = T.Env.map (fun ty -> (ty, Available)) env
+
+let initial_scope =
+  { Scope.empty with
+    Scope.typ_env = T.Env.singleton T.default_scope_var C.top_cap;
+    Scope.con_env = T.ConSet.singleton C.top_cap;
+  }
+
+
+type env =
+  { vals : val_env;
+    libs : Scope.lib_env;
+    typs : Scope.typ_env;
+    cons : Scope.con_env;
+    objs : Scope.obj_env;
+    labs : lab_env;
+    rets : ret_env;
+    async : C.async_cap;
+    in_actor : bool;
+    in_prog : bool;
+    context : exp' list;
+    pre : bool;
+    weak : bool;
+    msgs : Diag.msg_store;
+    scopes : Source.region T.ConEnv.t;
+  }
+
+let env_of_scope msgs scope =
+  { vals = available scope.Scope.val_env;
+    libs = scope.Scope.lib_env;
+    typs = scope.Scope.typ_env;
+    cons = scope.Scope.con_env;
+    objs = T.Env.empty;
+    labs = T.Env.empty;
+    rets = None;
+    async = C.initial_cap();
+    in_actor = false;
+    in_prog = true;
+    context = [];
+    pre = false;
+    weak = false;
+    msgs;
+    scopes = T.ConEnv.empty;
+  }
+
+
+(* Error bookkeeping *)
+
+exception Recover
+
+let recover_with (x : 'a) (f : 'b -> 'a) (y : 'b) = try f y with Recover -> x
+let recover_opt f y = recover_with None (fun y -> Some (f y)) y
+let recover f y = recover_with () f y
+
+let display_lab = Lib.Format.display T.pp_lab
+
+let display_typ = Lib.Format.display T.pp_typ
+
+let display_typ_expand = Lib.Format.display T.pp_typ_expand
+
+let type_error at code text : Diag.message =
+  Diag.error_message at code "type" text
+
+let type_warning at code text : Diag.message =
+  Diag.warning_message at code "type" text
+
+let type_info at text : Diag.message =
+  Diag.info_message at "type" text
+
+let error env at code fmt =
+  Format.kasprintf
+    (fun s -> Diag.add_msg env.msgs (type_error at code s); raise Recover) fmt
+
+let local_error env at code fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_error at code s)) fmt
+
+let warn env at code fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_warning at code s)) fmt
+
+let info env at fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_info at s)) fmt
+
+let flag_of_compile_mode mode =
+  match mode with
+  | Flags.ICMode -> ""
+  | Flags.WASIMode -> " and flag -wasi-system-api"
+  | Flags.WasmMode -> " and flag -no-system-api"
+  | Flags.RefMode -> " and flag -ref-system-api"
+
+let diag_in type_diag modes env at code fmt =
+  let mode = !Flags.compile_mode in
+  if !Flags.compiled && List.mem mode modes then
+    begin
+      Printf.ksprintf
+        (fun s ->
+          let s =
+            Printf.sprintf "%s\n  (This is a limitation of the current version%s.)"
+            s
+            (flag_of_compile_mode mode)
+          in
+          Diag.add_msg env.msgs (type_diag at code s)) fmt;
+      true
+    end
+  else false
+
+let error_in modes env at code fmt =
+  if diag_in type_error modes env at code fmt then
+    raise Recover
+
+let plural cs = if T.ConSet.cardinal cs = 1 then "" else "s"
+
+let warn_lossy_bind_type env at bind t1 t2 =
+  if not T.(sub t1 t2 || sub t2 t1) then
+    warn env at "M0190" "pattern variable %s has larger type%a\nbecause its types in the pattern alternatives are unrelated smaller types:\ntype in left pattern is%a\ntype in right pattern is%a"
+      bind
+      display_typ_expand (T.lub t1 t2)
+      display_typ_expand t1
+      display_typ_expand t2
+
+(* Currently unused *)
+let _warn_in modes env at code fmt =
+  ignore (diag_in type_warning modes env at code fmt)
+
+(* Context extension *)
+
+let add_lab env x t = {env with labs = T.Env.add x t env.labs}
+let add_val env x t = {env with vals = T.Env.add x (t, Available) env.vals}
+
+let add_typs env xs cs =
+  { env with
+    typs = List.fold_right2 T.Env.add xs cs env.typs;
+    cons = List.fold_right T.ConSet.disjoint_add cs env.cons;
+  }
+
+let adjoin env scope =
+  { env with
+    vals = T.Env.adjoin env.vals (available scope.Scope.val_env);
+    libs = T.Env.adjoin env.libs scope.Scope.lib_env;
+    typs = T.Env.adjoin env.typs scope.Scope.typ_env;
+    cons = T.ConSet.union env.cons scope.Scope.con_env;
+    objs = T.Env.adjoin env.objs scope.Scope.obj_env;
+  }
+
+let adjoin_vals env ve = {env with vals = T.Env.adjoin env.vals (available ve)}
+let adjoin_typs env te ce =
+  { env with
+    typs = T.Env.adjoin env.typs te;
+    cons = T.ConSet.disjoint_union env.cons ce;
+  }
+
+let disjoint_union env at code fmt env1 env2 =
+  try T.Env.disjoint_union env1 env2
+  with T.Env.Clash k -> error env at code fmt k
+
+
+(* Coverage *)
+
+let coverage' warnOrError category env f x t at =
+  let uncovered, unreached = f x t in
+  List.iter (fun at -> warn env at "M0146" "this pattern is never matched") unreached;
+  if uncovered <> [] then
+    warnOrError env at "M0145"
+      ("this %s of type%a\ndoes not cover value\n  %s" : (_, _, _, _) format4 )
+      category
+      display_typ_expand t
+      (String.concat " or\n  " uncovered)
+
+let coverage_cases category env cases t at =
+  coverage' warn category env Coverage.check_cases cases t at
+
+let coverage_pat warnOrError env pat t =
+  coverage' warnOrError "pattern" env Coverage.check_pat pat t pat.at
+
+(* Types *)
+
+let check_ids env kind member ids = Lib.List.iter_pairs
+  (fun x y ->
+    if x.it = y.it
+    then error env y.at "M0018" "duplicate %s name %s in %s" member y.it kind;
+    if Hash.hash x.it = Hash.hash y.it
+    then error env y.at "M0019" "%s names %s and %s in %s have colliding hashes" member x.it y.it kind;
+  ) ids
+
+let infer_mut mut : T.typ -> T.typ =
+  match mut.it with
+  | Const -> fun t -> t
+  | Var -> fun t -> T.Mut t
+
+
+(* System method types *)
+
+let heartbeat_type =
+  T.(Func (Local, Returns, [scope_bind], [], [Async (Fut, Var (default_scope_var, 0), unit)]))
+
+let timer_type =
+  T.(Func (Local, Returns, [scope_bind],
+    [Func (Local, Returns, [], [Prim Nat64], [])],
+    [Async (Fut, Var (default_scope_var, 0), unit)]))
+
+let system_funcs tfs =
+  [
+    ("heartbeat", heartbeat_type);
+    ("timer", timer_type);
+    ("preupgrade", T.Func (T.Local, T.Returns, [], [], []));
+    ("postupgrade", T.Func (T.Local, T.Returns, [], [], []));
+    ("inspect",
+     (let msg_typ = T.decode_msg_typ tfs in
+      let record_typ =
+        T.Obj (T.Object, List.sort T.compare_field
+          [{T.lab = "caller"; T.typ = T.principal; T.depr = None};
+           {T.lab = "arg"; T.typ = T.blob; T.depr = None};
+           {T.lab = "msg"; T.typ = msg_typ; T.depr = None}])
+      in
+        T.Func (T.Local, T.Returns, [],  [record_typ], [T.bool])))
+  ]
+
+
+let check_closed env id k at =
+  let is_typ_param c =
+    match Cons.kind c with
+    | T.Def _
+    | T.Abs( _, T.Pre) -> false (* an approximated type constructor *)
+    | T.Abs( _, _) -> true in
+  let typ_params = T.ConSet.filter is_typ_param env.cons in
+  let cs_k = T.cons_kind k in
+  let free_params = T.ConSet.inter typ_params cs_k in
+  if not (T.ConSet.is_empty free_params) then
+    let op, sbs, st = T.strings_of_kind k in
+    error env at "M0137"
+      "type %s%s %s %s references type parameter%s %s from an outer scope"
+      id.it sbs op st
+      (plural free_params)
+      (String.concat ", " (T.ConSet.fold (fun c cs -> T.string_of_con c::cs) free_params []))
+
+(* Imports *)
+
+let check_import env at f ri =
+  let full_path =
+    match !ri with
+    | Unresolved -> error env at "M0020" "unresolved import %s" f
+    | LibPath fp -> fp
+    | IDLPath (fp, _) -> fp
+    | PrimPath -> "@prim"
+  in
+  match T.Env.find_opt full_path env.libs with
+  | Some T.Pre ->
+    error env at "M0021" "cannot infer type of forward import %s" f
+  | Some t -> t
+  | None -> error env at "M0022" "imported file %s not loaded" full_path
+
+
+(* Paths *)
+
+let rec check_obj_path env path : T.obj_sort * (T.field list) =
+  match T.promote (check_obj_path' env path) with
+  | T.Obj (s, fs) as t ->
+    path.note <- t;
+    (s, fs)
+  | t ->
+    error env path.at "M0023"
+      "expected module, object, or actor type, but path expression produces type%a"
+      display_typ_expand t
+
+and check_obj_path' env path : T.typ =
+  match path.it with
+  | IdH id ->
+    (match T.Env.find_opt id.it env.vals with
+     | Some (T.Pre, _) ->
+       error env id.at "M0024" "cannot infer type of forward variable reference %s" id.it
+     | Some (t, Available) -> t
+     | Some (t, Unavailable) ->
+         error env id.at "M0025" "unavailable variable %s" id.it
+     | None -> error env id.at "M0026" "unbound variable %s" id.it
+    )
+  | DotH (path', id) ->
+    let s, fs = check_obj_path env path' in
+    match T.lookup_val_field id.it fs with
+    | T.Pre ->
+      error env id.at "M0027" "cannot infer type of forward field reference %s" id.it
+    | t -> t
+    | exception Invalid_argument _ ->
+      error env id.at "M0028" "field %s does not exist in type%a"
+        id.it display_typ_expand (T.Obj (s, fs))
+
+let rec check_typ_path env path : T.con =
+  let c = check_typ_path' env path in
+  path.note <- T.Typ c;
+  c
+
+and check_typ_path' env path : T.con =
+  match path.it with
+  | IdH id ->
+    (match T.Env.find_opt id.it env.typs with
+    | Some c -> c
+    | None -> error env id.at "M0029" "unbound type %s" id.it
+    )
+  | DotH (path', id) ->
+    let s, fs = check_obj_path env path' in
+    match T.lookup_typ_field id.it fs with
+      | c ->
+        Option.iter
+          (warn env path.at "M0154" "type field %s is deprecated:\n%s" id.it)
+          (T.lookup_typ_deprecation id.it fs);
+        c
+      | exception Invalid_argument _ ->
+        error env id.at "M0030" "type field %s does not exist in type%a"
+          id.it display_typ_expand (T.Obj (s, fs))
+
+
+(* Type helpers *)
+
+let error_shared env t at code fmt =
+  match T.find_unshared t with
+  | None -> error env at code fmt
+  | Some t1 ->
+    let s =
+      Format.asprintf "\ntype%a\nis or contains non-shared type%a"
+        display_typ_expand t
+        display_typ_expand t1
+    in
+    Format.kasprintf (fun s1 -> Diag.add_msg env.msgs (type_error at code (s1^s)); raise Recover) fmt
+
+let as_domT t =
+  match t.Source.it with
+  | TupT tis -> List.map snd tis
+  | _ -> [t]
+
+let as_codomT sort t =
+  match sort, t.Source.it with
+  | T.Shared _,  AsyncT (T.Fut, _, t1) ->
+    T.Promises, as_domT t1
+  | _ -> T.Returns, as_domT t
+
+let check_shared_binds env at tbs =
+  (* should be ensured by desugaring parser *)
+  assert (List.length tbs > 0 &&
+            (List.hd(tbs)).T.sort = T.Scope);
+  (* shared functions can't have user declared type parameters *)
+  if List.length tbs > 1 then
+    error env at "M0180"
+      "shared function has unexpected type parameters"
+
+let check_shared_return env at sort c ts =
+  match sort, c, ts with
+  | T.Shared _, T.Promises,  _ -> ()
+  | T.Shared T.Write, T.Returns, [] -> ()
+  | T.Shared T.Write, _, _ -> error env at "M0035" "shared function must have syntactic return type '()' or 'async <typ>'"
+  | T.Shared T.Query, _, _ -> error env at "M0036" "shared query function must have syntactic return type 'async <typ>'"
+  | _ -> ()
+
+let region_of_scope env typ =
+  match T.normalize typ with
+  | T.Con(c,_) ->
+    T.ConEnv.find_opt c env.scopes
+  | _ -> None
+
+let string_of_region r =
+  let open Source in
+  let { left; right } = r in
+  let basename = if left.file = "" then "" else Filename.basename left.file in
+  Source.string_of_region
+    { left =  { left with file = basename };
+      right = { right with file = basename } }
+
+let associated_region env typ at =
+  match region_of_scope env typ with
+  | Some r ->
+    Printf.sprintf "\n  scope %s is %s" (T.string_of_typ_expand typ) (string_of_region r);
+  | None ->
+    if T.eq typ (T.Con(C.top_cap,[])) then
+      Printf.sprintf "\n  scope %s is the global scope" (T.string_of_typ_expand typ)
+    else ""
+
+let scope_info env typ at =
+  match region_of_scope env typ with
+  | Some r ->
+    let s = {left = r.left; right = r.left} in
+    let l = { r.right with column = r.right.column - 1 } in
+    let e = {left = l; right = l} in
+    info env s "start of scope %s mentioned in error at %s"
+      (T.string_of_typ_expand typ) (string_of_region at);
+    info env e "end of scope %s mentioned in error at %s"
+      (T.string_of_typ_expand typ) (string_of_region at);
+  | None -> ()
+
+let rec infer_async_cap env sort cs tbs at =
+  match sort, cs, tbs with
+  | (T.Shared T.Write | T.Local) , c::_,  { T.sort = T.Scope; _ }::_ ->
+    { env with typs = T.Env.add T.default_scope_var c env.typs;
+               scopes = T.ConEnv.add c at env.scopes;
+               async = C.AsyncCap c }
+  | (T.Shared T.Query) , c::_,  { T.sort = T.Scope; _ }::_ ->
+    { env with typs = T.Env.add T.default_scope_var c env.typs;
+               scopes = T.ConEnv.add c at env.scopes;
+               async = C.QueryCap c }
+  | (T.Shared T.Composite) , c::_,  { T.sort = T.Scope; _ }::_ ->
+    { env with typs = T.Env.add T.default_scope_var c env.typs;
+               scopes = T.ConEnv.add c at env.scopes;
+               async = C.CompositeCap c }
+  | T.Shared _, _, _ -> assert false (* impossible given sugaring *)
+  | _ -> { env with async = C.NullCap }
+
+and check_AsyncCap env s at : T.typ * (T.con -> C.async_cap) =
+   match env.async with
+   | C.AwaitCap c
+   | C.AsyncCap c -> T.Con(c, []), fun c' -> C.AwaitCap c'
+   | C.CompositeCap c -> T.Con(c, []), fun c' -> C.CompositeAwaitCap c'
+   | C.QueryCap c -> T.Con(c, []), fun _c' -> C.ErrorCap
+   | C.ErrorCap ->
+      error env at "M0037" "misplaced %s; a query cannot contain an %s" s s
+   | C.NullCap -> error env at "M0037" "misplaced %s; try enclosing in an async function" s
+   | C.CompositeAwaitCap _ ->
+      error env at "M0037" "misplaced %s; a composite query cannot contain an %s" s s
+
+and check_AwaitCap env s at =
+   match env.async with
+   | C.AwaitCap c -> T.Con(c, [])
+   | C.CompositeAwaitCap c -> T.Con(c, [])
+   | C.AsyncCap _
+   | C.QueryCap _
+   | C.CompositeCap _
+     ->
+     error env at "M0038" "misplaced %s; try enclosing in an async expression" s
+   | C.ErrorCap
+   | C.NullCap -> error env at "M0038" "misplaced %s" s
+
+and check_ErrorCap env s at =
+   match env.async with
+   | C.AwaitCap c -> ()
+   | C.ErrorCap -> ()
+   | C.CompositeAwaitCap c -> ()
+   | C.AsyncCap _
+   | C.QueryCap _
+   | C.CompositeCap _ ->
+     error env at "M0039" "misplaced %s; try enclosing in an async expression or query function" s
+   | C.NullCap -> error env at "M0039" "misplaced %s" s
+
+and scope_of_env env =
+  match env.async with
+   | C.AsyncCap c
+   | C.QueryCap c
+   | C.CompositeCap c
+   | C.CompositeAwaitCap c
+   | C.AwaitCap c ->
+      Some (T.Con(c,[]))
+   | C.ErrorCap -> None
+   | C.NullCap -> None
+
+
+(* Types *)
+
+and check_typ env (typ : typ) : T.typ =
+  let t = check_typ' env typ in
+  typ.note <- t;
+  t
+
+and check_typ' env typ : T.typ =
+  match typ.it with
+  | PathT (path, typs) ->
+    let c = check_typ_path env path in
+    let ts = List.map (check_typ env) typs in
+    let T.Def (tbs, _) | T.Abs (tbs, _) = Cons.kind c in
+    let tbs' = List.map (fun tb -> { tb with T.bound = T.open_ ts tb.T.bound }) tbs in
+    check_typ_bounds env tbs' ts (List.map (fun typ -> typ.at) typs) typ.at;
+    T.Con (c, ts)
+  | PrimT "Any" -> T.Any
+  | PrimT "None" -> T.Non
+  | PrimT s ->
+    (try T.Prim (T.prim s) with Invalid_argument _ ->
+      error env typ.at "M0040" "unknown primitive type"
+    )
+  | ArrayT (mut, typ) ->
+    let t = check_typ env typ in
+    T.Array (infer_mut mut t)
+  | TupT typs ->
+    T.Tup (List.map (fun (_, t) -> check_typ env t) typs)
+  | FuncT (sort, binds, typ1, typ2) ->
+    let cs, tbs, te, ce = check_typ_binds env binds in
+    let env' = infer_async_cap (adjoin_typs env te ce) sort.it cs tbs typ.at in
+    let typs1 = as_domT typ1 in
+    let c, typs2 = as_codomT sort.it typ2 in
+    let ts1 = List.map (check_typ env') typs1 in
+    let ts2 = List.map (check_typ env') typs2 in
+    check_shared_return env typ2.at sort.it c ts2;
+    if not env.pre && Type.is_shared_sort sort.it then begin
+      check_shared_binds env typ.at tbs;
+      let t1 = T.seq ts1 in
+      if not (T.shared t1) then
+        error_shared env t1 typ1.at "M0031" "shared function has non-shared parameter type%a"
+          display_typ_expand t1;
+      List.iter (fun t ->
+        if not (T.shared t) then
+          error_shared env t typ.at "M0032"
+            "shared function has non-shared return type%a"
+            display_typ_expand t;
+      ) ts2;
+      match c, ts2 with
+      | T.Returns, [] when sort.it = T.Shared T.Write -> ()
+      | T.Promises, _ -> ()
+      | _ ->
+        error env typ2.at "M0041"
+          "shared function has non-async result type%a"
+          display_typ_expand (T.seq ts2)
+      end;
+    T.Func (sort.it, c, T.close_binds cs tbs, List.map (T.close cs) ts1, List.map (T.close cs) ts2)
+  | OptT typ ->
+    T.Opt (check_typ env typ)
+  | VariantT tags ->
+    check_ids env "variant type" "tag"
+      (List.map (fun (tag : typ_tag) -> tag.it.tag) tags);
+    let fs = List.map (check_typ_tag env) tags in
+    T.Variant (List.sort T.compare_field fs)
+  | AsyncT (s, typ0, typ) ->
+    let t0 = check_typ env typ0 in
+    let t = check_typ env typ in
+    if not env.pre && not (T.shared t) then
+      error_shared env t typ.at
+        "M0033" "async has non-shared content type%a"
+        display_typ_expand t;
+    T.Async (s, t0, t)
+  | ObjT (sort, fields) ->
+    check_ids env "object type" "field"
+      (List.filter_map (fun (field : typ_field) ->
+        match field.it with ValF (x, _, _) -> Some x | _ -> None
+      ) fields);
+    check_ids env "object type" "type field"
+      (List.filter_map (fun (field : typ_field) ->
+        match field.it with TypF (x, _, _) -> Some x | _ -> None
+      ) fields);
+    let fs = List.map (check_typ_field env sort.it) fields in
+    T.Obj (sort.it, List.sort T.compare_field fs)
+  | AndT (typ1, typ2) ->
+    let t1 = check_typ env typ1 in
+    let t2 = check_typ env typ2 in
+    let t = try T.glb t1 t2 with T.PreEncountered ->
+      error env typ2.at "M0168"
+        "cannot compute intersection of types containing recursive or forward references to other type definitions"
+    in
+    if not env.pre && T.sub t T.Non && not (T.sub t1 T.Non || T.sub t2 T.Non) then
+      warn env typ.at "M0166"
+        "this intersection results in type%a\nbecause operand types are inconsistent,\nleft operand is%a\nright operand is%a"
+        display_typ t
+        display_typ_expand t1
+        display_typ_expand t2;
+    t
+  | OrT (typ1, typ2) ->
+    let t1 = check_typ env typ1 in
+    let t2 = check_typ env typ2 in
+    let t = try T.lub t1 t2 with T.PreEncountered ->
+      error env typ2.at "M0168"
+        "cannot compute union of types containing recursive or forward references to other type definitions"
+    in
+    if not env.pre && T.sub T.Any t && not (T.sub T.Any t1 || T.sub T.Any t2) then
+      warn env typ.at "M0167"
+        "this union results in type%a\nbecause operand types are inconsistent,\nleft operand is%a\nright operand is%a"
+        display_typ t
+        display_typ_expand t1
+        display_typ_expand t2;
+    t
+  | ParT typ ->
+    check_typ env typ
+  | NamedT (_, typ) ->
+    check_typ env typ
+
+and check_typ_def env at (id, typ_binds, typ) : T.kind =
+  let cs, tbs, te, ce = check_typ_binds {env with pre = true} typ_binds in
+  let env' = adjoin_typs env te ce in
+  let t = check_typ env' typ in
+  let k = T.Def (T.close_binds cs tbs, T.close cs t) in
+  check_closed env id k at;
+  k
+
+and check_typ_field env s typ_field : T.field = match typ_field.it with
+  | ValF (id, typ, mut) ->
+    let t = infer_mut mut (check_typ env typ) in
+    if not env.pre && s = T.Actor then begin
+      if not (T.is_shared_func t) then
+        error env typ.at "M0042" "actor field %s must have shared function type, but has type\n  %s"
+          id.it (T.string_of_typ_expand t)
+    end;
+    T.{lab = id.it; typ = t; depr = None}
+  | TypF (id, typ_binds, typ) ->
+    let k = check_typ_def env typ_field.at (id, typ_binds, typ) in
+    let c = Cons.fresh id.it k in
+    T.{lab = id.it; typ = Typ c; depr = None}
+
+and check_typ_tag env typ_tag =
+  let {tag; typ} = typ_tag.it in
+  let t = check_typ env typ in
+  T.{lab = tag.it; typ = t; depr = None}
+
+and check_typ_binds_acyclic env typ_binds cs ts  =
+  let n = List.length cs in
+  let ce = List.fold_right2 T.ConEnv.add cs ts T.ConEnv.empty in
+  let chase typ_bind c =
+    let rec chase i ts c' =
+      if i > n then
+        error env typ_bind.at "M0043" "type parameter %s has cyclic bounds %s"
+          (T.string_of_con c)
+          (String.concat " <: " (List.map T.string_of_typ ts)) (List.rev ts)
+      else
+        match T.ConEnv.find_opt c' ce with
+        | None -> ()
+        | Some t ->
+          (match T.normalize t with
+           | T.Con (c'', []) as t' ->
+             chase (i+1) (t'::ts) c''
+           | _ -> ())
+    in chase 0 [] c
+  in List.iter2 chase typ_binds cs
+
+and check_typ_bind_sorts env tbs =
+  (* assert, don't error, since this should be a syntactic invariant of parsing *)
+  List.iteri (fun i tb -> assert (i = 0 || (tb.T.sort = T.Type))) tbs;
+
+and check_typ_binds env typ_binds : T.con list * T.bind list * Scope.typ_env * Scope.con_env =
+  let xs = List.map (fun typ_bind -> typ_bind.it.var.it) typ_binds in
+  let cs =
+    List.map2 (fun x tb ->
+      match tb.note with
+      | Some c -> c
+      | None -> Cons.fresh x (T.Abs ([], T.Pre))) xs typ_binds in
+  let te = List.fold_left2 (fun te typ_bind c ->
+      let id = typ_bind.it.var in
+      if T.Env.mem id.it te then
+        error env id.at "M0044" "duplicate type name %s in type parameter list" id.it;
+      T.Env.add id.it c te
+    ) T.Env.empty typ_binds cs in
+  let pre_env' = add_typs {env with pre = true} xs cs  in
+  let tbs = List.map (fun typ_bind ->
+    { T.var = typ_bind.it.var.it;
+      T.sort = typ_bind.it.sort.it;
+      T.bound = check_typ pre_env' typ_bind.it.bound }) typ_binds
+  in
+  check_typ_bind_sorts env tbs;
+  let ts = List.map (fun tb -> tb.T.bound) tbs in
+  check_typ_binds_acyclic env typ_binds cs ts;
+  let ks = List.map (fun t -> T.Abs ([], t)) ts in
+  List.iter2 (fun c k ->
+    match Cons.kind c with
+    | T.Abs (_, T.Pre) -> T.set_kind c k
+    | k' -> assert (T.eq_kind k k')
+  ) cs ks;
+  let env' = add_typs env xs cs in
+  let _ = List.map (fun typ_bind -> check_typ env' typ_bind.it.bound) typ_binds in
+  List.iter2 (fun typ_bind c -> typ_bind.note <- Some c) typ_binds cs;
+  cs, tbs, te, T.ConSet.of_list cs
+
+and check_typ_bind env typ_bind : T.con * T.bind * Scope.typ_env * Scope.con_env =
+  match check_typ_binds env [typ_bind] with
+  | [c], [tb], te, cs -> c, tb, te, cs
+  | _ -> assert false
+
+and check_typ_bounds env (tbs : T.bind list) (ts : T.typ list) ats at =
+  let pars = List.length tbs in
+  let args = List.length ts in
+  if pars <> args then begin
+    let consider_scope x = match tbs with
+      | hd :: _ when hd.T.sort = T.Scope -> x - 1
+      | _ -> x in
+    error env at "M0045"
+      "wrong number of type arguments: expected %d but got %d"
+      (consider_scope pars)
+      (consider_scope args)
+    end;
+  let rec go tbs' ts' ats' =
+    match tbs', ts', ats' with
+    | tb::tbs', t::ts', at'::ats' ->
+      if not env.pre then
+        let u = T.open_ ts tb.T.bound in
+        if not (T.sub t u) then
+          local_error env at' "M0046"
+            "type argument%a\ndoes not match parameter bound%a"
+            display_typ_expand t
+            display_typ_expand u;
+        go tbs' ts' ats'
+    | [], [], [] -> ()
+    | _  -> assert false
+  in go tbs ts ats
+
+(* Check type definitions productive and non-expansive *)
+and check_con_env env at ce =
+  let cs = Productive.non_productive ce in
+  if not (T.ConSet.is_empty cs) then
+    error env at "M0157" "block contains non-productive definition%s %s"
+      (plural cs)
+      (String.concat ", " (List.sort compare (List.map Cons.name (T.ConSet.elements cs))));
+
+  begin match Mo_types.Expansive.is_expansive ce with
+  | None -> ()
+  | Some msg ->
+    error env at "M0156" "block contains expansive type definitions%s" msg
+  end;
+
+and infer_inst env sort tbs typs at =
+  let ts = List.map (check_typ env) typs in
+  let ats = List.map (fun typ -> typ.at) typs in
+  match tbs,typs with
+  | {T.bound; sort = T.Scope; _}::tbs', typs' ->
+    assert (List.for_all (fun tb -> tb.T.sort = T.Type) tbs');
+    (match env.async with
+     | (C.AwaitCap c | C.AsyncCap c) when sort = T.Shared T.Query || sort = T.Shared T.Write || sort = T.Local ->
+        (T.Con(c,[])::ts, at::ats)
+     | (C.AwaitCap c | C.AsyncCap c) when sort = T.Shared T.Composite ->
+        error env at "M0186"
+         "composite send capability required, but not available\n  (cannot call a `composite query` function from a non-`composite query` function)"
+     | (C.CompositeAwaitCap c | C.CompositeCap c) ->
+       begin
+         match sort with
+         | T.(Shared (Composite | Query)) ->
+           (T.Con(c,[])::ts, at::ats)
+         | T.((Shared Write) | Local) ->
+           error env at "M0187"
+             "send capability required, but not available\n  (cannot call a `shared` function from a `composite query` function; only calls to `query` and `composite query` functions are allowed)"
+       end
+     | C.ErrorCap
+     | C.QueryCap _ ->
+        error env at "M0188"
+         "send capability required, but not available\n  (cannot call a `shared` function from a `query` function)"
+     | C.NullCap
+     | _ ->
+        error env at "M0047"
+          "send capability required, but not available\n (need an enclosing async expression or function body)"
+    )
+  | tbs', typs' ->
+    assert (List.for_all (fun tb -> tb.T.sort = T.Type) tbs');
+    ts, ats
+
+and check_inst_bounds env sort tbs inst at =
+  let ts, ats = infer_inst env sort tbs inst at in
+  check_typ_bounds env tbs ts ats at;
+  ts
+
+
+(* Subgrammar of explicitly typed expressions *)
+
+(* Roughly, this defines the sublanguage of expressions whose inferred type
+   is determined by explicit type annotations or previously defined identifiers,
+   or by expressions whose type is unambiguous and can be weakened only to Any
+   or via lossy width subtyping on records.
+
+   The intuition is that for an explicit expression, the inferred type is a
+   "good enough" choice to resolve overloading of operators that have it as
+   an operand.
+
+   Specifically, this excludes expression forms that are either overloaded
+   or have a principal type like None or Null, that are subtypes of other
+   non-trivial types. These must be excluded so that examples like the
+   following do not run into checking mode with a type that is too small:
+
+     null == ?0
+     [] == [0]
+     (break) == 0
+*)
+
+let is_explicit_lit l =
+  match l with
+  | BoolLit _ -> true
+  | _ -> false
+
+let rec is_explicit_pat p =
+  match p.it with
+  | WildP | VarP _ -> false
+  | LitP l | SignP (_, l) -> is_explicit_lit !l
+  | OptP p1 | TagP (_, p1) | ParP p1 -> is_explicit_pat p1
+  | TupP ps -> List.for_all is_explicit_pat ps
+  | ObjP pfs -> List.for_all (fun (pf : pat_field) -> is_explicit_pat pf.it.pat) pfs
+  | AltP (p1, p2) -> is_explicit_pat p1 && is_explicit_pat p2
+  | AnnotP _ -> true
+
+let rec is_explicit_exp e =
+  match e.it with
+  | PrimE _ | ActorUrlE _
+  | TagE _
+  | BreakE _ | RetE _ | ThrowE _ ->
+    false
+  | VarE _
+  | RelE _ | NotE _ | AndE _ | OrE _ | ImpliesE _ | OldE _ | ShowE _ | ToCandidE _ | FromCandidE _
+  | AssignE _ | IgnoreE _ | AssertE _ | DebugE _
+  | WhileE _ | ForE _
+  | AnnotE _ | ImportE _ ->
+    true
+  | LitE l -> is_explicit_lit !l
+  | UnE (_, _, e1) | OptE e1 | DoOptE e1
+  | ProjE (e1, _) | DotE (e1, _) | BangE e1 | IdxE (e1, _) | CallE (e1, _, _)
+  | LabelE (_, _, e1) | AsyncE (_, _, e1) | AwaitE (_, e1) ->
+    is_explicit_exp e1
+  | BinE (_, e1, _, e2) | IfE (_, e1, e2) ->
+    is_explicit_exp e1 || is_explicit_exp e2
+  | TupE es -> List.for_all is_explicit_exp es
+  | ObjE (bases, efs) ->
+    List.(for_all is_explicit_exp bases
+          && for_all (fun (ef : exp_field) -> is_explicit_exp ef.it.exp) efs)
+  | ObjBlockE (_, dfs) ->
+    List.for_all (fun (df : dec_field) -> is_explicit_dec df.it.dec) dfs
+  | ArrayE (_, es) -> List.exists is_explicit_exp es
+  | SwitchE (e1, cs) | TryE (e1, cs) ->
+    is_explicit_exp e1 &&
+    List.exists (fun (c : case) -> is_explicit_exp c.it.exp) cs
+  | BlockE ds -> List.for_all is_explicit_dec ds
+  | FuncE (_, _, _, p, t_opt, _, _) -> is_explicit_pat p && t_opt <> None
+  | LoopE (_, e_opt) -> e_opt <> None
+
+and is_explicit_dec d =
+  match d.it with
+  | ExpD e | LetD (_, e, _) | VarD (_, e) -> is_explicit_exp e
+  | TypD _ -> true
+  | ClassD (_, _, _, p, _, _, _, dfs) ->
+    is_explicit_pat p &&
+    List.for_all (fun (df : dec_field) -> is_explicit_dec df.it.dec) dfs
+
+
+(* Literals *)
+
+let check_lit_val env t of_string at s =
+  try of_string s with Invalid_argument _ ->
+    error env at "M0048" "literal out of range for type %s"
+      (T.string_of_typ (T.Prim t))
+
+let check_nat env = check_lit_val env T.Nat Numerics.Nat.of_string
+let check_nat8 env = check_lit_val env T.Nat8 Numerics.Nat8.of_string
+let check_nat16 env = check_lit_val env T.Nat16 Numerics.Nat16.of_string
+let check_nat32 env = check_lit_val env T.Nat32 Numerics.Nat32.of_string
+let check_nat64 env = check_lit_val env T.Nat64 Numerics.Nat64.of_string
+let check_int env = check_lit_val env T.Int Numerics.Int.of_string
+let check_int8 env = check_lit_val env T.Int8 Numerics.Int_8.of_string
+let check_int16 env = check_lit_val env T.Int16 Numerics.Int_16.of_string
+let check_int32 env = check_lit_val env T.Int32 Numerics.Int_32.of_string
+let check_int64 env = check_lit_val env T.Int64 Numerics.Int_64.of_string
+let check_float env = check_lit_val env T.Float Numerics.Float.of_string
+
+let check_text env at s =
+  if not (Lib.Utf8.is_valid s) then
+    local_error env at "M0049" "string literal \"%s\": is not valid utf8" (String.escaped s);
+  s
+
+let infer_lit env lit at : T.prim =
+  match !lit with
+  | NullLit -> T.Null
+  | BoolLit _ -> T.Bool
+  | NatLit _ -> T.Nat
+  | Nat8Lit _ -> T.Nat8
+  | Nat16Lit _ -> T.Nat16
+  | Nat32Lit _ -> T.Nat32
+  | Nat64Lit _ -> T.Nat64
+  | IntLit _ -> T.Int
+  | Int8Lit _ -> T.Int8
+  | Int16Lit _ -> T.Int16
+  | Int32Lit _ -> T.Int32
+  | Int64Lit _ -> T.Int64
+  | FloatLit _ -> T.Float
+  | CharLit _ -> T.Char
+  | TextLit _ -> T.Text
+  | BlobLit _ -> T.Blob
+  | PreLit (s, T.Nat) ->
+    lit := NatLit (check_nat env at s); (* default *)
+    T.Nat
+  | PreLit (s, T.Int) ->
+    lit := IntLit (check_int env at s); (* default *)
+    T.Int
+  | PreLit (s, T.Float) ->
+    lit := FloatLit (check_float env at s); (* default *)
+    T.Float
+  | PreLit (s, T.Text) ->
+    lit := TextLit (check_text env at s); (* default *)
+    T.Text
+  | PreLit _ ->
+    assert false
+
+let check_lit env t lit at =
+  match t, !lit with
+  | T.Prim T.Nat, PreLit (s, T.Nat) ->
+    lit := NatLit (check_nat env at s)
+  | T.Prim T.Nat8, PreLit (s, T.Nat) ->
+    lit := Nat8Lit (check_nat8 env at s)
+  | T.Prim T.Nat16, PreLit (s, T.Nat) ->
+    lit := Nat16Lit (check_nat16 env at s)
+  | T.Prim T.Nat32, PreLit (s, T.Nat) ->
+    lit := Nat32Lit (check_nat32 env at s)
+  | T.Prim T.Nat64, PreLit (s, T.Nat) ->
+    lit := Nat64Lit (check_nat64 env at s)
+  | T.Prim T.Int, PreLit (s, (T.Nat | T.Int)) ->
+    lit := IntLit (check_int env at s)
+  | T.Prim T.Int8, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int8Lit (check_int8 env at s)
+  | T.Prim T.Int16, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int16Lit (check_int16 env at s)
+  | T.Prim T.Int32, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int32Lit (check_int32 env at s)
+  | T.Prim T.Int64, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int64Lit (check_int64 env at s)
+  | T.Prim T.Float, PreLit (s, (T.Nat | T.Int | T.Float)) ->
+    lit := FloatLit (check_float env at s)
+  | T.Prim T.Blob, PreLit (s, T.Text) ->
+    lit := BlobLit s
+  | t, _ ->
+    let t' = T.Prim (infer_lit env lit at) in
+    if not (T.sub t' t) then
+      error env at "M0050"
+        "literal of type%a\ndoes not have expected type%a"
+        display_typ t'
+        display_typ_expand t
+
+
+(* Coercions *)
+
+let array_obj t =
+  let open T in
+  let immut t =
+    [ {lab = "get";  typ = Func (Local, Returns, [], [Prim Nat], [t]); depr = None};
+      {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); depr = None};
+      {lab = "keys"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Nat)]); depr = None};
+      {lab = "vals"; typ = Func (Local, Returns, [], [], [iter_obj t]); depr = None};
+    ] in
+  let mut t = immut t @
+    [ {lab = "put"; typ = Func (Local, Returns, [], [Prim Nat; t], []); depr = None} ] in
+  Object,
+  List.sort compare_field (match t with Mut t' -> mut t' | t -> immut t)
+
+let blob_obj () =
+  let open T in
+  Object,
+  [ {lab = "vals"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Nat8)]); depr = None};
+    {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); depr = None};
+  ]
+
+let text_obj () =
+  let open T in
+  Object,
+  [ {lab = "chars"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Char)]); depr = None};
+    {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); depr = None};
+  ]
+
+
+(* Expressions *)
+
+let error_duplicate env kind id =
+  error env id.at "M0051" "duplicate definition for %s%s in block" kind id.it
+
+
+let error_bin_op env at t1 t2 =
+  error env at "M0060"
+    "operator is not defined for operand types%a\nand%a"
+    display_typ_expand t1
+    display_typ_expand t2
+
+let rec infer_exp env exp : T.typ =
+  infer_exp' T.as_immut env exp
+
+and infer_exp_mut env exp : T.typ =
+  infer_exp' Fun.id env exp
+
+and infer_exp_promote env exp : T.typ =
+  let t = infer_exp env exp in
+  let t' = T.promote t in
+  if t' = T.Pre then
+    error env exp.at "M0053"
+      "cannot infer type of expression while trying to infer surrounding class type,\nbecause its type is a forward reference to type%a"
+      display_typ_expand t;
+  t'
+
+and infer_exp' f env exp : T.typ =
+  assert (exp.note.note_typ = T.Pre);
+  let t = infer_exp'' env exp in
+  assert (t <> T.Pre);
+  let t' = f t in
+  if not env.pre then begin
+    assert (T.normalize t' <> T.Pre);
+    let e = A.infer_effect_exp exp in
+    exp.note <- {note_typ = T.normalize t'; note_eff = e}
+  end;
+  t'
+
+and infer_exp'' env exp : T.typ =
+  let context = env.context in
+  let in_actor = env.in_actor in
+  let env = {env with in_actor = false; in_prog = false; context = exp.it::env.context} in
+  match exp.it with
+  | PrimE _ ->
+    error env exp.at "M0054" "cannot infer type of primitive"
+  | VarE id ->
+    (match T.Env.find_opt id.it env.vals with
+    | Some (T.Pre, _) ->
+      error env id.at "M0055" "cannot infer type of forward variable %s" id.it;
+    | Some (t, Unavailable) ->
+      if !Flags.compiled then
+        error env id.at "M0056" "variable %s is in scope but not available in compiled code" id.it
+      else t
+    | Some (t, Available) -> t
+    | None ->
+      error env id.at "M0057" "unbound variable %s" id.it
+    )
+  | LitE lit ->
+    T.Prim (infer_lit env lit exp.at)
+  | ActorUrlE exp' ->
+    if not env.pre then check_exp_strong env T.text exp';
+    error env exp.at "M0058" "no type can be inferred for actor reference"
+  | UnE (ot, op, exp1) ->
+    let t1 = infer_exp_promote env exp1 in
+    let t = Operator.type_unop op t1 in
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      if not (Operator.has_unop op t) then
+        error env exp.at "M0059" "operator is not defined for operand type%a"
+          display_typ_expand t;
+      ot := t;
+    end;
+    t
+  | BinE (ot, exp1, op, exp2) ->
+    let t1, t2 = infer_bin_exp env exp1 exp2 in
+    let t = Operator.type_binop op (T.lub (T.promote t1) (T.promote t2)) in
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      if not (Operator.has_binop op t) then
+        error_bin_op env exp.at t1 t2
+      else if op = Operator.SubOp && T.eq t T.nat then
+        warn env exp.at "M0155" "operator may trap for inferred type%a"
+          display_typ_expand t;
+      ot := t
+    end;
+    t
+  | RelE (ot, exp1, op, exp2) ->
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      let t1, t2 = infer_bin_exp env exp1 exp2 in
+      let t = Operator.type_relop op (T.lub (T.promote t1) (T.promote t2)) in
+      if not (Operator.has_relop op t) then
+        error_bin_op env exp.at t1 t2;
+      if not (T.eq t t1 || T.eq t t2) && not (T.sub T.nat t1 && T.sub T.nat t2) then
+        if T.eq t1 t2 then
+          warn env exp.at "M0061"
+            "comparing abstract type%a\nto itself at supertype%a"
+            display_typ_expand t1
+            display_typ_expand t
+        else
+          warn env exp.at "M0062"
+            "comparing incompatible types%a\nand%a\nat common supertype%a"
+            display_typ_expand t1
+            display_typ_expand t2
+            display_typ_expand t;
+      ot := t;
+    end;
+    T.bool
+  | ShowE (ot, exp1) ->
+    if not env.pre then begin
+      let t = infer_exp_promote env exp1 in
+      if not (Show.can_show t) then
+        error env exp.at "M0063" "show is not defined for operand type%a"
+          display_typ_expand t;
+      ot := t
+    end;
+    T.text
+  | ToCandidE exps ->
+    if not env.pre then begin
+        let ts = List.map (infer_exp env) exps in
+        if not (T.shared (T.seq ts)) then
+          error env exp.at "M0175" "to_candid argument must have shared type, but instead has non-shared type%a"
+            display_typ_expand (T.seq ts);
+      end;
+    T.Prim T.Blob
+  | FromCandidE exp1 ->
+    error env exp.at "M0176" "from_candid requires but is missing a known type (from context)"
+  | TupE exps ->
+    let ts = List.map (infer_exp env) exps in
+    T.Tup ts
+  | OptE exp1 ->
+    let t1 = infer_exp env exp1 in
+    T.Opt t1
+  | DoOptE exp1 ->
+    let env' = add_lab env "!" (T.Prim T.Null) in
+    let t1 = infer_exp env' exp1 in
+    T.Opt t1
+  | BangE exp1 ->
+    begin
+      let t1 = infer_exp_promote env exp1 in
+      if Option.is_none (T.Env.find_opt "!" env.labs) then
+        local_error env exp.at "M0064" "misplaced '!' (no enclosing 'do ? { ... }' expression)";
+      try
+        T.as_opt_sub t1
+      with Invalid_argument _ ->
+        error env exp1.at "M0065"
+          "expected option type before '!', but expression produces type%a"
+          display_typ_expand t1
+    end
+  | TagE (id, exp1) ->
+    let t1 = infer_exp env exp1 in
+    T.Variant [T.{lab = id.it; typ = t1; depr = None}]
+  | ProjE (exp1, n) ->
+    let t1 = infer_exp_promote env exp1 in
+    (try
+      let ts = T.as_tup_sub n t1 in
+      match List.nth_opt ts n with
+      | Some t -> t
+      | None ->
+        error env exp.at "M0066" "tuple projection %n is out of bounds for type%a"
+          n
+          display_typ_expand t1
+    with Invalid_argument _ ->
+      error env exp1.at "M0067"
+        "expected tuple type, but expression produces type%a"
+        display_typ_expand t1
+    )
+  | ObjBlockE (obj_sort, dec_fields) ->
+    if obj_sort.it = T.Actor then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env exp.at "M0068"
+        "actors are not supported";
+      match context with
+      | (AsyncE _ :: AwaitE _ :: _ :: _ ) ->
+         error_in [Flags.ICMode; Flags.RefMode] env exp.at "M0069"
+           "non-toplevel actor; an actor can only be declared at the toplevel of a program"
+      | _ -> ()
+    end;
+    let env' =
+      if obj_sort.it = T.Actor then
+        { env with async = C.NullCap; in_actor = true }
+      else env
+    in
+    infer_obj env' obj_sort.it dec_fields exp.at
+  | ObjE (exp_bases, exp_fields) ->
+    let open List in
+    check_ids env "object" "field"
+      (map (fun (ef : exp_field) -> ef.it.id) exp_fields);
+    let fts = map (infer_exp_field env) exp_fields in
+    let bases = map (fun b -> infer_exp_promote env b, b) exp_bases in
+    let homonymous_fields ft1 ft2 = T.compare_field ft1 ft2 = 0 in
+
+    (* removing explicit fields from the bases *)
+    let strip (base_t, base) =
+      let s, base_fts =
+        try T.as_obj base_t with Invalid_argument _ ->
+          error env base.at "M0093"
+            "expected object type, but expression produces type%a"
+            display_typ_expand base_t in
+      (* forbid actors as bases *)
+      if s = T.Actor then
+        error env base.at "M0178"
+          "actors cannot serve as bases in record extensions";
+      T.(Obj (Object, filter (fun ft -> not (exists (homonymous_fields ft) fts)) base_fts))
+    in
+    let stripped_bases = map strip bases in
+
+    let ambiguous_fields ft1 ft2 =
+      homonymous_fields ft1 ft2 &&
+      (* allow equivalent type fields *)
+      T.(match ft1.typ, ft2.typ with
+         (* homonymous type fields are ambiguous when unequal *)
+         | Typ c1, Typ c2 ->  not (T.eq ft1.typ ft2.typ)
+         (* homonymous value fields are always ambiguous *)
+         | _ -> true)
+    in
+
+    (* field disjointness of stripped bases *)
+    let rec disjoint = function
+      | [] | [_] -> ()
+      | (h, h_exp) :: t ->
+        let avoid ft =
+          let avoid_fields b b_fts =
+            if exists (ambiguous_fields ft) b_fts then
+              begin
+                let frag_typ, frag_sug = match ft.T.typ with
+                  | T.Typ c -> "type ", ""
+                  | _ -> "", " (consider overwriting)" in
+                info env h_exp.at "%sfield also present in base, here%s" frag_typ frag_sug;
+                error env b.at "M0177"
+                  "ambiguous %sfield in base%a"
+                  frag_typ
+                  display_lab ft.T.lab
+              end in
+          iter (fun (b_t, b) -> avoid_fields b (T.as_obj b_t |> snd)) t in
+        iter avoid (T.as_obj h |> snd);
+        disjoint t in
+    disjoint (map2 (fun b_t b -> b_t, b) stripped_bases exp_bases);
+
+    (* do not allow var fields for now (to avoid aliasing) *)
+    begin if not (!Flags.experimental_field_aliasing) then
+      let immutable_base b_typ b_exp =
+        let constant_field (ft : T.field) =
+          if T.(is_mut ft.typ) then
+            begin
+              info env b_exp.at "overwrite field to resolve error";
+              error env b_exp.at "M0179"
+                "base has non-aliasable var field%a"
+                display_lab ft.T.lab
+            end
+        in
+        iter constant_field (T.as_obj b_typ |> snd)
+      in
+      iter2 immutable_base stripped_bases exp_bases
+    end;
+    let t_base = T.(fold_left glb (Obj (Object, [])) stripped_bases) in
+    T.(glb t_base (Obj (Object, sort T.compare_field fts)))
+  | DotE (exp1, id) ->
+    let t1 = infer_exp_promote env exp1 in
+    let _s, tfs =
+      try T.as_obj_sub [id.it] t1 with Invalid_argument _ ->
+      try array_obj (T.as_array_sub t1) with Invalid_argument _ ->
+      try blob_obj (T.as_prim_sub T.Blob t1) with Invalid_argument _ ->
+      try text_obj (T.as_prim_sub T.Text t1) with Invalid_argument _ ->
+        error env exp1.at "M0070"
+          "expected object type, but expression produces type%a"
+          display_typ_expand t1
+    in
+    (match T.lookup_val_field id.it tfs with
+    | T.Pre ->
+      error env exp.at "M0071"
+        "cannot infer type of forward field reference %s"
+        id.it
+    | t ->
+      Option.iter
+        (warn env exp.at "M0154" "field %s is deprecated:\n%s" id.it)
+        (T.lookup_val_deprecation id.it tfs);
+      t
+    | exception Invalid_argument _ ->
+      error env exp1.at "M0072"
+        "field %s does not exist in type%a"
+        id.it
+        display_typ_expand t1
+    )
+  | AssignE (exp1, exp2) ->
+    if not env.pre then begin
+      let t1 = infer_exp_mut env exp1 in
+      try
+        let t2 = T.as_mut t1 in
+        check_exp_strong env t2 exp2
+      with Invalid_argument _ ->
+        error env exp.at "M0073" "expected mutable assignment target";
+    end;
+    T.unit
+  | ArrayE (mut, exps) ->
+    let ts = List.map (infer_exp env) exps in
+    let t1 = List.fold_left T.lub T.Non ts in
+    if not env.pre && inconsistent t1 ts then
+      warn env exp.at "M0074"
+        "this array has type%a\nbecause elements have inconsistent types"
+        display_typ (T.Array t1);
+    T.Array (match mut.it with Const -> t1 | Var -> T.Mut t1)
+  | IdxE (exp1, exp2) ->
+    let t1 = infer_exp_promote env exp1 in
+    (try
+      let t = T.as_array_sub t1 in
+      if not env.pre then check_exp_strong env T.nat exp2;
+      t
+    with Invalid_argument _ ->
+      error env exp1.at "M0075"
+        "expected array type, but expression produces type%a"
+        display_typ_expand t1
+    )
+  | FuncE (_, shared_pat, typ_binds, pat, typ_opt, _sugar, exp1) ->
+    if not env.pre && not in_actor && T.is_shared_sort shared_pat.it then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0076"
+        "shared functions are not supported";
+      if not in_actor then
+        error_in [Flags.ICMode; Flags.RefMode] env exp1.at "M0077"
+          "a shared function is only allowed as a public field of an actor";
+    end;
+    let typ = match typ_opt with
+      | Some typ -> typ
+      | None -> {it = TupT []; at = no_region; note = T.Pre}
+    in
+    let sort, ve = check_shared_pat env shared_pat in
+    let cs, tbs, te, ce = check_typ_binds env typ_binds in
+    let c, ts2 = as_codomT sort typ in
+    check_shared_return env typ.at sort c ts2;
+    let env' = infer_async_cap (adjoin_typs env te ce) sort cs tbs exp.at in
+    let t1, ve1 = infer_pat_exhaustive (if T.is_shared_sort sort then local_error else warn) env' pat in
+    let ve2 = T.Env.adjoin ve ve1 in
+    let ts2 = List.map (check_typ env') ts2 in
+    typ.note <- T.seq ts2; (* HACK *)
+    let codom = T.codom c (fun () -> T.Con(List.hd cs,[])) ts2 in
+    if not env.pre then begin
+      let env'' =
+        { env' with
+          labs = T.Env.empty;
+          rets = Some codom;
+          (* async = None; *) }
+      in
+      check_exp_strong (adjoin_vals env'' ve2) codom exp1;
+      if Type.is_shared_sort sort then begin
+        check_shared_binds env exp.at tbs;
+        if not (T.shared t1) then
+          error_shared env t1 pat.at "M0031"
+            "shared function has non-shared parameter type%a"
+            display_typ_expand t1;
+        List.iter (fun t ->
+          if not (T.shared t) then
+            error_shared env t typ.at "M0032"
+              "shared function has non-shared return type%a"
+              display_typ_expand t;
+        ) ts2;
+        match c, ts2 with
+        | T.Returns, [] when sort = T.Shared T.Write ->
+          if not (is_ignore_asyncE exp1) then
+            error env exp1.at "M0078"
+              "shared function with () result type has unexpected body:\n  the body must either be of sugared form '{ ... }' \n  or explicit form '= ignore ((async ...) : async ())'"
+        | T.Promises, _ ->
+          if not (is_asyncE exp1) then
+            error env exp1.at "M0079"
+              "shared function with async result type has non-async body"
+        | _ ->
+          error env typ.at "M0041" "shared function has non-async result type%a"
+            display_typ_expand codom
+      end
+    end;
+    let ts1 = match pat.it with TupP _ -> T.seq_of_tup t1 | _ -> [t1] in
+    T.Func (sort, c, T.close_binds cs tbs, List.map (T.close cs) ts1, List.map (T.close cs) ts2)
+  | CallE (exp1, inst, exp2) ->
+    infer_call env exp1 inst exp2 exp.at None
+  | BlockE decs ->
+    let t, _ = infer_block env decs exp.at in
+    t
+  | NotE exp1 ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    T.bool
+  | AndE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | OrE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | ImpliesE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | OldE exp1 ->
+    infer_exp_promote env exp1
+  | IfE (exp1, exp2, exp3) ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    let t2 = infer_exp env exp2 in
+    let t3 = infer_exp env exp3 in
+    let t = T.lub t2 t3 in
+    if not env.pre && inconsistent t [t2; t3] then
+      warn env exp.at "M0081"
+        "this if has type%a\nbecause branches have inconsistent types,\ntrue produces%a\nfalse produces%a"
+        display_typ t
+        display_typ_expand t2
+        display_typ_expand t3;
+    t
+  | SwitchE (exp1, cases) ->
+    let t1 = infer_exp_promote env exp1 in
+    let t = infer_cases env t1 T.Non cases in
+    if not env.pre then
+      coverage_cases "switch" env cases t1 exp.at;
+    t
+  | TryE (exp1, cases) ->
+    let t1 = infer_exp env exp1 in
+    let t2 = infer_cases env T.catch T.Non cases in
+    if not env.pre then begin
+      check_ErrorCap env "try" exp.at;
+      coverage_cases "try handler" env cases T.catch exp.at
+    end;
+    T.lub t1 t2
+  | WhileE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.unit exp2
+    end;
+    T.unit
+  | LoopE (exp1, None) ->
+    if not env.pre then begin
+      check_exp_strong env T.unit exp1
+    end;
+    T.Non
+  | LoopE (exp1, Some exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.unit exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.unit
+  | ForE (pat, exp1, exp2) ->
+    if not env.pre then begin
+      let t1 = infer_exp_promote env exp1 in
+      (try
+        let _, tfs = T.as_obj_sub ["next"] t1 in
+        let t = T.lookup_val_field "next" tfs in
+        let t1, t2 = T.as_mono_func_sub t in
+        if not (T.sub T.unit t1) then raise (Invalid_argument "");
+        let t2' = T.as_opt_sub t2 in
+        let ve = check_pat_exhaustive warn env t2' pat in
+        check_exp_strong (adjoin_vals env ve) T.unit exp2
+      with Invalid_argument _ | Not_found ->
+        local_error env exp1.at "M0082"
+          "expected iterable type, but expression has type%a"
+          display_typ_expand t1
+      );
+    end;
+    T.unit
+  | LabelE (id, typ, exp1) ->
+    let t = check_typ env typ in
+    if not env.pre then check_exp (add_lab env id.it t) t exp1;
+    t
+  | DebugE exp1 ->
+    if not env.pre then check_exp_strong env T.unit exp1;
+    T.unit
+  | BreakE (id, exp1) ->
+    (match T.Env.find_opt id.it env.labs with
+    | Some t ->
+      if not env.pre then check_exp env t exp1
+    | None ->
+      let name =
+        match String.split_on_char ' ' id.it with
+        | ["continue"; name] -> name
+        | _ -> id.it
+      in local_error env id.at "M0083" "unbound label %s" name
+    );
+    T.Non
+  | RetE exp1 ->
+    if not env.pre then begin
+      match env.rets with
+      | Some T.Pre ->
+        local_error env exp.at "M0084" "cannot infer return type"
+      | Some t ->
+        check_exp_strong env t exp1
+      | None ->
+        local_error env exp.at "M0085" "misplaced return"
+    end;
+    T.Non
+  | ThrowE exp1 ->
+    if not env.pre then begin
+      check_ErrorCap env "throw" exp.at;
+      check_exp_strong env T.throw exp1
+    end;
+    T.Non
+  | AsyncE (s, typ_bind, exp1) ->
+    error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0086"
+      "async expressions are not supported";
+    let t1, next_cap = check_AsyncCap env "async expression" exp.at in
+    let c, tb, ce, cs = check_typ_bind env typ_bind in
+    let ce_scope = T.Env.add T.default_scope_var c ce in (* pun scope var with c *)
+    let env' =
+      {(adjoin_typs env ce_scope cs) with
+        labs = T.Env.empty;
+        rets = Some T.Pre;
+        async = next_cap c;
+        scopes = T.ConEnv.add c exp.at env.scopes } in
+    let t = infer_exp env' exp1 in
+    let t' = T.open_ [t1] (T.close [c] t)  in
+    if not (T.shared t') then
+      error_shared env t' exp1.at "M0033" "async type has non-shared content type%a"
+        display_typ_expand t';
+    T.Async (s, t1, t')
+  | AwaitE (s, exp1) ->
+    let t0 = check_AwaitCap env "await" exp.at in
+    let t1 = infer_exp_promote env exp1 in
+    (try
+       let (t2, t3) = T.as_async_sub s t0 t1 in
+       if not (T.eq t0 t2) then begin
+          local_error env exp1.at "M0087"
+            "ill-scoped await: expected async type from current scope %s, found async type from other scope %s%s%s"
+           (T.string_of_typ_expand t0)
+           (T.string_of_typ_expand t2)
+           (associated_region env t0 exp.at)
+           (associated_region env t2 exp.at);
+         scope_info env t0 exp.at;
+         scope_info env t2 exp.at;
+       end;
+       t3
+     with Invalid_argument _ ->
+       error env exp1.at "M0088"
+         "expected async%s type, but expression has type%a%s"
+         (if s = T.Fut then "" else "*")
+         display_typ_expand t1
+         (if T.is_async t1 then
+            (if s = T.Fut then
+              "\nUse keyword 'await*' (not 'await') to consume this type."
+            else
+              "\nUse keyword 'await' (not 'await*') to consume this type.")
+          else "")
+    )
+  | AssertE (_, exp1) ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    T.unit
+  | AnnotE (exp1, typ) ->
+    let t = check_typ env typ in
+    if not env.pre then check_exp_strong env t exp1;
+    t
+  | IgnoreE exp1 ->
+    if not env.pre then begin
+      check_exp_strong env T.Any exp1;
+      if T.sub exp1.note.note_typ T.unit then
+        warn env exp.at "M0089" "redundant ignore, operand already has type ()"
+    end;
+    T.unit
+  | ImportE (f, ri) ->
+    check_import env exp.at f ri
+
+and infer_bin_exp env exp1 exp2 =
+  match is_explicit_exp exp1, is_explicit_exp exp2 with
+  | true, false ->
+    let t1 = T.normalize (infer_exp env exp1) in
+    if not env.pre then check_exp_weak env t1 exp2;
+    t1, t1
+  | false, true ->
+    let t2 = T.normalize (infer_exp env exp2) in
+    if not env.pre then check_exp_weak env t2 exp1;
+    t2, t2
+  | _ ->
+    let t1 = T.normalize (infer_exp env exp1) in
+    let t2 = T.normalize (infer_exp env exp2) in
+    t1, t2
+
+and infer_exp_field env rf =
+  let { mut; id; exp } = rf.it in
+  let t = infer_exp env exp in
+  let t1 = if mut.it = Syntax.Var then T.Mut t else t in
+  T.{ lab = id.it; typ = t1; depr = None }
+
+and check_exp_strong env t exp =
+  check_exp {env with weak = false} t exp
+
+and check_exp_weak env t exp =
+  check_exp {env with weak = true} t exp
+
+and check_exp env t exp =
+  assert (not env.pre);
+  assert (exp.note.note_typ = T.Pre);
+  assert (t <> T.Pre);
+  let t' = check_exp' env (T.normalize t) exp in
+  let e = A.infer_effect_exp exp in
+  exp.note <- {note_typ = t'; note_eff = e}
+
+and check_exp' env0 t exp : T.typ =
+  let env = {env0 with in_prog = false; in_actor = false; context = exp.it :: env0.context } in
+  match exp.it, t with
+  | PrimE s, T.Func _ ->
+    t
+  | LitE lit, _ ->
+    check_lit env t lit exp.at;
+    t
+  | ActorUrlE exp', t' ->
+    check_exp_strong env T.text exp';
+    begin match T.normalize t' with
+    | T.(Obj (Actor, _)) -> t'
+    | _ -> error env exp.at "M0090" "actor reference must have an actor type"
+    end
+  | UnE (ot, op, exp1), _ when Operator.has_unop op t ->
+    ot := t;
+    check_exp env t exp1;
+    t
+  | BinE (ot, exp1, op, exp2), _ when Operator.has_binop op t ->
+    ot := t;
+    check_exp env t exp1;
+    check_exp env t exp2;
+    if env.weak && op = Operator.SubOp && T.eq t T.nat then
+      warn env exp.at "M0155" "operator may trap for inferred type%a"
+        display_typ_expand t;
+    t
+  | ToCandidE exps, _ ->
+    if not env.pre then begin
+      let ts = List.map (infer_exp env) exps in
+      if not (T.sub (T.Prim T.Blob) t) then
+        error env exp.at "M0172" "to_candid produces a Blob that is not a subtype of%a"
+          display_typ_expand t;
+      if not (T.shared (T.seq ts)) then
+          error env exp.at "M0173" "to_candid argument must have shared type, but instead has non-shared type%a"
+          display_typ_expand (T.seq ts);
+      end;
+    T.Prim T.Blob
+  | FromCandidE exp1, t when T.shared t && T.is_opt t ->
+    check_exp env (T.Prim T.Blob) exp1;
+    t
+  | FromCandidE _, t ->
+      error env exp.at "M0174" "from_candid produces an optional shared type, not type%a"
+        display_typ_expand t
+  | TupE exps, T.Tup ts when List.length exps = List.length ts ->
+    List.iter2 (check_exp env) ts exps;
+    t
+  | ObjE ([], exp_fields), T.Obj(T.Object, fts) -> (* TODO: infer bases? Default does a decent job. *)
+    check_ids env "object" "field"
+      (List.map (fun (ef : exp_field) -> ef.it.id) exp_fields);
+    List.iter (fun ef -> check_exp_field env ef fts) exp_fields;
+    List.iter (fun ft ->
+      if not (List.exists (fun (ef : exp_field) -> ft.T.lab = ef.it.id.it) exp_fields)
+      then local_error env exp.at "M0151"
+        "object literal is missing field %s from expected type%a"
+        ft.T.lab
+        display_typ_expand t;
+    ) fts;
+    t
+  | OptE exp1, _ when T.is_opt t ->
+    check_exp env (T.as_opt t) exp1;
+    t
+  | DoOptE exp1, _ when T.is_opt t ->
+    let env' = add_lab env "!" (T.Prim T.Null) in
+    check_exp env' (T.as_opt t) exp1;
+    t
+  | BangE exp1, t ->
+    if Option.is_none (T.Env.find_opt "!" env.labs) then
+      local_error env exp.at "M0064" "misplaced '!' (no enclosing 'do ? { ... }' expression)";
+    check_exp env (T.Opt t) exp1;
+    t
+  | ArrayE (mut, exps), T.Array t' ->
+    if (mut.it = Var) <> T.is_mut t' then
+      local_error env exp.at "M0091"
+        "%smutable array expression cannot produce expected type%a"
+        (if mut.it = Const then "im" else "")
+        display_typ_expand (T.Array t');
+    List.iter (check_exp env (T.as_immut t')) exps;
+    t
+  | AsyncE (s1, tb, exp1), T.Async (s2, t1', t') ->
+    error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0086"
+      "async expressions are not supported";
+    let t1, next_cap = check_AsyncCap env "async expression" exp.at in
+    if s1 <> s2 then begin
+      local_error env exp.at "M0183"
+        "async expression cannot produce expected async type %a.\n%s"
+        display_typ_expand t
+        (if s2 = T.Fut then
+          "Use keyword 'async' (not 'async*') to produce the expected type."
+         else
+          "Use keyword 'async*' (not 'async') to produce the expected type.")
+    end;
+    if not (T.eq t1 t1') then begin
+      local_error env exp.at "M0092"
+        "async at scope%a\ncannot produce expected scope%a%s%s"
+        display_typ_expand t1
+        display_typ_expand t1'
+        (associated_region env t1 exp.at) (*FIX ME?*)
+        (associated_region env t1' exp.at);
+      scope_info env t1 exp.at;
+      scope_info env t1' exp.at
+    end;
+    let c, tb, ce, cs = check_typ_bind env tb in
+    let ce_scope = T.Env.add T.default_scope_var c ce in (* pun scope var with c *)
+    let env' =
+      {(adjoin_typs env ce_scope cs) with
+        labs = T.Env.empty;
+        rets = Some t';
+        async = next_cap c;
+        scopes = T.ConEnv.add c exp.at env.scopes;
+      } in
+    check_exp env' t' exp1;
+    t
+  | BlockE decs, _ ->
+    ignore (check_block env t decs exp.at);
+    t
+  | IfE (exp1, exp2, exp3), _ ->
+    check_exp_strong env T.bool exp1;
+    check_exp env t exp2;
+    check_exp env t exp3;
+    t
+  | SwitchE (exp1, cases), _ ->
+    let t1 = infer_exp_promote env exp1 in
+    check_cases env t1 t cases;
+    coverage_cases "switch" env cases t1 exp.at;
+    t
+  | TryE (exp1, cases), _ ->
+    check_ErrorCap env "try" exp.at;
+    check_exp env t exp1;
+    check_cases env T.catch t cases;
+    coverage_cases "try handler" env cases T.catch exp.at;
+    t
+  (* TODO: allow shared with one scope par *)
+  | FuncE (_, shared_pat,  [], pat, typ_opt, _sugar, exp), T.Func (s, c, [], ts1, ts2) ->
+    let sort, ve = check_shared_pat env shared_pat in
+    if not env.pre && not env0.in_actor && T.is_shared_sort sort then
+      error_in [Flags.ICMode; Flags.RefMode] env exp.at "M0077"
+        "a shared function is only allowed as a public field of an actor";
+    let ve1 = check_pat_exhaustive (if T.is_shared_sort sort then local_error else warn) env (T.seq ts1) pat in
+    let ve2 = T.Env.adjoin ve ve1 in
+    let codom = T.codom c (fun () -> assert false) ts2 in
+    let t2 = match typ_opt with
+      | None -> codom
+      | Some typ -> check_typ env typ
+    in
+    if sort <> s then
+      error env exp.at "M0094"
+        "%sshared function does not match expected %sshared function type"
+        (if sort = T.Local then "non-" else "")
+        (if s = T.Local then "non-" else "");
+    if not (T.sub t2 codom) then
+      error env exp.at "M0095"
+        "function return type%a\ndoes not match expected return type%a"
+        display_typ_expand t2
+        display_typ_expand codom;
+    let env' =
+      { env with
+        labs = T.Env.empty;
+        rets = Some t2;
+        async = C.NullCap; }
+    in
+    check_exp_strong (adjoin_vals env' ve2) t2 exp;
+    t
+  | CallE (exp1, inst, exp2), _ ->
+    let t' = infer_call env exp1 inst exp2 exp.at (Some t) in
+    if not (T.sub t' t) then
+      local_error env0 exp.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    t'
+  | TagE (id, exp1), T.Variant fs when List.exists (fun T.{lab; _} -> lab = id.it) fs ->
+    let {T.typ; _} = List.find (fun T.{lab; typ;_} -> lab = id.it) fs in
+    check_exp env typ exp1 ;
+    t
+  | _ ->
+    let t' = infer_exp env0 exp in
+    if not (T.sub t' t) then
+      local_error env0 exp.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    t'
+
+and check_exp_field env (ef : exp_field) fts =
+  let { mut; id; exp } = ef.it in
+  let ft_opt = List.find_opt (fun ft -> ft.T.lab = id.it) fts in
+  match ft_opt with
+  | Some { T.typ = T.Mut t; _ } ->
+    if mut.it <> Syntax.Var then
+      error env ef.at "M0149" "expected mutable 'var' field %s of type%a\nbut found immutable field (insert 'var'?)"
+        id.it
+        display_typ t;
+    check_exp env t exp
+  | Some { T.typ = t; _ } ->
+    if mut.it = Syntax.Var then
+      error env ef.at "M0150" "expected immutable field %s of type%a\nbut found mutable 'var' field (delete 'var'?)"
+        id.it
+        display_typ t;
+    check_exp env t exp
+  | None ->
+    ignore (infer_exp env exp)
+
+and infer_call env exp1 inst exp2 at t_expect_opt =
+  let n = match inst.it with None -> 0 | Some typs -> List.length typs in
+  let t1 = infer_exp_promote env exp1 in
+  let sort, tbs, t_arg, t_ret =
+    try T.as_func_sub T.Local n t1
+    with Invalid_argument _ ->
+      local_error env exp1.at "M0097"
+        "expected function type, but expression produces type%a"
+        display_typ_expand t1;
+      if inst.it = None then
+        info env (Source.between exp1.at exp2.at)
+          "this looks like an unintended function call, perhaps a missing ';'?";
+      T.as_func_sub T.Local n T.Non
+  in
+  let ts, t_arg', t_ret' =
+    match tbs, inst.it with
+    | [], (None | Some [])  (* no inference required *)
+    | [{T.sort = T.Scope;_}], _  (* special case to allow t_arg driven overload resolution *)
+    | _, Some _ ->
+      (* explicit instantiation, check argument against instantiated domain *)
+      let typs = match inst.it with None -> [] | Some typs -> typs in
+      let ts = check_inst_bounds env sort tbs typs at in
+      let t_arg' = T.open_ ts t_arg in
+      let t_ret' = T.open_ ts t_ret in
+      if not env.pre then check_exp_strong env t_arg' exp2;
+      ts, t_arg', t_ret'
+    | _::_, None -> (* implicit, infer *)
+      let t2 = infer_exp env exp2 in
+      try
+        (* i.e. exists minimal ts .
+                t2 <: open_ ts t_arg /\
+                t_expect_opt == Some t -> open ts_ t_ret <: t *)
+        let ts =
+          Bi_match.bi_match_call
+            (scope_of_env env)
+            (tbs, t_arg, t_ret)
+            t2
+            t_expect_opt
+        in
+        let t_arg' = T.open_ ts t_arg in
+        let t_ret' = T.open_ ts t_ret in
+(*
+        if not env.pre then
+          info env at "inferred instantiation <%s>"
+            (String.concat ", " (List.map T.string_of_typ ts));
+*)
+        ts, t_arg', t_ret'
+      with Bi_match.Bimatch msg ->
+        error env at "M0098"
+          "cannot implicitly instantiate function of type%a\nto argument of type%a%s\nbecause %s"
+          display_typ t1
+          display_typ t2
+          (match t_expect_opt with
+           | None -> ""
+           | Some t ->
+             Format.asprintf "\nto produce result of type%a" display_typ t)
+          msg
+  in
+  inst.note <- ts;
+  if not env.pre then begin
+    if Type.is_shared_sort sort then begin
+      if not (T.concrete t_arg') then
+        error env exp1.at "M0099"
+          "shared function argument contains abstract type%a"
+          display_typ_expand t_arg';
+      if not (T.concrete t_ret') then
+        error env exp2.at "M0100"
+          "shared function call result contains abstract type%a"
+          display_typ_expand t_ret';
+    end
+  end;
+  (* note t_ret' <: t checked by caller if necessary *)
+  t_ret'
+
+
+(* Cases *)
+
+and infer_cases env t_pat t cases : T.typ =
+  List.fold_left (infer_case env t_pat) t cases
+
+and infer_case env t_pat t case =
+  let {pat; exp} = case.it in
+  let ve = check_pat env t_pat pat in
+  let t' = recover_with T.Non (infer_exp (adjoin_vals env ve)) exp in
+  let t'' = T.lub t t' in
+  if not env.pre && inconsistent t'' [t; t'] then
+    warn env case.at "M0101"
+      "the switch has type%a\nbecause branches have inconsistent types,\nthis case produces type%a\nthe previous produce type%a"
+      display_typ t''
+      display_typ_expand t
+      display_typ_expand t';
+  t''
+
+and check_cases env t_pat t cases =
+  List.iter (check_case env t_pat t) cases
+
+and check_case env t_pat t case =
+  let {pat; exp} = case.it in
+  let ve = check_pat env t_pat pat in
+  recover (check_exp (adjoin_vals env ve) t) exp
+
+and inconsistent t ts =
+  T.opaque t && not (List.exists T.opaque ts)
+
+
+(* Patterns *)
+
+and infer_pat_exhaustive warnOrError env pat : T.typ * Scope.val_env =
+  let t, ve = infer_pat env pat in
+  if not env.pre then
+    coverage_pat warnOrError env pat t;
+  t, ve
+
+and infer_pat env pat : T.typ * Scope.val_env =
+  assert (pat.note = T.Pre);
+  let t, ve = infer_pat' env pat in
+  if not env.pre then
+    pat.note <- T.normalize t;
+  t, ve
+
+and infer_pat' env pat : T.typ * Scope.val_env =
+  match pat.it with
+  | WildP ->
+    error env pat.at "M0102" "cannot infer type of wildcard"
+  | VarP _ ->
+    error env pat.at "M0103" "cannot infer type of variable"
+  | LitP lit ->
+    T.Prim (infer_lit env lit pat.at), T.Env.empty
+  | SignP (op, lit) ->
+    let t1 = T.Prim (infer_lit env lit pat.at) in
+    let t = Operator.type_unop op t1 in
+    if not (Operator.has_unop op t) then
+      error env pat.at "M0059" "operator is not defined for operand type%a"
+        display_typ_expand t;
+    t, T.Env.empty
+  | TupP pats ->
+    let ts, ve = infer_pats pat.at env pats [] T.Env.empty in
+    T.Tup ts, ve
+  | ObjP pfs ->
+    let (s, tfs), ve = infer_pat_fields pat.at env pfs [] T.Env.empty in
+    T.Obj (s, tfs), ve
+  | OptP pat1 ->
+    let t1, ve = infer_pat env pat1 in
+    T.Opt t1, ve
+  | TagP (id, pat1) ->
+    let t1, ve = infer_pat env pat1 in
+    T.Variant [T.{lab = id.it; typ = t1; depr = None}], ve
+  | AltP (pat1, pat2) ->
+    error env pat.at "M0184"
+        "cannot infer the type of this or-pattern, please add a type annotation";
+    (*let t1, ve1 = infer_pat env pat1 in
+    let t2, ve2 = infer_pat env pat2 in
+    let t = T.lub t1 t2 in
+    if not (T.compatible t1 t2) then
+      error env pat.at "M0104"
+        "pattern branches have incompatible types,\nleft consumes%a\nright consumes%a"
+        display_typ_expand t1
+        display_typ_expand t2;
+    if T.Env.keys ve1 <> T.Env.keys ve2 then
+      error env pat.at "M0189" "different set of bindings in pattern alternatives";
+    if not env.pre then T.Env.(iter (fun k t1 -> warn_lossy_bind_type env pat.at k t1 (find k ve2))) ve1;
+    t, T.Env.merge (fun _ -> Lib.Option.map2 T.lub) ve1 ve2*)
+  | AnnotP (pat1, typ) ->
+    let t = check_typ env typ in
+    t, check_pat env t pat1
+  | ParP pat1 ->
+    infer_pat env pat1
+
+and infer_pats at env pats ts ve : T.typ list * Scope.val_env =
+  match pats with
+  | [] -> List.rev ts, ve
+  | pat::pats' ->
+    let t, ve1 = infer_pat env pat in
+    let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+    infer_pats at env pats' (t::ts) ve'
+
+and infer_pat_fields at env pfs ts ve : (T.obj_sort * T.field list) * Scope.val_env =
+  match pfs with
+  | [] -> (T.Object, List.sort T.compare_field ts), ve
+  | pf::pfs' ->
+    let typ, ve1 = infer_pat env pf.it.pat in
+    let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+    infer_pat_fields at env pfs' (T.{ lab = pf.it.id.it; typ; depr = None }::ts) ve'
+
+and check_shared_pat env shared_pat : T.func_sort * Scope.val_env =
+  match shared_pat.it with
+  | T.Local -> T.Local, T.Env.empty
+  | T.Shared (ss, pat) ->
+    if pat.it <> WildP then
+      error_in [Flags.WASIMode; Flags.WasmMode] env pat.at "M0106" "shared function cannot take a context pattern";
+    T.Shared ss, check_pat_exhaustive local_error env T.ctxt pat
+
+and check_class_shared_pat env shared_pat obj_sort : Scope.val_env =
+  match shared_pat.it, obj_sort.it with
+  | T.Local, (T.Module | T.Object) -> T.Env.empty
+  | T.Local, T.Actor ->
+    T.Env.empty (* error instead? That's a breaking change *)
+  | T.Shared (mode, pat), sort ->
+    if sort <> T.Actor then
+      error env pat.at "M0107" "non-actor class cannot take a context pattern";
+    if pat.it <> WildP then
+      error_in [Flags.WASIMode; Flags.WasmMode] env pat.at "M0108" "actor class cannot take a context pattern";
+    if mode = T.Query then
+      error env shared_pat.at "M0109" "class cannot be a query";
+    check_pat_exhaustive local_error env T.ctxt pat
+  | _, T.Memory -> assert false
+
+
+and check_pat_exhaustive warnOrError env t pat : Scope.val_env =
+  let ve = check_pat env t pat in
+  if not env.pre then
+    coverage_pat warnOrError env pat t;
+  ve
+
+and check_pat env t pat : Scope.val_env =
+  assert (pat.note = T.Pre);
+  if t = T.Pre then snd (infer_pat env pat) else
+  let t' = T.normalize t in
+  let ve = check_pat' env t' pat in
+  if not env.pre then pat.note <- t';
+  ve
+
+and check_pat' env t pat : Scope.val_env =
+  assert (t <> T.Pre);
+  match pat.it with
+  | WildP ->
+    T.Env.empty
+  | VarP id ->
+    T.Env.singleton id.it t
+  | LitP lit ->
+    if not env.pre then begin
+      let t' = if T.eq t T.nat then T.int else t in  (* account for Nat <: Int *)
+      if T.opaque t' then
+        error env pat.at "M0110" "literal pattern cannot consume expected type%a"
+          display_typ_expand t;
+      if T.sub t' T.Non
+      then ignore (infer_lit env lit pat.at)
+      else check_lit env t' lit pat.at
+    end;
+    T.Env.empty
+  | SignP (op, lit) ->
+    if not env.pre then begin
+      let t' = if T.eq t T.nat then T.int else t in  (* account for Nat <: Int *)
+      if not (Operator.has_unop op (T.promote t)) then
+        error env pat.at "M0111" "operator pattern cannot consume expected type%a"
+          display_typ_expand t;
+      if T.sub t' T.Non
+      then ignore (infer_lit env lit pat.at)
+      else check_lit env t' lit pat.at
+    end;
+    T.Env.empty
+  | TupP pats ->
+    let ts = try T.as_tup_sub (List.length pats) t with Invalid_argument _ ->
+      error env pat.at "M0112" "tuple pattern cannot consume expected type%a"
+         display_typ_expand t
+    in check_pats env ts pats T.Env.empty pat.at
+  | ObjP pfs ->
+    let pfs' = List.stable_sort compare_pat_field pfs in
+    let s, tfs =
+      try T.as_obj_sub (List.map (fun (pf : pat_field) -> pf.it.id.it) pfs') t
+      with Invalid_argument _ ->
+        error env pat.at "M0113" "object pattern cannot consume expected type%a"
+          display_typ_expand t
+    in
+    if not env.pre && s = T.Actor then
+      local_error env pat.at "M0114" "object pattern cannot consume actor type%a"
+        display_typ_expand t;
+    check_pat_fields env t tfs pfs' T.Env.empty pat.at
+  | OptP pat1 ->
+    let t1 = try T.as_opt_sub t with Invalid_argument _ ->
+      error env pat.at "M0115" "option pattern cannot consume expected type%a"
+        display_typ_expand t
+    in check_pat env t1 pat1
+  | TagP (id, pat1) ->
+    let t1 =
+      try
+        match T.lookup_val_field_opt id.it (T.as_variant_sub id.it t) with
+        | Some t1 -> t1
+        | None -> T.Non
+      with Invalid_argument _ ->
+        error env pat.at "M0116" "variant pattern cannot consume expected type%a"
+          display_typ_expand t
+    in check_pat env t1 pat1
+  | AltP (pat1, pat2) ->
+    let ve1 = check_pat env t pat1 in
+    let ve2 = check_pat env t pat2 in
+    if T.Env.keys ve1 <> T.Env.keys ve2 then
+      error env pat.at "M0189" "different set of bindings in pattern alternatives";
+    T.Env.(iter (fun k t1 -> warn_lossy_bind_type env pat.at k t1 (find k ve2))) ve1;
+    T.Env.merge (fun _ -> Lib.Option.map2 T.lub) ve1 ve2
+  | AnnotP (pat1, typ) ->
+    let t' = check_typ env typ in
+    if not (T.sub t t') then
+      error env pat.at "M0117"
+        "pattern of type%a\ncannot consume expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    check_pat env t' pat1
+  | ParP pat1 ->
+    check_pat env t pat1
+
+(*
+Consider:
+
+  case (P : A) : B
+
+
+(P : A) :<= B  iff
+1: B <: A   P :<= B
+2: A <: B   P :<= A
+3: B <: A   P :<= A
+4: A <: B   P :<= B
+
+1 is implemented, allows
+
+  case ({x} : {}) : {x}  // type annotations are reversed for patterns
+  case (1 : Int) : Nat   // type annotations are reversed for patterns
+  case (x : Int) : Nat   // type annotations are reversed for patterns
+
+2 would allow
+
+  case ({x} : {x}) : {}  // unsound, x does not exist
+
+3 would allow
+
+  case (-1 : Int) : Nat  // breaks coverage checking
+
+4 would allow
+
+  case (x : Nat) : Int  // x is Int, harmless but misleading
+
+Alternative: pass in two types?
+*)
+
+
+and check_pats env ts pats ve at : Scope.val_env =
+  let ts_len = List.length ts in
+  let pats_len = List.length pats in
+  let rec go ts pats ve =
+    match ts, pats with
+    | [], [] -> ve
+    | t::ts', pat::pats' ->
+        let ve1 = check_pat env t pat in
+        let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+        go ts' pats' ve'
+    | _, _ ->
+        error env at "M0118" "tuple pattern has %i components but expected type has %i"
+          pats_len ts_len
+  in
+  go ts pats ve
+
+and check_pat_fields env t tfs pfs ve at : Scope.val_env =
+  match tfs, pfs with
+  | _, [] -> ve
+  | [], pf::_ ->
+    error env pf.at "M0119"
+      "object field %s is not contained in expected type%a"
+      pf.it.id.it
+      display_typ_expand t
+  | T.{lab; typ = Typ _; _}::tfs', _ ->  (* TODO: remove the namespace hack *)
+    check_pat_fields env t tfs' pfs ve at
+  | T.{lab; typ; depr}::tfs', pf::pfs' ->
+    match compare pf.it.id.it lab with
+    | -1 -> check_pat_fields env t [] pfs ve at
+    | +1 -> check_pat_fields env t tfs' pfs ve at
+    | _ ->
+      if T.is_mut typ then
+        error env pf.at "M0120" "cannot pattern match mutable field %s" lab;
+      Option.iter (warn env pf.at "M0154" "type field %s is deprecated:\n%s" lab) depr;
+      let ve1 = check_pat env typ pf.it.pat in
+      let ve' =
+        disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+      match pfs' with
+      | pf'::_ when pf'.it.id.it = lab ->
+        error env pf'.at "M0121" "duplicate field %s in object pattern" lab
+      | _ -> check_pat_fields env t tfs' pfs' ve' at
+
+and compare_pat_field pf1 pf2 = compare pf1.it.id.it pf2.it.id.it
+
+
+(* Objects *)
+
+and pub_fields dec_fields : visibility_env =
+  List.fold_right pub_field dec_fields (T.Env.empty, T.Env.empty)
+
+and pub_field dec_field xs : visibility_env =
+  match dec_field.it with
+  | {vis = { it = Public depr; _}; dec; _} -> pub_dec depr dec xs
+  | _ -> xs
+
+and pub_dec depr dec xs : visibility_env =
+  match dec.it with
+  | ExpD _ -> xs
+  | LetD (pat, _, _) -> pub_pat depr pat xs
+  | VarD (id, _) -> pub_val_id depr id xs
+  | ClassD (_, id, _, _, _, _, _, _) ->
+    pub_val_id depr {id with note = ()} (pub_typ_id depr id xs)
+  | TypD (id, _, _) -> pub_typ_id depr id xs
+
+and pub_pat depr pat xs : visibility_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ -> xs
+  | VarP id -> pub_val_id depr id xs
+  | TupP pats -> List.fold_right (pub_pat depr) pats xs
+  | ObjP pfs -> List.fold_right (pub_pat_field depr) pfs xs
+  | AltP (pat1, _)
+  | OptP pat1
+  | TagP (_, pat1)
+  | AnnotP (pat1, _)
+  | ParP pat1 -> pub_pat depr pat1 xs
+
+and pub_pat_field depr pf xs =
+  pub_pat depr pf.it.pat xs
+
+and pub_typ_id depr id (xs, ys) : visibility_env =
+  (T.Env.add id.it (id.at, depr) xs, ys)
+
+and pub_val_id depr id (xs, ys) : visibility_env =
+  (xs, T.Env.add id.it (id.at, depr) ys)
+
+
+(* Object/Scope transformations *)
+
+(* TODO: remove by merging conenv and valenv or by separating typ_fields *)
+
+and object_of_scope env sort dec_fields scope at =
+  let pub_typ, pub_val = pub_fields dec_fields in
+  let tfs =
+    T.Env.fold
+      (fun id c tfs ->
+        match T.Env.find_opt id pub_typ with
+        | Some (_r, Some depr) -> T.{lab = id; typ = T.Typ c; depr = Some depr}::tfs
+        | Some (_r, None) -> T.{lab = id; typ = T.Typ c; depr = None}::tfs
+        | _ -> tfs
+      ) scope.Scope.typ_env  []
+  in
+  let tfs' =
+    T.Env.fold
+      (fun id t tfs ->
+        match T.Env.find_opt id pub_val with
+        | Some (_r, Some depr) -> T.{lab = id; typ = t; depr = Some depr}::tfs
+        | Some (_r, None) -> T.{lab = id; typ = t; depr = None}::tfs
+        | _ -> tfs
+      ) scope.Scope.val_env tfs
+  in
+
+  Lib.List.iter_pairs
+    (fun x y ->
+      if not (T.is_typ x.T.typ) && not (T.is_typ y.T.typ) &&
+         Hash.hash x.T.lab = Hash.hash y.T.lab
+      then error env at "M0122" "field names %s and %s in %sobject type have colliding hashes"
+        x.T.lab y.T.lab (T.string_of_obj_sort sort);
+    ) tfs';
+
+  T.Obj (sort, List.sort T.compare_field tfs')
+
+and is_actor_method dec : bool = match dec.it with
+  | LetD ({it = VarP _; _}, {it = FuncE (_, shared_pat, _, _, _, _, _); _}, _) ->
+    T.is_shared_sort shared_pat.it
+  | _ -> false
+
+and is_typ_dec dec : bool = match dec.it with
+  | TypD _ -> true
+  | _ -> false
+
+
+and infer_obj env s dec_fields at : T.typ =
+  let env =
+    if s <> T.Actor then
+      { env with in_actor = false }
+    else
+      { env with
+        in_actor = true;
+        labs = T.Env.empty;
+        rets = None;
+        async = C.NullCap; }
+  in
+  let decs = List.map (fun (df : dec_field) -> df.it.dec) dec_fields in
+  let _, scope = infer_block env decs at in
+  let t = object_of_scope env s dec_fields scope at in
+  let (_, tfs) = T.as_obj t in
+  if not env.pre then begin
+    if s = T.Actor then begin
+      List.iter (fun T.{lab; typ; _} ->
+        if not (T.is_typ typ) && not (T.is_shared_func typ) then
+          let _, pub_val = pub_fields dec_fields in
+          error env (fst (T.Env.find lab pub_val)) "M0124"
+            "public actor field %s has non-shared function type%a"
+            lab
+            display_typ_expand typ
+      ) tfs;
+      List.iter (fun df ->
+        if is_public df.it.vis && not (is_actor_method df.it.dec) && not (is_typ_dec df.it.dec) then
+          local_error env df.it.dec.at "M0125"
+            "public actor field needs to be a manifest function"
+      ) dec_fields;
+      List.iter (fun df ->
+        if df.it.vis.it = Syntax.Private && is_actor_method df.it.dec then
+          error_in [Flags.ICMode; Flags.RefMode] env df.it.dec.at "M0126"
+            "a shared function cannot be private"
+      ) dec_fields;
+    end;
+    if s = T.Module then Static.dec_fields env.msgs dec_fields;
+    check_system_fields env s scope tfs dec_fields;
+    check_stab env s scope dec_fields;
+  end;
+  t
+
+and check_system_fields env sort scope tfs dec_fields =
+  List.iter (fun df ->
+    match sort, df.it.vis.it, df.it.dec.it with
+    | T.Actor, vis,
+      LetD({ it = VarP id; _ },
+           { it = FuncE _; _ },
+           _) ->
+      begin
+        match List.assoc_opt id.it (system_funcs tfs) with
+        | Some t ->
+          (* TBR why does Stable.md require this to be a manifest function, not just any expression of appropriate type?  *)
+          if vis = System then
+            begin
+              let t1 = T.Env.find id.it scope.Scope.val_env in
+              if not (T.sub t1 t) then
+                local_error env df.at "M0127" "system function %s is declared with type%a\ninstead of expected type%a" id.it
+                   display_typ t1
+                   display_typ t
+              else if id.it = "timer" && not !Mo_config.Flags.global_timer then
+                local_error env df.at "M0182" "system function timer is present but -no-timer flag is specified"
+            end
+          else warn env id.at "M0128" "this function has the name of a system method, but is declared without system visibility and will not be called by the system"
+        | None ->
+          if vis = System then
+            local_error env id.at "M0129" "unexpected system method named %s, expected %s"
+              id.it (String.concat " or " (List.map fst (system_funcs tfs)))
+          else ()
+      end
+    | _, System, _ ->
+      local_error env df.it.vis.at "M0130" "misplaced system visibility, did you mean private?"
+    | _ -> ())
+  dec_fields
+
+and stable_pat pat =
+  match pat.it with
+  | VarP _ -> true
+  | ParP pat'
+  | AnnotP (pat', _) -> stable_pat pat'
+  | _ -> false
+
+and check_stab env sort scope dec_fields =
+  let check_stable id at =
+    match T.Env.find_opt id scope.Scope.val_env with
+    | None -> assert false
+    | Some t ->
+      let t1 = T.as_immut t in
+      if not (T.stable t1) then
+        local_error env at "M0131"
+          "variable %s is declared stable but has non-stable type%a" id
+          display_typ t1
+  in
+  let idss = List.map (fun df ->
+    match sort, df.it.stab, df.it.dec.it with
+    | (T.Object | T.Module), None, _ -> []
+    | (T.Object | T.Module), Some stab, _ ->
+      local_error env stab.at "M0132"
+        "misplaced stability declaration on field of non-actor";
+      []
+    | T.Actor, Some {it = Stable; _}, VarD (id, _) ->
+      check_stable id.it id.at;
+      [id]
+    | T.Actor, Some {it = Stable; _}, LetD (pat, _, _) when stable_pat pat ->
+      let ids = T.Env.keys (gather_pat env T.Env.empty pat) in
+      List.iter (fun id -> check_stable id pat.at) ids;
+      List.map (fun id -> {it = id; at = pat.at; note = ()}) ids;
+    | T.Actor, Some {it = Flexible; _} , (VarD _ | LetD _) -> []
+    | T.Actor, Some stab, _ ->
+      local_error env stab.at "M0133"
+        "misplaced stability modifier: allowed on var or simple let declarations only";
+      []
+    | _ -> []) dec_fields
+  in
+  check_ids env "actor type" "stable variable" (List.concat idss)
+
+
+(* Blocks and Declarations *)
+
+and infer_block env decs at : T.typ * Scope.scope =
+  let scope = infer_block_decs env decs at in
+  let env' = adjoin env scope in
+  (* HACK: when compiling to IC, mark class constructors as unavailable *)
+  let ve = match !Flags.compile_mode with
+    | (Flags.ICMode | Flags.RefMode) ->
+      List.fold_left (fun ve' dec ->
+        match dec.it with
+        | ClassD(_, id, _, _, _, { it = T.Actor; _}, _, _) ->
+          T.Env.mapi (fun id' (typ, avl) ->
+            (typ, if id' = id.it then Unavailable else avl)) ve'
+        | _ -> ve') env'.vals decs
+    | _ -> env'.vals
+  in
+  let t = infer_block_exps { env' with vals = ve } decs in
+  t, scope
+
+and infer_block_decs env decs at : Scope.t =
+  let scope = gather_block_decs env decs in
+  let env' = adjoin {env with pre = true} scope in
+  let scope_ce = infer_block_typdecs env' decs in
+  check_con_env env' at scope_ce.Scope.con_env;
+  let env'' = adjoin {env' with pre = env.pre} scope_ce in
+  let _scope_ce = infer_block_typdecs env'' decs in
+  (* TBR: assertion does not work for types with binders, due to stamping *)
+  (* assert (scope_ce = _scope_ce); *)
+  infer_block_valdecs (adjoin env'' scope_ce) decs scope_ce
+
+and infer_block_exps env decs : T.typ =
+  match decs with
+  | [] -> T.unit
+  | [dec] -> infer_dec env dec
+  | dec::decs' ->
+    if not env.pre then recover (check_dec env T.unit) dec;
+    infer_block_exps env decs'
+
+and infer_dec env dec : T.typ =
+  let t =
+  match dec.it with
+  | ExpD exp
+  | LetD (_, exp, None) -> infer_exp env exp
+  | LetD (_, exp, Some fail) ->
+    if not env.pre then
+      check_exp env T.Non fail;
+    infer_exp env exp
+  | VarD (_, exp) ->
+    if not env.pre then ignore (infer_exp env exp);
+    T.unit
+  | ClassD (shared_pat, id, typ_binds, pat, typ_opt, obj_sort, self_id, dec_fields) ->
+    let (t, _) = T.Env.find id.it env.vals in
+    if not env.pre then begin
+      let c = T.Env.find id.it env.typs in
+      let ve0 = check_class_shared_pat env shared_pat obj_sort in
+      let cs, _tbs, te, ce = check_typ_binds env typ_binds in
+      let env' = adjoin_typs env te ce in
+      let t_pat, ve =
+        infer_pat_exhaustive (if obj_sort.it = T.Actor then error else warn) env' pat
+      in
+      if obj_sort.it = T.Actor && not (T.shared t_pat) then
+        error_shared env t_pat pat.at "M0034"
+          "shared constructor has non-shared parameter type%a"
+          display_typ_expand t_pat;
+      let env'' = adjoin_vals (adjoin_vals env' ve0) ve in
+      let cs' = if obj_sort.it = T.Actor then List.tl cs else cs in
+      let self_typ = T.Con (c, List.map (fun c -> T.Con (c, [])) cs') in
+      let env''' =
+        { (add_val env'' self_id.it self_typ) with
+          labs = T.Env.empty;
+          rets = None;
+          async = C.NullCap;
+          in_actor = obj_sort.it = T.Actor;
+        }
+      in
+      let t' = infer_obj env''' obj_sort.it dec_fields dec.at in
+      match typ_opt, obj_sort.it with
+      | None, _ -> ()
+      | Some { it = AsyncT (T.Fut, _, typ); at; _ }, T.Actor
+      | Some ({ at; _ } as typ), (T.Module | T.Object) ->
+        if at = Source.no_region then
+          warn env dec.at "M0135"
+            "actor classes with non non-async return types are deprecated; please declare the return type as 'async ...'";
+        let t'' = check_typ env'' typ in
+        if not (T.sub t' t'') then
+          local_error env dec.at "M0134"
+            "class body of type%a\ndoes not match expected type%a"
+            display_typ_expand t'
+            display_typ_expand t''
+      | Some typ, T.Actor ->
+        local_error env dec.at "M0135" "actor class has non-async return type"
+      | _, T.Memory -> assert false
+    end;
+    T.normalize t
+  | TypD _ ->
+    T.unit
+  in
+  let eff = A.infer_effect_dec dec in
+  dec.note <- {note_typ = t; note_eff = eff};
+  t
+
+
+and check_block env t decs at : Scope.t =
+  let scope = infer_block_decs env decs at in
+  check_block_exps (adjoin env scope) t decs at;
+  scope
+
+and check_block_exps env t decs at =
+  match decs with
+  | [] ->
+    if not (T.sub T.unit t) then
+      local_error env at "M0136" "empty block cannot produce expected type%a"
+        display_typ_expand t
+  | [dec] ->
+    check_dec env t dec
+  | dec::decs' ->
+    recover (check_dec env T.unit) dec;
+    recover (check_block_exps env t decs') at
+
+and check_dec env t dec =
+  match dec.it with
+  | ExpD exp ->
+    check_exp env t exp;
+    dec.note <- exp.note
+  | _ ->
+    let t' = infer_dec env dec in
+    if not (T.eq t T.unit || T.sub t' t) then
+      local_error env dec.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t
+
+and infer_val_path env exp : T.typ option =
+  match exp.it with
+  | ImportE (f, ri) ->
+    Some (check_import env exp.at f ri)
+  | VarE id ->
+    (match T.Env.find_opt id.it env.vals with (* TBR: return None for Unavailable? *)
+     | Some (t, _) -> Some t
+     | _ -> None)
+  | DotE (path, id) ->
+    (match infer_val_path env path with
+     | None -> None
+     | Some t ->
+       match T.promote t with
+       | T.Obj ( _, flds) ->
+         (try Some (T.lookup_val_field id.it flds)
+         with Invalid_argument _ -> None)
+       | _ -> None
+    )
+  | AnnotE (_, typ) ->
+    Some (check_typ {env with pre = true}  typ)
+  | _ -> None
+
+
+(* Pass 1: collect:
+   * type identifiers and their arity,
+   * object identifiers and their fields (if known) (recursively)
+   * other value identifiers at type T.Pre
+*)
+and gather_block_decs env decs : Scope.t =
+  List.fold_left (gather_dec env) Scope.empty decs
+
+and gather_dec env scope dec : Scope.t =
+  match dec.it with
+  | ExpD _ -> scope
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _},
+      ({it = ObjBlockE (obj_sort, dec_fields); at; _} |
+       {it = AwaitE (_,{ it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, dec_fields); at; _}) ; _  }); _ }),
+       _
+    ) ->
+    let decs = List.map (fun df -> df.it.dec) dec_fields in
+    let open Scope in
+    if T.Env.mem id.it scope.val_env then
+      error_duplicate env "" id;
+    let scope' = gather_block_decs env decs in
+    let ve' = T.Env.add id.it (object_of_scope env obj_sort.it dec_fields scope' at) scope.val_env in
+    let obj_env = T.Env.add id.it scope' scope.obj_env in
+    { val_env = ve';
+      typ_env = scope.typ_env;
+      lib_env = scope.lib_env;
+      con_env = scope.con_env;
+      obj_env = obj_env
+    }
+  | LetD (pat, _, _) -> Scope.adjoin_val_env scope (gather_pat env scope.Scope.val_env pat)
+  | VarD (id, _) -> Scope.adjoin_val_env scope (gather_id env scope.Scope.val_env id)
+  | TypD (id, binds, _) | ClassD (_, id, binds, _, _, _, _, _) ->
+    let open Scope in
+    if T.Env.mem id.it scope.typ_env then
+      error_duplicate env "type " id;
+    let binds' = match dec.it with
+      | ClassD(_, _, _, _, _,  {it = T.Actor; _}, _, _) -> List.tl binds
+      | _ -> binds
+    in
+    let pre_tbs = List.map (fun bind ->
+      { T.var = bind.it.var.it;
+        T.sort = T.Type;
+        T.bound = T.Pre })
+      binds'
+    in
+    let pre_k = T.Abs (pre_tbs, T.Pre) in
+    let c = match id.note with
+      | None -> let c = Cons.fresh id.it pre_k in id.note <- Some c; c
+      | Some c -> c
+    in
+    let val_env = match dec.it with
+      | ClassD _ ->
+        if T.Env.mem id.it scope.val_env then
+          error_duplicate env "" id;
+        T.Env.add id.it T.Pre scope.val_env
+      | _ -> scope.val_env
+    in
+    { val_env;
+      typ_env = T.Env.add id.it c scope.typ_env;
+      con_env = T.ConSet.disjoint_add c scope.con_env;
+      lib_env = scope.lib_env;
+      obj_env = scope.obj_env;
+    }
+
+and gather_pat env ve pat : Scope.val_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ -> ve
+  | VarP id -> gather_id env ve id
+  | TupP pats -> List.fold_left (gather_pat env) ve pats
+  | ObjP pfs -> List.fold_left (gather_pat_field env) ve pfs
+  | TagP (_, pat1) | AltP (pat1, _) | OptP pat1
+  | AnnotP (pat1, _) | ParP pat1 -> gather_pat env ve pat1
+
+and gather_pat_field env ve pf : Scope.val_env =
+  gather_pat env ve pf.it.pat
+
+and gather_id env ve id : Scope.val_env =
+  if T.Env.mem id.it ve then
+    error_duplicate env "" id;
+  T.Env.add id.it T.Pre ve
+
+(* Pass 2 and 3: infer type definitions *)
+and infer_block_typdecs env decs : Scope.t =
+  let _env', scope =
+    List.fold_left (fun (env, scope) dec ->
+      let scope' = infer_dec_typdecs env dec in
+      adjoin env scope', Scope.adjoin scope scope'
+    ) (env, Scope.empty) decs
+  in scope
+
+and infer_dec_typdecs env dec : Scope.t =
+  match dec.it with
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _},
+      ( {it = ObjBlockE (obj_sort, dec_fields); at; _} |
+        {it = AwaitE (_, { it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, dec_fields); at; _}) ; _  }); _ }),
+        _
+    ) ->
+    let decs = List.map (fun {it = {vis; dec; _}; _} -> dec) dec_fields in
+    let scope = T.Env.find id.it env.objs in
+    let env' = adjoin env scope in
+    let obj_scope_typs = infer_block_typdecs env' decs in
+    let obj_scope = Scope.adjoin scope obj_scope_typs in
+    Scope.{ empty with
+      con_env = obj_scope.con_env;
+      val_env = T.Env.singleton id.it (object_of_scope env obj_sort.it dec_fields obj_scope at);
+      obj_env = T.Env.singleton id.it obj_scope
+    }
+  (* TODO: generalize beyond let <id> = <valpath> *)
+  | LetD ({it = VarP id; _}, exp, _) ->
+    (match infer_val_path env exp with
+     | None -> Scope.empty
+     | Some t ->
+       let open Scope in
+       match T.promote t with
+       | T.Obj (_, _) as t' -> { Scope.empty with val_env = T.Env.singleton id.it t' }
+       | _ -> { Scope.empty with val_env = T.Env.singleton id.it T.Pre }
+    )
+  | LetD _ | ExpD _ | VarD _ ->
+    Scope.empty
+  | TypD (id, typ_binds, typ) ->
+    let k = check_typ_def env dec.at (id, typ_binds, typ) in
+    let c = T.Env.find id.it env.typs in
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = infer_id_typdecs id c k;
+    }
+  | ClassD (shared_pat, id, binds, pat, _typ_opt, obj_sort, self_id, dec_fields) ->
+    let c = T.Env.find id.it env.typs in
+    let ve0 = check_class_shared_pat {env with pre = true} shared_pat obj_sort in
+    let cs, tbs, te, ce = check_typ_binds {env with pre = true} binds in
+    let env' = adjoin_typs (adjoin_vals {env with pre = true} ve0) te ce in
+    let _, ve = infer_pat env' pat in
+    let tbs', cs' =
+      if obj_sort.it = T.Actor then
+        List.tl tbs, List.tl cs
+      else tbs, cs in
+    let self_typ = T.Con (c, List.map (fun c -> T.Con (c, [])) cs') in
+    let env'' = add_val (adjoin_vals env' ve) self_id.it self_typ in
+    let t = infer_obj env'' obj_sort.it dec_fields dec.at in
+    let k = T.Def (T.close_binds cs' tbs', T.close cs' t) in
+    check_closed env id k dec.at;
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = infer_id_typdecs id c k;
+    }
+
+and infer_id_typdecs id c k : Scope.con_env =
+  assert (match k with T.Abs (_, T.Pre) -> false | _ -> true);
+  (match Cons.kind c with
+  | T.Abs (_, T.Pre) -> T.set_kind c k; id.note <- Some c
+  | k' -> assert (T.eq_kind k' k) (* may diverge on expansive types *)
+  );
+  T.ConSet.singleton c
+
+(* Pass 4: infer value types *)
+and infer_block_valdecs env decs scope : Scope.t =
+  let _, scope' =
+    List.fold_left (fun (env, scope) dec ->
+      let scope' = infer_dec_valdecs env dec in
+      adjoin env scope', Scope.adjoin scope scope'
+    ) (env, scope) decs
+  in scope'
+
+and is_import d =
+  match d.it with
+  | LetD (_, {it = ImportE _; _}, None) -> true
+  | _ -> false
+
+and infer_dec_valdecs env dec : Scope.t =
+  match dec.it with
+  | ExpD _ ->
+    Scope.empty
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _} as pat,
+      ( {it = ObjBlockE (obj_sort, dec_fields); at; _} |
+        {it = AwaitE (_, { it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, dec_fields); at; _}) ; _ }); _ }),
+        _
+    ) ->
+    let decs = List.map (fun df -> df.it.dec) dec_fields in
+    let obj_scope = T.Env.find id.it env.objs in
+    let obj_scope' =
+      infer_block_valdecs
+        (adjoin {env with pre = true} obj_scope)
+        decs obj_scope
+    in
+    let obj_typ = object_of_scope env obj_sort.it dec_fields obj_scope' at in
+    let _ve = check_pat env obj_typ pat in
+    Scope.{empty with val_env = T.Env.singleton id.it obj_typ}
+  | LetD (pat, exp, fail) ->
+    let t = infer_exp {env with pre = true} exp in
+    let ve' = match fail with
+      | None -> check_pat_exhaustive (if is_import dec then local_error else warn) env t pat
+      | Some _ -> check_pat env t pat
+    in
+    Scope.{empty with val_env = ve'}
+  | VarD (id, exp) ->
+    let t = infer_exp {env with pre = true} exp in
+    Scope.{empty with val_env = T.Env.singleton id.it (T.Mut t)}
+  | TypD (id, _, _) ->
+    let c = Option.get id.note in
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = T.ConSet.singleton c;
+    }
+  | ClassD (_shared_pat, id, typ_binds, pat, _, obj_sort, _, _) ->
+    if obj_sort.it = T.Actor then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env dec.at "M0138" "actor classes are not supported";
+      if not env.in_prog then
+        error_in [Flags.ICMode; Flags.RefMode] env dec.at "M0139"
+          "inner actor classes are not supported yet; any actor class must come last in your program";
+      if not (List.length typ_binds = 1) then
+        local_error env dec.at "M0140"
+          "actor classes with type parameters are not supported yet";
+    end;
+    let cs, tbs, te, ce = check_typ_binds env typ_binds in
+    let env' = adjoin_typs env te ce in
+    let c = T.Env.find id.it env.typs in
+    let t1, _ = infer_pat {env' with pre = true} pat in
+    let ts1 = match pat.it with TupP _ -> T.seq_of_tup t1 | _ -> [t1] in
+    let t2 =
+      if obj_sort.it = T.Actor then
+        T.Async (T.Fut, T.Con (List.hd cs, []),
+          T.Con (c, List.map (fun c -> T.Con (c, [])) (List.tl cs)))
+      else
+        T.Con (c, List.map (fun c -> T.Con (c, [])) cs)
+    in
+    let t = T.Func (T.Local, T.Returns, T.close_binds cs tbs,
+      List.map (T.close cs) ts1,
+      [T.close cs t2])
+    in
+    Scope.{ empty with
+      val_env = T.Env.singleton id.it t;
+      typ_env = T.Env.singleton id.it c;
+      con_env = T.ConSet.singleton c;
+    }
+
+
+(* Programs *)
+
+let infer_prog scope prog : (T.typ * Scope.t) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog ->
+          let env = env_of_scope msgs scope in
+          let res = infer_block env prog.it prog.at in
+          res
+        ) prog
+    )
+
+let is_actor_dec d =
+  match d.it with
+  | ExpD e
+  | LetD (_, e, _) -> CompUnit.is_actor_def e
+  | ClassD (shared_pat, id, typ_binds, pat, typ_opt, obj_sort, self_id, dec_fields) ->
+    obj_sort.it = T.Actor
+  | _ -> false
+
+let check_actors scope progs : unit Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt (fun progs ->
+        let prog = (CompUnit.combine_progs progs).it in
+        let env = env_of_scope msgs scope in
+        let rec go ds = function
+          | [] -> ()
+          | (d::ds') when is_actor_dec d ->
+            if ds <> [] || ds' <> []  then
+              error_in [Flags.ICMode; Flags.RefMode] env d.at "M0141"
+                "an actor or actor class must be the only non-imported declaration in a program"
+          | (d::ds') when is_import d -> go ds ds'
+          | (d::ds') -> go (d::ds) ds'
+        in
+        go [] prog
+        ) progs
+    )
+
+let check_lib scope lib : Scope.t Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun lib ->
+          let env = env_of_scope msgs scope in
+          let { imports; body = cub; _ } = lib.it in
+          let (imp_ds, ds) = CompUnit.decs_of_lib lib in
+          let typ, _ = infer_block env (imp_ds @ ds) lib.at in
+          List.iter2 (fun import imp_d -> import.note <- imp_d.note.note_typ) imports imp_ds;
+          cub.note <- {note_typ = typ; note_eff = T.Triv};
+          let imp_typ = match cub.it with
+            | ModuleU _ ->
+              if cub.at = no_region then begin
+                let r = Source.({
+                  left = { no_pos with file = lib.note.filename };
+                  right = { no_pos with file = lib.note.filename }})
+                in
+                warn env r "M0142" "deprecated syntax: an imported library should be a module or named actor class"
+              end;
+              typ
+            | ActorClassU  (sp, id, tbs, p, _, self_id, dec_fields) ->
+              if is_anon_id id then
+                error env cub.at "M0143" "bad import: imported actor class cannot be anonymous";
+              let cs = List.map (fun tb -> Option.get tb.note) tbs in
+              let ts = List.map (fun c -> T.Con(c, [])) cs in
+              let fun_typ = typ in
+              let ts1, class_typ =
+                match T.normalize fun_typ with
+                | T.Func (sort, control, _, ts1, [t2]) ->
+                  let t2 = T.normalize (T.open_ ts t2) in
+                  (match t2 with
+                   | T.Async (_, _, class_typ) -> List.map (T.open_ ts) ts1, class_typ
+                   | _ -> assert false)
+                | _ -> assert false
+              in
+              let con = Cons.fresh id.it (T.Def([], class_typ)) in
+              T.(obj Module [
+                (id.it, Typ con);
+                (id.it, fun_typ);
+                ("system", obj Module [id.it, install_typ (List.map (close cs) ts1) class_typ])
+              ])
+            | ActorU _ ->
+              error env cub.at "M0144" "bad import: expected a module or actor class but found an actor"
+            | ProgU _ ->
+              (* this shouldn't really happen, as an imported program should be rewritten to a module *)
+              error env cub.at "M0000" "compiler bug: expected a module or actor class but found a program, i.e. a sequence of declarations"
+          in
+          Scope.lib lib.note.filename imp_typ
+        ) lib
+    )
+
+let check_stab_sig scope sig_ : (T.field list) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun (decs, sfs) ->
+          let env = env_of_scope msgs scope in
+          let scope = infer_block_decs env decs sig_.at in
+          let env1 = adjoin env scope in
+          check_ids env "object type" "field"
+            (List.filter_map (fun (field : typ_field) ->
+                 match field.it with ValF (id, _, _) -> Some id | _ -> None)
+               sfs);
+          check_ids env "object type" "type field"
+            (List.filter_map (fun (field : typ_field) ->
+                 match field.it with TypF (id, _, _) -> Some id | _ -> None)
+               sfs);
+          let _ = List.map (check_typ_field {env1 with pre = true} T.Object) sfs in
+          let fs = List.map (check_typ_field {env1 with pre = false} T.Object) sfs in
+          List.iter (fun (field : Syntax.typ_field) ->
+              match field.it with
+              | TypF _ -> ()
+              | ValF (id, typ, _) ->
+                if not (T.stable typ.note) then
+                   error env id.at "M0131" "variable %s is declared stable but has non-stable type%a"
+                   id.it
+                   display_typ typ.note)
+            sfs;
+          List.sort T.compare_field fs
+        ) sig_.it
+    )
+
+
+
+ + + diff --git a/coverage/mo_frontend/variance.ml.html b/coverage/mo_frontend/variance.ml.html new file mode 100644 index 00000000000..f997c5e5a55 --- /dev/null +++ b/coverage/mo_frontend/variance.ml.html @@ -0,0 +1,284 @@ + + + + + variance.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+
+
(* Variance (of type variables) in a type *)
+open Mo_types
+open Type
+
+(* NB: Polarities form a simple lattice with
+      Invariant
+     /        \
+    Covariant  Contravariant
+     \        /
+      Bivariant
+*)
+type t = Bivariant | Covariant | Contravariant | Invariant
+
+
+(* Least upper bound of two polarities *)
+let join p1 p2 =
+  match p1, p2 with
+  | other, Bivariant
+  | Bivariant, other -> other
+  | Covariant, Contravariant
+  | Contravariant, Covariant -> Invariant
+  | other, Invariant -> Invariant
+  | Invariant, other -> Invariant
+  | Covariant, Covariant ->  Covariant
+  | Contravariant, Contravariant -> Contravariant
+
+let flip p =
+    match p with
+    | Bivariant -> Bivariant
+    | Covariant -> Contravariant
+    | Contravariant -> Covariant
+    | Invariant -> Invariant
+
+module PS = Set.Make
+ (struct
+    type pol = t (* rename to avoid capture below *)
+    type t = pol * typ
+    let compare (p1, t1) (p2, t2) =
+      match compare p1 p2 with
+      | 0 -> Ord.compare t1 t2
+      | ord -> ord
+  end)
+
+let variances cons t =
+  let map = ref
+    (ConSet.fold (fun c ce -> ConEnv.add c Bivariant ce) cons ConEnv.empty)
+  in
+  let seen = ref PS.empty in
+  let rec go p t =
+    if PS.mem (p,t) !seen then ()
+    else begin
+      seen := PS.add (p,t) !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim _ | Any | Non -> ()
+      | Con (c, []) when ConSet.mem c cons ->
+        map := ConEnv.add c (join p (ConEnv.find c !map)) (!map)
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> ()
+        | Def (_, t) -> go p (open_ ts t)) (* TBR this may fail to terminate *)
+      | Array t | Opt t -> go p t
+      | Mut t -> go Invariant t
+      | Async (s, t1, t2) ->
+        go Invariant t1;
+        go p t2
+      | Tup ts -> List.iter (go p) ts
+      | Obj (_, fs) | Variant fs -> List.iter (fun f -> go p f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        let ts = open_binds tbs in
+        List.iter (fun tb ->
+          go Invariant (open_ ts tb.bound)) tbs; (* bounds are invariant *)
+        List.iter (go (flip p)) (List.map (open_ ts) ts1);
+        List.iter (go p) (List.map (open_ ts) ts2)
+      | Typ c -> () (* TBR  assumed closed *)
+    end
+  in
+  go Covariant t;
+  !map
+
+
+
+ + + diff --git a/coverage/mo_idl/idl_to_mo.ml.html b/coverage/mo_idl/idl_to_mo.ml.html new file mode 100644 index 00000000000..6e47a194297 --- /dev/null +++ b/coverage/mo_idl/idl_to_mo.ml.html @@ -0,0 +1,444 @@ + + + + + idl_to_mo.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+
+
open Idllib.Syntax
+open Idllib.Exception
+open Source
+module M = Mo_types.Type
+module I = Idllib.Typing
+
+
+let check_prim at p =
+  match p with
+  | Null -> M.Prim M.Null
+  | Bool -> M.Prim M.Bool
+  | Int -> M.Prim M.Int
+  | Int8 -> M.Prim M.Int8
+  | Int16 -> M.Prim M.Int16
+  | Int32 -> M.Prim M.Int32
+  | Int64 -> M.Prim M.Int64
+  | Nat -> M.Prim M.Nat
+  | Nat8 -> M.Prim M.Nat8
+  | Nat16 -> M.Prim M.Nat16
+  | Nat32 -> M.Prim M.Nat32
+  | Nat64 -> M.Prim M.Nat64
+  | Float32 -> raise (UnsupportedCandidFeature
+     (Diag.error_message at "M0161" "import"
+       "Candid 'float32' type cannot be imported as a Motoko type"))
+  | Float64 -> M.Prim M.Float
+  | Text -> M.Prim M.Text
+  | Reserved -> M.Any
+  | Empty -> M.Non
+
+let check_modes ms =
+  match ms with
+  | [] -> (M.Write, M.Promises)
+  | [{it=Oneway; _}] -> (M.Write, M.Returns)
+  | [{it=Query; _}] -> (M.Query, M.Promises)
+  | [{it=Composite; _}] -> (M.Composite, M.Promises)
+  | _ -> assert false
+
+let check_label lab : M.lab =
+  match lab.it with
+  | Named name -> Idllib.Escape.escape name
+  | Id id -> Idllib.Escape.escape_num id
+  | Unnamed id -> Idllib.Escape.escape_num id
+
+let is_tuple fs =
+  List.length fs > 1 &&
+    let fs = List.mapi (fun i f -> (i, f)) fs in
+    List.for_all (fun (i, f) ->
+        match f.it.label.it with
+        | Unnamed id -> Lib.Uint32.to_int id = i
+        | _ -> false) fs
+
+let rec check_typ' env occs t =
+  match t.it with
+  | PrimT p -> check_prim t.at p
+  | PrincipalT -> M.Prim M.Principal
+  | VarT {it=id; _} ->
+     (match M.Env.find_opt id !occs with
+      | None ->
+         let con = Mo_types.Cons.fresh id (M.Abs ([], M.Pre)) in
+         let res_t = M.Con (con, []) in
+         occs := M.Env.add id res_t !occs;
+         let t' = I.Env.find id env in
+         let t' = check_typ' env occs t' in
+         M.set_kind con (M.Def ([], t'));
+         res_t
+      | Some t -> t
+     )
+  | OptT t -> M.Opt (check_typ' env occs t)
+  | VecT t -> M.Array (check_typ' env occs t)
+  | BlobT -> M.Prim M.Blob
+  | RecordT fs ->
+     if is_tuple fs then
+       M.Tup (List.map (fun f -> check_typ' env occs f.it.typ) fs)
+     else
+       let fs = List.map (check_field env occs) fs in
+       M.Obj (M.Object, List.sort M.compare_field fs)
+  | VariantT fs ->
+     let fs = List.map (check_variant_field env occs) fs in
+     M.Variant (List.sort M.compare_field fs)
+  | FuncT (ms, ts1, ts2) ->
+     let (s, c) = check_modes ms in
+     M.Func (M.Shared s, c, [M.scope_bind], check_typs' env occs ts1, check_typs' env occs ts2)
+  | ServT ms ->
+     let fs = List.map (check_meth env occs) ms in
+     M.Obj (M.Actor, List.sort M.compare_field fs)
+  | ClassT _ -> raise (UnsupportedCandidFeature
+     (Diag.error_message t.at "M0162" "import" "Candid service constructor type not supported as Motoko type"))
+  | PreT -> assert false
+and check_typs' env occs ts = List.map (check_typ' env occs) ts
+and check_field env occs f =
+  M.{lab = check_label f.it.label; typ = check_typ' env occs f.it.typ; depr = None}
+and check_variant_field env occs f =
+  match f.it.typ.it with
+  | PrimT Null -> M.{lab = check_label f.it.label; typ = M.Tup []; depr = None}
+  | _ -> check_field env occs f
+and check_meth env occs (m: typ_meth) =
+  M.{lab = Idllib.Escape.escape_method m.it.var.at m.it.var.it; typ = check_typ' env occs m.it.meth; depr = None}
+
+let check_prog (env: typ I.Env.t) actor : M.typ =
+  let occs = ref M.Env.empty in
+  let fs = match actor with
+    | Some {it=ServT ms; _} ->
+      List.map (check_meth env occs) ms
+    | Some {it=ClassT (ts1, t); at; _} ->
+      (*@HACK: import service constructors as instantiated services *)
+      (*TODO: fix dfx to derive the correct instantiated candid instead *)
+      begin
+        let t' = check_typ' env occs t in
+        match M.normalize t' with
+        | M.Obj (M.Actor, fs) ->
+          Diag.print_messages [Diag.warning_message at "M0185" "import"
+            "importing Candid service constructor as instantiated service"];
+          fs
+        | _ -> assert false
+      end
+    | None -> assert false
+    | _ -> assert false
+  (* TODO: why do we only check and include the mentioned types (occs),
+     and not all of the .did declared ones (available to the caller), if not mentioned here? *)
+  in
+  let fs1 = M.Env.fold (fun id t fs ->
+       match t with
+       | M.Con (c, _) ->
+          (* TODO: consider adding deprecation as types can disappear even
+             across compatible .dids *)
+          M.{lab = id; typ = M.Typ c; depr = None}::fs
+       | _ -> assert false) !occs fs in
+  M.Obj (M.Actor, List.sort M.compare_field fs1)
+
+let check_typ env t = check_typ' env (ref M.Env.empty) t
+let check_typs env t = check_typs' env (ref M.Env.empty) t
+
+
+
+ + + diff --git a/coverage/mo_idl/mo_to_idl.ml.html b/coverage/mo_idl/mo_to_idl.ml.html new file mode 100644 index 00000000000..928e3319493 --- /dev/null +++ b/coverage/mo_idl/mo_to_idl.ml.html @@ -0,0 +1,714 @@ + + + + + mo_to_idl.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+
+
open Mo_def
+open Mo_types
+
+open Source
+open Type
+module E = Syntax
+module I = Idllib.Syntax
+
+(* use a functor to allocate temporary shared state *)
+module MakeState() = struct
+
+  let env = ref Env.empty
+
+  (* For monomorphization *)
+  module Stamp = Type.ConEnv
+  let stamp = ref Stamp.empty
+
+  module TypeMap = Map.Make (struct type t = con * typ list let compare = compare end)
+  let type_map = ref TypeMap.empty
+
+  let normalize_name name =
+    String.map (fun c ->
+        if c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
+        then c else '_'
+      ) name
+
+  let monomorphize_con vs c =
+    let name = normalize_name (Cons.name c) in
+    match Cons.kind c with
+    | Def _ ->
+      let id = (c, vs) in
+      let (k, n) =
+        match TypeMap.find_opt id !type_map with
+        | None ->
+          (match Stamp.find_opt c !stamp with
+           | None ->
+             let keys = Stamp.keys !stamp in
+             let k = List.length (List.filter (fun d -> Cons.name c = Cons.name d) keys) in
+             stamp := Stamp.add c (k, 0) !stamp;
+             type_map := TypeMap.add id (k, 0) !type_map;
+             (k, 0)
+           | Some (k, n) ->
+             stamp := Stamp.add c (k, n + 1) !stamp;
+             type_map := TypeMap.add id (k, n + 1) !type_map;
+             (k, n + 1))
+        | Some (k, n) -> (k, n)
+      in
+      begin
+        match (k, n) with
+        | (0, 0) -> name
+        | (0, n) when n > 0 -> Printf.sprintf "%s_%d" name n
+        | (k, 0) when k > 0 -> Printf.sprintf "%s__%d" name k
+        | (k, n) when k > 0 && n > 0 -> Printf.sprintf "%s__%d_%d" name k n
+        | _ -> assert false
+      end
+    | _ -> assert false
+
+  let prim = function
+    | Null -> I.PrimT I.Null
+    | Bool -> I.PrimT I.Bool
+    | Nat -> I.PrimT I.Nat
+    | Nat8 -> I.PrimT I.Nat8
+    | Nat16 -> I.PrimT I.Nat16
+    | Nat32 -> I.PrimT I.Nat32
+    | Nat64 -> I.PrimT I.Nat64
+    | Int -> I.PrimT I.Int
+    | Int8 -> I.PrimT I.Int8
+    | Int16 -> I.PrimT I.Int16
+    | Int32 -> I.PrimT I.Int32
+    | Int64 -> I.PrimT I.Int64
+    | Float -> I.PrimT I.Float64
+    | Char -> I.PrimT I.Nat32
+    | Text -> I.PrimT I.Text
+    | Blob -> I.BlobT
+    | Principal -> I.PrincipalT
+    | Error -> assert false
+
+  let rec typ t =
+    (match t with
+    | Any -> I.PrimT I.Reserved
+    | Non -> I.PrimT I.Empty
+    | Prim p -> prim p
+    | Var (s, i) -> assert false
+    | Con (c, ts) ->
+       (match Cons.kind c with
+        | Def (_, t) ->
+           (match (open_ ts t) with
+            | Prim p -> prim p
+            | Any -> I.PrimT I.Reserved
+            | Non -> I.PrimT I.Empty
+            | t ->
+               let id = monomorphize_con ts c in
+               if not (Env.mem id !env) then
+                 begin
+                   env := Env.add id (I.PreT @@ no_region) !env;
+                   let t = typ (normalize t) in
+                   env := Env.add id t !env
+                 end;
+               I.VarT (id @@ no_region))
+        | _ -> assert false)
+    | Typ c -> assert false
+    | Tup ts ->
+       if ts = [] then
+         I.PrimT I.Null
+       else
+         I.RecordT (tuple ts)
+    | Array t -> I.VecT (typ t)
+    | Opt t -> I.OptT (typ t)
+    | Obj (Object, fs) ->
+       I.RecordT (fields fs)
+    | Obj (Actor, fs) -> I.ServT (meths fs)
+    | Obj (Module, _) -> assert false
+    | Obj (Memory, _) -> assert false
+    | Variant fs ->
+       I.VariantT (fields fs)
+    | Func (Shared s, c, tbs, ts1, ts2) ->
+       let nons = List.map (fun _ -> Non) tbs in
+       let ts1, ts2 =
+         (List.map (open_ nons) ts1,
+          List.map (open_ nons) ts2) in
+       let t1 = args ts1 in
+       (match ts2, c with
+       | [], Returns -> I.FuncT ([I.Oneway @@ no_region], t1, [])
+       | ts, Promises ->
+         I.FuncT (
+           (match s with
+            | Query -> [I.Query @@ no_region]
+            | Composite -> [I.Composite @@ no_region]
+            | Write -> []),
+           t1, args ts)
+       | _ -> assert false)
+    | Func _
+    | Async _
+    | Mut _
+    | Pre -> assert false
+    ) @@ no_region
+  and field {lab; typ=t; _} =
+    let open Idllib.Escape in
+    match unescape lab with
+    | Nat nat ->
+       I.{label = I.Id nat @@ no_region; typ = typ t} @@ no_region
+    | Id id ->
+       I.{label = I.Named id @@ no_region; typ = typ t} @@ no_region
+  and fields fs =
+    List.map field
+      (List.filter (fun f -> not (is_typ f.typ)) fs)
+  and tuple ts =
+    List.mapi (fun i x ->
+        let id = Lib.Uint32.of_int i in
+        I.{label = I.Unnamed id @@ no_region; typ = typ x} @@ no_region
+      ) ts
+  and args ts =
+    List.map typ ts
+  and meths fs =
+    List.fold_right (fun f list ->
+        match f.typ with
+        | Typ c ->
+           list
+        | _ ->
+           let meth =
+             I.{var = Idllib.Escape.unescape_method f.lab @@ no_region;
+                meth = typ f.typ} @@ no_region in
+           meth :: list
+      ) fs []
+
+  let is_actor_con c =
+    match Cons.kind c with
+    | Def ([], Obj (Actor, _)) -> true
+    | _ -> false
+
+  let chase_decs env =
+    ConSet.iter (fun c ->
+        if is_actor_con c then ignore (typ (Con (c,[])))
+      ) env.Scope.con_env
+
+  let gather_decs () =
+    Env.fold (fun id t list ->
+        let dec = I.TypD (id @@ no_region, t) @@ no_region in
+        dec::list
+      ) !env []
+
+
+  let actor progs =
+    let open E in
+    let prog = CompUnit.combine_progs progs in
+    let { body = cub; _ } = (CompUnit.comp_unit_of_prog false prog).it in
+    match cub.it with
+    | ProgU _ | ModuleU _ -> None
+    | ActorU _ -> Some (typ cub.note.note_typ)
+    | ActorClassU _ ->
+       (match normalize cub.note.note_typ with
+        | Func (Local, Returns, [tb], ts1, [t2]) ->
+          let args = List.map typ (List.map (open_ [Non]) ts1) in
+          let (_, _, rng) = as_async (normalize (open_ [Non] t2)) in
+          let actor = typ rng in
+          Some (I.ClassT (args, actor) @@ cub.at)
+        | _ -> assert false
+       )
+
+end
+
+let prog (progs, senv) : I.prog =
+  let open MakeState() in
+  let actor = actor progs in
+  if actor = None then chase_decs senv;
+  let decs = gather_decs () in
+  let prog = I.{decs = decs; actor = actor} in
+  {it = prog; at = no_region; note = ""}
+
+let of_actor_type t : I.prog =
+  let open MakeState() in
+  let actor = Some (typ t) in
+  let decs = gather_decs () in
+  let prog = I.{decs = decs; actor = actor} in
+  {it = prog; at = no_region; note = ""}
+
+let of_service_type ts t : I.typ list * I.prog =
+  let open MakeState() in
+  let args = List.map typ ts  in
+  let actor = Some (typ t) in
+  let decs = gather_decs () in
+  let prog = I.{decs = decs; actor = actor} in
+  args,
+  {it = prog; at = no_region; note = ""}
+
+
+
+ + + diff --git a/coverage/mo_interpreter/interpret.ml.html b/coverage/mo_interpreter/interpret.ml.html new file mode 100644 index 00000000000..777a548978b --- /dev/null +++ b/coverage/mo_interpreter/interpret.ml.html @@ -0,0 +1,3661 @@ + + + + + interpret.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+
+
open Mo_def
+open Mo_values
+open Mo_types
+open Mo_config
+
+open Syntax
+open Source
+
+module V = Value
+module T = Type
+module CC = Call_conv
+
+(* Context *)
+
+type val_env = V.def V.Env.t
+type lib_env = V.value V.Env.t
+type lab_env = V.value V.cont V.Env.t
+type ret_env = V.value V.cont option
+type throw_env = V.value V.cont option
+type actor_env = V.value V.Env.t ref (* indexed by actor ids *)
+
+(* The actor heap.
+    NB: A cut-down ManagementCanister with id "" is added later, to enjoy access to logging facilities.
+*)
+let state = ref V.Env.empty
+
+type flags =
+  { trace : bool;
+    print_depth : int
+  }
+
+type scope =
+  { val_env: V.def V.Env.t;
+    lib_env: V.value V.Env.t;
+  }
+
+type env =
+  { flags : flags;
+    vals : val_env;
+    labs : lab_env;
+    libs : lib_env;
+    rets : ret_env;
+    throws : throw_env;
+    self : V.actor_id;
+    actor_env : actor_env;
+  }
+
+let adjoin_scope scope1 scope2 =
+  { val_env = V.Env.adjoin scope1.val_env scope2.val_env;
+    lib_env = V.Env.adjoin scope1.lib_env scope2.lib_env;
+  }
+
+let adjoin_vals env ve = { env with vals = V.Env.adjoin env.vals ve }
+
+let empty_scope = { val_env = V.Env.empty; lib_env = V.Env.empty }
+
+let lib_scope f v scope : scope =
+  { scope with lib_env = V.Env.add f v scope.lib_env }
+
+let env_of_scope flags ae scope =
+  { flags;
+    vals = scope.val_env;
+    libs = scope.lib_env;
+    labs = V.Env.empty;
+    rets = None;
+    throws = None;
+    self = V.top_id;
+    actor_env = ae;
+  }
+
+let context env = V.Blob env.self
+
+(* Error handling *)
+
+exception Trap of Source.region * string
+exception Cancel of string
+
+let trap at fmt = Printf.ksprintf (fun s -> raise (Trap (at, s))) fmt
+
+let find id env =
+  try V.Env.find id env
+  with Not_found ->
+    let dom = V.Env.keys env in
+    trap no_region "unbound identifier %s in domain %s" id (String.concat " " dom)
+
+(* Tracing *)
+
+let trace_depth = ref 0
+
+let trace fmt =
+  Printf.ksprintf (fun s ->
+    Printf.printf "%s%s\n%!" (String.make (2 * !trace_depth) ' ') s
+  ) fmt
+
+let string_of_val env = V.string_of_val env.flags.print_depth
+let string_of_def flags = V.string_of_def flags.print_depth
+let string_of_arg env = function
+  | V.Tup _ as v -> string_of_val env v
+  | v -> "(" ^ string_of_val env v ^ ")"
+
+
+(* Debugging aids *)
+
+let last_env = ref (env_of_scope {trace = false; print_depth = 2} state empty_scope)
+let last_region = ref Source.no_region
+
+let print_exn flags exn =
+  let trace = Printexc.get_backtrace () in
+  Printf.printf "%!";
+  let at = Source.string_of_region !last_region in
+  Printf.eprintf "%s: internal error, %s\n" at (Printexc.to_string exn);
+  Printf.eprintf "\nLast environment:\n";
+  Value.Env.iter (fun x d -> Printf.eprintf "%s = %s\n" x (string_of_def flags d))
+    !last_env.vals;
+  Printf.eprintf "\n";
+  Printf.eprintf "%s" trace;
+  Printf.eprintf "%!"
+
+(* Scheduling *)
+
+let step_total = ref 0
+let step_limit = ref 0
+
+module Scheduler =
+struct
+  let q : (unit -> unit) Queue.t = Queue.create ()
+
+  let queue work = Queue.add work q
+  let yield () =
+    trace_depth := 0;
+    try Queue.take q () with Trap (at, msg) ->
+      Printf.eprintf "%s: execution error, %s\n" (Source.string_of_region at) msg
+  let rec run () =
+    if not (Queue.is_empty q) then (yield (); run ())
+
+  let tmp : (unit -> unit) Queue.t = Queue.create ()
+  let bounce work =
+    (* add work to *front* of queue *)
+    Queue.transfer q tmp;
+    Queue.add work q;
+    Queue.transfer tmp q
+
+  let interval = 128
+  let count = ref interval
+  let trampoline3 f x y z =
+    if !Flags.ocaml_js then begin
+        step_total := (!step_total) + 1;
+        if !step_total = !step_limit then raise (Cancel "interpreter reached step limit");
+        if !count <= 0 then begin
+            count := interval;
+            bounce (fun () -> f x y z);
+          end
+        else begin
+            count := (!count) - 1;
+            f x y z
+          end
+      end
+    else f x y z
+end
+
+
+(* Async auxiliary functions *)
+
+let make_async () : V.async =
+  {V.result = Lib.Promise.make (); waiters = []}
+
+let get_async async (k : V.value V.cont) (r : V.value V.cont) =
+  match Lib.Promise.value_opt async.V.result with
+  | Some (V.Ok v) -> k v
+  | Some (V.Error v) -> r v
+  | None -> async.V.waiters <- (k,r)::async.V.waiters
+
+let set_async async v =
+  List.iter (fun (k,_) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Ok v);
+  async.V.waiters <- []
+
+let reject_async async v =
+  List.iter (fun (_,k) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Error v);
+  async.V.waiters <- []
+
+let reply async v =
+  Scheduler.queue (fun () -> set_async async v)
+
+let reject async v =
+  match v with
+  | V.Tup [ _code; message ] ->
+    (* mask the error code before rejecting *)
+    Scheduler.queue
+      (fun () -> reject_async async (V.Tup [V.Variant("canister_reject", V.unit); message]))
+  | _ -> assert false
+
+let async env at (f: (V.value V.cont) -> (V.value V.cont) -> unit) (k : V.value V.cont) =
+    let async = make_async () in
+    let k' = reply async in
+    let r  = reject async in
+    if env.flags.trace then trace "-> async %s" (string_of_region at);
+    Scheduler.queue (fun () ->
+      if env.flags.trace then trace "<- async %s" (string_of_region at);
+      incr trace_depth;
+      f (fun v ->
+        if env.flags.trace then trace "<= %s" (string_of_val env v);
+        decr trace_depth;
+        k' v)
+        r
+    );
+    k (V.Async async)
+
+let await env at async k =
+  if env.flags.trace then trace "=> await %s" (string_of_region at);
+  decr trace_depth;
+  get_async async (fun v ->
+    Scheduler.queue (fun () ->
+      if env.flags.trace then
+        trace "<- await %s%s" (string_of_region at) (string_of_arg env v);
+      incr trace_depth;
+      k v
+      )
+    )
+    (let r = Option.get (env.throws) in
+     fun v ->
+       Scheduler.queue (fun () ->
+         if env.flags.trace then
+           trace "<- await %s threw %s" (string_of_region at) (string_of_arg env v);
+         incr trace_depth;
+         r v))
+
+let make_unit_message env id v =
+  let open CC in
+  let call_conv, f = V.as_func v in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    Value.message_func s call_conv.n_args f
+  | _ -> (* assert false *)
+    failwith ("unexpected call_conv " ^ (string_of_call_conv call_conv))
+
+let make_async_message env id v =
+  let open CC in
+  let call_conv, f = V.as_func v in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Promises; _} ->
+    Value.async_func s call_conv.n_args call_conv.n_res f
+  | _ -> (* assert false *)
+    failwith ("unexpected call_conv " ^ (string_of_call_conv call_conv))
+
+
+let make_message env name t v : V.value =
+  match t with
+  | T.Func (_, T.Returns, _, _, _) -> make_unit_message env name v
+  | T.Func (_, T.Promises, _, _, _) -> make_async_message env name v
+  | _ -> (* assert false *)
+    failwith (Printf.sprintf "actorfield: %s %s" name (T.string_of_typ t))
+
+
+(* Literals *)
+
+let interpret_lit env lit : V.value =
+  match !lit with
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit n -> V.Nat8 n
+  | Nat16Lit n -> V.Nat16 n
+  | Nat32Lit n -> V.Nat32 n
+  | Nat64Lit n -> V.Nat64 n
+  | IntLit i -> V.Int i
+  | Int8Lit i -> V.Int8 i
+  | Int16Lit i -> V.Int16 i
+  | Int32Lit i -> V.Int32 i
+  | Int64Lit i -> V.Int64 i
+  | FloatLit f -> V.Float f
+  | CharLit c -> V.Char c
+  | TextLit s -> V.Text s
+  | BlobLit b -> V.Blob b
+  | PreLit _ -> assert false
+
+
+(* Overloaded dot implementations *)
+
+let array_get a at =
+  V.local_func 1 1 (fun c v k ->
+    let n = V.as_int v in
+    if Numerics.Nat.lt n (Numerics.Nat.of_int (Array.length a))
+    then k (a.(Numerics.Nat.to_int n))
+    else trap at "array index out of bounds"
+  )
+
+let array_put a at =
+  V.local_func 2 0 (fun c v k ->
+    let v1, v2 = V.as_pair v in
+    let n = V.as_int v1 in
+    if Numerics.Nat.lt n (Numerics.Nat.of_int (Array.length a))
+    then k (a.(Numerics.Nat.to_int n) <- v2; V.Tup [])
+    else trap at "array index out of bounds"
+  )
+
+let array_size a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (Array.length a)))
+  )
+
+let array_keys a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = Array.length a
+        then k' V.Null
+        else let v = V.Opt (V.Int (Numerics.Nat.of_int !i)) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let array_vals a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = Array.length a
+        then k' V.Null
+        else
+          let wi = match a.(!i) with
+            | V.Mut r -> !r
+            | w -> w in
+          let v = V.Opt wi in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let blob_vals t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = String.length t
+        then k' V.Null
+        else let v = V.Opt V.(Nat8 (Numerics.Nat8.of_int (Char.code (String.get t !i)))) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let blob_size t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (String.length t)))
+  )
+
+let text_chars t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let s = Lib.Utf8.decode t in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = List.length s
+        then k' V.Null
+        else let v = V.Opt (V.Char (List.nth s !i)) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let text_len t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (List.length (Lib.Utf8.decode t))))
+  )
+
+(* Expressions *)
+
+let check_call_conv exp call_conv =
+  let open CC in
+  let exp_call_conv = call_conv_of_typ exp.note.note_typ in
+  if not (exp_call_conv = call_conv) then
+    failwith (Printf.sprintf
+      "call_conv mismatch: function %s of type %s expecting %s, found %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (T.string_of_typ exp.note.note_typ)
+      (string_of_call_conv exp_call_conv)
+      (string_of_call_conv call_conv)
+    )
+
+let check_call_conv_arg env exp v call_conv =
+  let open CC in
+  if call_conv.n_args <> 1 then
+  let es = try V.as_tup v with Invalid_argument _ ->
+    failwith (Printf.sprintf
+      "call %s: calling convention %s cannot handle non-tuple value %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (string_of_call_conv call_conv)
+      (string_of_val env v)
+    )
+  in
+  if List.length es <> call_conv.n_args then
+    failwith (Printf.sprintf
+      "call %s: calling convention %s got tuple of wrong length %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (string_of_call_conv call_conv)
+      (string_of_val env v)
+    )
+
+let rec interpret_exp env exp (k : V.value V.cont) =
+  Scheduler.trampoline3
+    interpret_exp_mut env exp (function V.Mut r -> k !r | v -> k v)
+
+and interpret_exp_mut env exp (k : V.value V.cont) =
+  last_region := exp.at;
+  last_env := env;
+  Profiler.bump_region exp.at ;
+  match exp.it with
+  | PrimE s ->
+    k (V.Func (CC.call_conv_of_typ exp.note.note_typ,
+       Prim.prim { Prim.trap = trap exp.at "%s" } s
+    ))
+  | VarE id ->
+    begin match Lib.Promise.value_opt (find id.it env.vals) with
+    | Some v -> k v
+    | None -> trap exp.at "accessing identifier before its definition"
+    end
+  | ImportE (f, ri) ->
+    (match !ri with
+    | Unresolved -> assert false
+    | LibPath fp ->
+      k (find fp env.libs)
+    | IDLPath _ -> trap exp.at "actor import"
+    | PrimPath -> k (find "@prim" env.libs)
+    )
+  | LitE lit ->
+    k (interpret_lit env lit)
+  | ActorUrlE url ->
+    interpret_exp env url (fun v1 ->
+      let url_text = V.as_text v1 in
+      match Ic.Url.decode_principal url_text with
+      (* create placeholder functions (see #3683) *)
+      | Ok bytes -> k (V.Blob bytes)
+      | Error e -> trap exp.at "could not parse %S as an actor reference: %s"  (V.as_text v1) e
+    )
+  | UnE (ot, op, exp1) ->
+    interpret_exp env exp1
+      (fun v1 ->
+        k (try Operator.unop op !ot v1 with Invalid_argument s -> trap exp.at "%s" s))
+  | BinE (ot, exp1, op, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (try Operator.binop op !ot v1 v2 with _ ->
+          trap exp.at "arithmetic overflow")
+      )
+    )
+  | ToCandidE _ -> invalid_arg "to do: ToCandidE"
+  | FromCandidE _ -> invalid_arg "to do: FromCandidE"
+  | ShowE (ot, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      if Show.can_show !ot
+      then k (Value.Text (Show.show_val !ot v))
+      else raise (Invalid_argument "debug_show"))
+  | RelE (ot, exp1, op, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (Operator.relop op !ot v1 v2)
+      )
+    )
+  | TupE exps ->
+    interpret_exps env exps [] (fun vs -> k (V.Tup vs))
+  | OptE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k (V.Opt v1))
+  | DoOptE exp1 ->
+    let env' = { env with labs = V.Env.add "!" k env.labs } in
+    interpret_exp env' exp1 (fun v1 -> k (V.Opt v1))
+  | BangE exp1 ->
+    interpret_exp env exp1 (fun v1 ->
+      match v1 with
+      | V.Opt v2 -> k v2
+      | V.Null -> find "!" env.labs v1
+      | _ -> assert false)
+  | ProjE (exp1, n) ->
+    interpret_exp env exp1 (fun v1 -> k (List.nth (V.as_tup v1) n))
+  | ObjBlockE (obj_sort, dec_fields) ->
+    interpret_obj env obj_sort.it dec_fields k
+  | ObjE (exp_bases, exp_fields) ->
+    let fields fld_env = interpret_exp_fields env exp_fields fld_env (fun env -> k (V.Obj env)) in
+    let open V.Env in
+    let merges =
+      List.fold_left
+        (merge (fun _ l r -> match l, r with | l, None -> l | None, r -> r | _ -> assert false))
+        empty in
+    (* remove dynamic fields not present in the type as well as overwritten fields *)
+    let labs = List.map (fun (f : Syntax.exp_field) -> f.it.id.it) exp_fields in
+    let tys = List.(map (fun b ->
+                         T.as_obj b.note.note_typ |>
+                         snd |>
+                         filter (fun f -> not (mem f.T.lab labs)))) exp_bases in
+    let strip vs =
+      let known fs k _ = List.exists (fun { T.lab; _ } -> k = lab) fs in
+      List.map2 (fun fs v -> filter (known fs) (V.as_obj v)) tys vs in
+    interpret_exps env exp_bases [] (fun objs -> fields (merges (strip objs)))
+  | TagE (i, exp1) ->
+    interpret_exp env exp1 (fun v1 -> k (V.Variant (i.it, v1)))
+  | DotE (exp1, id) ->
+    interpret_exp env exp1 (fun v1 ->
+      match v1 with
+      | V.Obj fs ->
+        k (find id.it fs)
+      | V.Blob aid when T.sub exp1.note.note_typ (T.Obj (T.Actor, [])) ->
+        begin match V.Env.find_opt aid !(env.actor_env) with
+        (* not quite correct: On the platform, you can invoke and get a reject *)
+        | None -> trap exp.at "Unkown actor \"%s\"" aid
+        | Some actor_value ->
+          let fs = V.as_obj actor_value in
+          match V.Env.find_opt id.it fs with
+          | None -> trap exp.at "Actor \"%s\" has no method \"%s\"" aid id.it
+          | Some field_value -> k field_value
+        end
+      | V.Array vs ->
+        let f = match id.it with
+          | "size" -> array_size
+          | "get" -> array_get
+          | "put" -> array_put
+          | "keys" -> array_keys
+          | "vals" -> array_vals
+          | s -> assert false
+        in k (f vs exp.at)
+      | V.Text s ->
+        let f = match id.it with
+          | "size" -> text_len
+          | "chars" -> text_chars
+          | s -> assert false
+        in k (f s exp.at)
+      | V.Blob b when T.sub exp1.note.note_typ (T.blob)->
+        let f = match id.it with
+          | "size" -> blob_size
+          | "vals" -> blob_vals
+          | s -> assert false
+        in k (f b exp.at)
+      | _ -> assert false
+    )
+  | AssignE (exp1, exp2) ->
+    interpret_exp_mut env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        V.as_mut v1 := v2; k V.unit
+      )
+    )
+  | ArrayE (mut, exps) ->
+    interpret_exps env exps [] (fun vs ->
+      let vs' =
+        match mut.it with
+        | Var -> List.map (fun v -> V.Mut (ref v)) vs
+        | Const -> vs
+      in k (V.Array (Array.of_list vs'))
+    )
+  | IdxE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap exp.at "%s" s)
+      )
+    )
+  | FuncE (name, shared_pat, _typbinds, pat, _typ, _sugar, exp2) ->
+    let f = interpret_func env name shared_pat pat (fun env' -> interpret_exp env' exp2) in
+    let v = V.Func (CC.call_conv_of_typ exp.note.note_typ, f) in
+    let v' =
+      match shared_pat.it with
+      | T.Shared _ -> make_message env name exp.note.note_typ v
+      | T.Local -> v
+    in k v'
+  | CallE (exp1, typs, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv exp1 call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        let c = context env in
+        f c v2 k
+      )
+    )
+  | BlockE decs ->
+    let k' =
+      if T.is_unit exp.note.note_typ (* TODO: peeking at types violates erasure semantics, revisit! *)
+      then (fun _v -> k V.unit)
+      else k
+    in
+    interpret_block env decs None k'
+  | NotE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k (V.Bool (not (V.as_bool v1))))
+  | AndE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else k v1
+    )
+  | OrE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then k v1
+      else interpret_exp env exp2 k
+    )
+  | ImpliesE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k V.(Bool (as_bool v1 <= as_bool v2))
+      )
+    )
+  | OldE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k v1)
+  | IfE (exp1, exp2, exp3) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else interpret_exp env exp3 k
+    )
+  | SwitchE (exp1, cases) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_cases env cases exp.at v1 k
+      )
+  | TryE (exp1, cases) ->
+    let k' = fun v1 -> interpret_catches env cases exp.at v1 k in
+    let env' = { env with throws = Some k' } in
+    interpret_exp env' exp1 k
+  | WhileE (exp1, exp2) ->
+    let k_continue = fun v -> V.as_unit v; interpret_exp env exp k in
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k_continue
+      else k V.unit
+    )
+  | LoopE (exp1, None) ->
+    interpret_exp env exp1 (fun v -> V.as_unit v; interpret_exp env exp k)
+  | LoopE (exp1, Some exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      V.as_unit v1;
+      interpret_exp env exp2 (fun v2 ->
+        if V.as_bool v2
+        then interpret_exp env exp k
+        else k V.unit
+      )
+    )
+  | ForE (pat, exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      let fs = V.as_obj v1 in
+      let _, next = V.as_func (find "next" fs) in
+      let rec k_continue = fun v ->
+        V.as_unit v;
+        next (context env) V.unit (fun v' ->
+          match v' with
+          | V.Opt v1 ->
+            (match match_pat pat v1 with
+            | None ->
+              trap pat.at "value %s does not match pattern" (string_of_val env v')
+            | Some ve ->
+              interpret_exp (adjoin_vals env ve) exp2 k_continue
+            )
+          | V.Null -> k V.unit
+          | _ -> assert false
+        )
+      in k_continue V.unit
+    )
+  | LabelE (id, _typ, exp1) ->
+    let env' = {env with labs = V.Env.add id.it k env.labs} in
+    Profiler.bump_label id.at id.it ;
+    interpret_exp env' exp1 k
+  | BreakE (id, exp1) ->
+    interpret_exp env exp1 (find id.it env.labs)
+  | DebugE exp1 ->
+    if !Mo_config.Flags.release_mode then k V.unit else interpret_exp env exp1 k
+  | RetE exp1 ->
+    interpret_exp env exp1 (Option.get env.rets)
+  | ThrowE exp1 ->
+    interpret_exp env exp1 (Option.get env.throws)
+  | AsyncE (T.Fut, _, exp1) ->
+    async env
+      exp.at
+      (fun k' r ->
+        let env' = {env with labs = V.Env.empty; rets = Some k'; throws = Some r}
+        in interpret_exp env' exp1 k')
+      k
+  | AsyncE (T.Cmp, _, exp1) ->
+    k (V.Comp (fun k' r ->
+      let env' = {env with labs = V.Env.empty; rets = Some k'; throws = Some r}
+      in interpret_exp env' exp1 k'))
+  | AwaitE (T.Fut, exp1) ->
+    interpret_exp env exp1
+      (fun v1 -> await env exp.at (V.as_async v1) k)
+  | AwaitE (T.Cmp, exp1) ->
+    interpret_exp env exp1
+      (fun v1 -> (V.as_comp v1) k (Option.get env.throws))
+  | AssertE (Runtime, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      if V.as_bool v
+      then k V.unit
+      else trap exp.at "assertion failure"
+    )
+  | AssertE (_, exp1) -> k V.unit
+  | AnnotE (exp1, _typ) ->
+    interpret_exp env exp1 k
+  | IgnoreE exp1 ->
+    interpret_exp env exp1 (fun _v -> k V.unit)
+
+and interpret_exps env exps vs (k : V.value list V.cont) =
+  match exps with
+  | [] -> k (List.rev vs)
+  | exp::exps' ->
+    interpret_exp env exp (fun v -> interpret_exps env exps' (v::vs) k)
+
+(* Objects *)
+
+and interpret_exp_fields env exp_fields fld_env (k : V.value V.Env.t V.cont) =
+  match exp_fields with
+  | [] -> k fld_env
+  | exp_field::exp_fields' ->
+    interpret_exp env exp_field.it.exp (fun v ->
+      let fv = match exp_field.it.mut.it with
+          | Syntax.Var -> V.Mut (ref v)
+          | Syntax.Const -> v
+      in
+      interpret_exp_fields env exp_fields' (V.Env.add exp_field.it.id.it fv fld_env) k)
+
+(* Cases *)
+
+and interpret_cases env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    trap at "switch value %s does not match any case" (string_of_val env v)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_cases env cases' at v k
+
+(* Catches *)
+
+and interpret_catches env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    Option.get env.throws v (* re-throw v *)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_catches env cases' at v k
+
+(* Patterns *)
+
+and declare_id id =
+  V.Env.singleton id.it (Lib.Promise.make ())
+
+and declare_pat pat : val_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ ->  V.Env.empty
+  | VarP id -> declare_id id
+  | TupP pats -> declare_pats pats V.Env.empty
+  | ObjP pfs -> declare_pat_fields pfs V.Env.empty
+  | OptP pat1
+  | TagP (_, pat1)
+  | AltP (pat1, _) (* pat2 has the same identifiers *)
+  | AnnotP (pat1, _)
+  | ParP pat1 -> declare_pat pat1
+
+and declare_pats pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve' = declare_pat pat in
+    declare_pats pats' (V.Env.adjoin ve ve')
+
+and declare_pat_fields pfs ve : val_env =
+  match pfs with
+  | [] -> ve
+  | pf::pfs' ->
+    let ve' = declare_pat pf.it.pat in
+    declare_pat_fields pfs' (V.Env.adjoin ve ve')
+
+and define_id env id v =
+  define_id' env id.it v
+
+and define_id' env id v =
+  Lib.Promise.fulfill (find id env.vals) v
+
+and define_pat env pat v =
+  match match_pat pat v with
+  | Some ve ->
+     V.Env.iter (fun id d  -> define_id' env id (Lib.Promise.value d)) ve;
+     true
+  | None ->
+     false
+
+and match_lit lit v : bool =
+  match !lit, v with
+  | NullLit, V.Null -> true
+  | BoolLit b, V.Bool b' -> b = b'
+  | NatLit n, V.Int n' -> Numerics.Int.eq n n'
+  | Nat8Lit n, V.Nat8 n' -> Numerics.Nat8.eq n n'
+  | Nat16Lit n, V.Nat16 n' -> Numerics.Nat16.eq n n'
+  | Nat32Lit n, V.Nat32 n' -> Numerics.Nat32.eq n n'
+  | Nat64Lit n, V.Nat64 n' -> Numerics.Nat64.eq n n'
+  | IntLit i, V.Int i' -> Numerics.Int.eq i i'
+  | Int8Lit i, V.Int8 i' -> Numerics.Int_8.eq i i'
+  | Int16Lit i, V.Int16 i' -> Numerics.Int_16.eq i i'
+  | Int32Lit i, V.Int32 i' -> Numerics.Int_32.eq i i'
+  | Int64Lit i, V.Int64 i' -> Numerics.Int_64.eq i i'
+  | FloatLit z, V.Float z' -> z = z'
+  | CharLit c, V.Char c' -> c = c'
+  | TextLit u, V.Text u' -> u = u'
+  | BlobLit b, V.Blob b' -> b = b'
+  | PreLit _, _ -> assert false
+  | _ -> false
+
+and match_pat pat v : val_env option =
+  match pat.it with
+  | WildP -> Some V.Env.empty
+  | VarP id -> Some (V.Env.singleton id.it (Lib.Promise.make_fulfilled v))
+  | LitP lit ->
+    if match_lit lit v
+    then Some V.Env.empty
+    else None
+  | SignP (op, lit) ->
+    let t = T.as_immut pat.note in
+    match_pat {pat with it = LitP lit} (Operator.unop op t v)
+  | TupP pats ->
+    match_pats pats (V.as_tup v) V.Env.empty
+  | ObjP pfs ->
+    match_pat_fields pfs (V.as_obj v) V.Env.empty
+  | OptP pat1 ->
+    (match v with
+    | V.Opt v1 -> match_pat pat1 v1
+    | V.Null -> None
+    | _ -> assert false
+    )
+  | TagP (i, pat1) ->
+    let k, v1 = V.as_variant v in
+    if i.it = k
+    then match_pat pat1 v1
+    else None
+  | AltP (pat1, pat2) ->
+    (match match_pat pat1 v with
+    | None -> match_pat pat2 v
+    | some -> some
+    )
+  | AnnotP (pat1, _)
+  | ParP pat1 ->
+    match_pat pat1 v
+
+and match_pats pats vs ve : val_env option =
+  match pats, vs with
+  | [], [] -> Some ve
+  | pat::pats', v::vs' ->
+    (match match_pat pat v with
+    | Some ve' -> match_pats pats' vs' (V.Env.adjoin ve ve')
+    | None -> None
+    )
+  | _ -> assert false
+
+and match_pat_fields pfs vs ve : val_env option =
+  match pfs with
+  | [] -> Some ve
+  | pf::pfs' ->
+    let v = V.Env.find pf.it.id.it vs in
+    begin match match_pat pf.it.pat v with
+    | Some ve' -> match_pat_fields pfs' vs (V.Env.adjoin ve ve')
+    | None -> None
+    end
+
+and match_shared_pat env shared_pat c =
+  match shared_pat.it, c with
+  | T.Local, _ -> V.Env.empty
+  | T.Shared (_, pat), v ->
+    (match match_pat pat v with
+     | None ->
+       (* shouldn't occur with our irrefutable patterns, but may in future *)
+       trap pat.at "context value %s does not match context pattern" (string_of_val env v)
+     | Some ve1 ->
+       ve1)
+
+(* Objects *)
+
+and interpret_obj env obj_sort dec_fields (k : V.value V.cont) =
+  match obj_sort with
+  | T.Actor ->
+     let self = V.fresh_id() in
+     let ve_ex, ve_in = declare_dec_fields dec_fields V.Env.empty V.Env.empty in
+     let env' = adjoin_vals { env with self = self } ve_in in
+     interpret_dec_fields env' dec_fields ve_ex
+     (fun obj ->
+        (env.actor_env := V.Env.add self obj !(env.actor_env);
+          k (V.Blob self)))
+  | _ ->
+     let ve_ex, ve_in = declare_dec_fields dec_fields V.Env.empty V.Env.empty in
+     let env' = adjoin_vals env ve_in in
+     interpret_dec_fields env' dec_fields ve_ex k
+
+and declare_dec_fields dec_fields ve_ex ve_in : val_env * val_env =
+  match dec_fields with
+  | [] -> ve_ex, ve_in
+  | {it = {dec; vis; _}; _}::dec_fields' ->
+    let ve' = declare_dec dec in
+    let ve_ex' = if vis.it = Private then ve_ex else V.Env.adjoin ve_ex ve' in
+    let ve_in' = V.Env.adjoin ve_in ve' in
+    declare_dec_fields dec_fields' ve_ex' ve_in'
+
+and interpret_dec_fields env dec_fields ve (k : V.value V.cont) =
+  match dec_fields with
+  | [] ->
+    let obj = V.Obj (V.Env.map Lib.Promise.value ve) in
+    k obj
+  | {it = {dec; _}; _}::dec_fields' ->
+    interpret_dec env dec (fun _v -> interpret_dec_fields env dec_fields' ve k)
+
+
+(* Blocks and Declarations *)
+
+and interpret_block env decs ro (k : V.value V.cont) =
+  let ve = declare_decs decs V.Env.empty in
+  Option.iter (fun r -> r := ve) ro;
+  interpret_decs (adjoin_vals env ve) decs k
+
+
+and declare_dec dec : val_env =
+  match dec.it with
+  | ExpD _
+  | TypD _ -> V.Env.empty
+  | LetD (pat, _, _) -> declare_pat pat
+  | VarD (id, _) -> declare_id id
+  | ClassD (_, id, _, _, _, _, _, _) -> declare_id {id with note = ()}
+
+and declare_decs decs ve : val_env =
+  match decs with
+  | [] -> ve
+  | dec::decs' ->
+    let ve' = declare_dec dec in
+    declare_decs decs' (V.Env.adjoin ve ve')
+
+
+and interpret_dec env dec (k : V.value V.cont) =
+  match dec.it with
+  | ExpD exp ->
+    interpret_exp env exp k
+  | LetD (pat, exp, fail) ->
+    interpret_exp env exp (fun v ->
+      if define_pat env pat v then
+        k v
+      else
+        match fail with
+        | Some fail -> interpret_exp env fail (fun _ -> assert false)
+        | None -> trap pat.at "value %s does not match pattern" (string_of_val env v)
+    )
+  | VarD (id, exp) ->
+    interpret_exp env exp (fun v ->
+      define_id env id (V.Mut (ref v));
+      k V.unit
+    )
+  | TypD _ ->
+    k V.unit
+  | ClassD (shared_pat, id, _typbinds, pat, _typ_opt, obj_sort, id', dec_fields) ->
+    let f = interpret_func env id.it shared_pat pat (fun env' k' ->
+      if obj_sort.it <> T.Actor then
+        let env'' = adjoin_vals env' (declare_id id') in
+        interpret_obj env'' obj_sort.it dec_fields (fun v' ->
+          define_id env'' id' v';
+          k' v')
+      else
+        async env' Source.no_region
+          (fun k'' r ->
+            let env'' = adjoin_vals env' (declare_id id') in
+            let env''' = { env'' with
+              labs = V.Env.empty;
+              rets = Some k'';
+              throws = Some r }
+            in
+            interpret_obj env''' obj_sort.it dec_fields (fun v' ->
+              define_id env''' id' v';
+              k'' v'))
+          k')
+    in
+    let v = V.Func (CC.call_conv_of_typ dec.note.note_typ, f) in
+    define_id env {id with note = ()} v;
+    k v
+
+and interpret_decs env decs (k : V.value V.cont) =
+  match decs with
+  | [] -> k V.unit
+  | [dec] -> interpret_dec env dec k
+  | dec::decs' ->
+    interpret_dec env dec (fun _v -> interpret_decs env decs' k)
+
+and interpret_func env name shared_pat pat f c v (k : V.value V.cont) =
+  if env.flags.trace then trace "%s%s" name (string_of_arg env v);
+  let v1 = V.Obj (V.Env.singleton "caller" c) in
+  let ve1 = match_shared_pat env shared_pat v1 in
+  match match_pat pat v with
+  | None ->
+    trap pat.at "argument value %s does not match parameter list" (string_of_val env v)
+  | Some ve2 ->
+    incr trace_depth;
+    let k' = fun v' ->
+      if env.flags.trace then trace "<= %s" (string_of_val env v');
+      decr trace_depth;
+      k v'
+    in
+    let env' =
+      { env with
+        vals = V.Env.adjoin env.vals (V.Env.adjoin ve1 ve2);
+        libs = env.libs;
+        labs = V.Env.empty;
+        rets = Some k';
+      }
+    in f env' k'
+
+(* Programs *)
+
+let ensure_management_canister env =
+  if V.Env.mem "" (!(env.actor_env))
+  then ()
+  else
+    env.actor_env :=
+      V.Env.add
+        (* ManagementCanister with raw_rand (only) *)
+        ""
+        (V.Obj
+           (V.Env.singleton "raw_rand"
+              (V.async_func (T.Write) 0 1
+                 (fun c v k ->
+                   async env
+                     Source.no_region
+                     (fun k' r ->
+                       k' (V.Blob (V.Blob.rand32 ())))
+                     k))))
+        !(env.actor_env)
+
+let interpret_prog flags scope p : (V.value * scope) option =
+  step_total := 0;
+  let state = state in
+  try
+    let env =
+      { (env_of_scope flags state scope) with
+        throws = Some (fun v -> trap !last_region "uncaught throw") } in
+    ensure_management_canister env;
+    trace_depth := 0;
+    let vo = ref None in
+    let ve = ref V.Env.empty in
+    Scheduler.queue (fun () ->
+      interpret_block env p.it (Some ve) (fun v -> vo := Some v)
+    );
+    Scheduler.run ();
+    let scope = { val_env = !ve; lib_env = scope.lib_env } in
+    match !vo with
+    | Some v -> Some (v, scope)
+    | None -> None
+  with
+  | Cancel s ->
+    Printf.eprintf "cancelled: %s\n" s;
+    None
+  | exn ->
+    (* For debugging, should never happen. *)
+    print_exn flags exn;
+    None
+
+
+(* Libraries *)
+
+(* Import a module unchanged, and a class constructor as an asynchronous function.
+   The conversion will be unnecessary once we declare classes as asynchronous. *)
+let import_lib env lib =
+  let { body = cub; _ } = lib.it in
+  match cub.it with
+  | Syntax.ModuleU _ ->
+    fun v -> v
+  | Syntax.ActorClassU (_sp, id, _tbs, _p, _typ, _self_id, _dec_fields) ->
+    fun v -> V.Obj (V.Env.from_list
+      [ (id.it, v);
+        ("system",
+         V.Obj (V.Env.singleton id.it (
+          V.local_func 1 1 (fun c w k ->
+            let tag, w1 = V.as_variant w in
+            let o = V.as_obj w1 in
+            if tag = "new" && V.Env.find "settings" o = V.Null
+            then k v
+            else trap cub.at "actor class configuration unsupported in interpreter")))) ])
+  | _ -> assert false
+
+
+let interpret_lib flags scope lib : scope =
+  let env = env_of_scope flags state scope in
+  trace_depth := 0;
+  let vo = ref None in
+  let ve = ref V.Env.empty in
+  Scheduler.queue (fun () ->
+    let import = import_lib env lib in
+    let (imp_decs, decs) = CompUnit.decs_of_lib lib in
+    interpret_block env (imp_decs @ decs) (Some ve) (fun v ->
+      vo := Some (import v))
+  );
+  Scheduler.run ();
+  lib_scope lib.note.filename (Option.get !vo) scope
+
+
+
+ + + diff --git a/coverage/mo_types/arrange_type.ml.html b/coverage/mo_types/arrange_type.ml.html new file mode 100644 index 00000000000..bd379541293 --- /dev/null +++ b/coverage/mo_types/arrange_type.ml.html @@ -0,0 +1,293 @@ + + + + + arrange_type.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+
+
open Type
+open Wasm.Sexpr
+
+let ($$) head inner = Node (head, inner)
+
+let control = function
+  | Returns -> "Returns"
+  | Promises -> "Promises"
+  | Replies -> "Replies"
+
+let obj_sort = function
+  | Object -> Atom "Object"
+  | Actor -> Atom "Actor"
+  | Module -> Atom "Module"
+  | Memory -> Atom "Memory"
+
+let func_sort = function
+  | Local -> "Local"
+  | Shared Write -> "Shared"
+  | Shared Query -> "Shared Query"
+  | Shared Composite -> "Shared Composite"
+
+let prim = function
+  | Null -> Atom "Null"
+  | Bool -> Atom "Bool"
+  | Nat -> Atom "Nat"
+  | Nat8 -> Atom "Nat8"
+  | Nat16 -> Atom "Nat16"
+  | Nat32 -> Atom "Nat32"
+  | Nat64 -> Atom "Nat64"
+  | Int -> Atom "Int"
+  | Int8 -> Atom "Int8"
+  | Int16 -> Atom "Int16"
+  | Int32 -> Atom "Int32"
+  | Int64 -> Atom "Int64"
+  | Float -> Atom "Float"
+  | Char -> Atom "Char"
+  | Text -> Atom "Text"
+  | Blob -> Atom "Blob"
+  | Error -> Atom "Error"
+  | Principal -> Atom "Principal"
+
+let con c = Atom (Type.string_of_con c)
+
+let rec typ = function
+  | Var (s, i)             -> "Var" $$ [Atom s; Atom (string_of_int i)]
+  | Con (c, ts)            -> "Con" $$ (con c::List.map typ ts)
+  | Prim p                 -> "Prim" $$ [prim p]
+  | Obj (s, tfs)           -> "Obj" $$ [obj_sort s] @ List.map typ_field tfs
+  | Array t                -> "Array" $$ [typ t]
+  | Opt t                  -> "Opt" $$ [typ t]
+  | Variant tfs            -> "Variant" $$ List.map typ_field tfs
+  | Tup ts                 -> "Tup" $$ List.map typ ts
+  | Func (s, c, tbs, at, rt) ->
+    "Func" $$ [Atom (func_sort s); Atom (control c)] @
+      List.map typ_bind tbs @ [ "" $$ (List.map typ at); "" $$ (List.map typ rt)]
+  | Async (Fut, t1, t2)    -> "Async" $$ [typ t1; typ t2]
+  | Async (Cmp, t1, t2)    -> "Async*" $$ [typ t1; typ t2]
+  | Mut t                  -> "Mut" $$ [typ t]
+  | Any                    -> Atom "Any"
+  | Non                    -> Atom "Non"
+  | Pre                    -> Atom "Pre"
+  | Typ c                  -> "Typ" $$ [con c]
+
+and typ_bind (tb : Type.bind) =
+  tb.var $$ [typ tb.bound]
+
+and typ_field (tf : Type.field) =
+  tf.lab $$ [typ tf.typ]
+
+
+
+ + + diff --git a/coverage/mo_types/async_cap.ml.html b/coverage/mo_types/async_cap.ml.html new file mode 100644 index 00000000000..765c20c8458 --- /dev/null +++ b/coverage/mo_types/async_cap.ml.html @@ -0,0 +1,80 @@ + + + + + async_cap.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+
+
(* Async capabilities *)
+module T = Type
+
+type async_cap =
+  | QueryCap of T.con  (* can (query) async (i.e. in a shared query func) *)
+  | ErrorCap           (* can try, catch  (i.e. in the async body of shared query func) *)
+  | AsyncCap of T.con  (* can async, send (i.e. in a func of async type or shared func) *)
+  | AwaitCap of T.con  (* can async, send, try, catch, await (i.e. in an async expression *)
+  | NullCap            (* none of the above *)
+  | CompositeCap of T.con (* can (query) async (i.e. in a shared composite query func) *)
+  | CompositeAwaitCap of T.con (* can send a (composite or vanilla) query, try, catch, await (i.e. in a composite query func) *)
+
+let top_cap = Cons.fresh "$top-level" (T.Def([],T.Any))
+
+let initial_cap () = AwaitCap top_cap
+
+
+
+ + + diff --git a/coverage/mo_types/cons.ml.html b/coverage/mo_types/cons.ml.html new file mode 100644 index 00000000000..168b276351c --- /dev/null +++ b/coverage/mo_types/cons.ml.html @@ -0,0 +1,191 @@ + + + + + cons.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+
+
(*
+The kind field is a reference to break the recursion in open_binds,
+and to allow the multiple passes in typing. These go through Type.set_kind
+with additional safeguards.
+
+Besides these two use-cases, the kind should not be mutated, and treated like
+immutable data.
+
+This module interface guarantees that constructors with the same stamp have the
+same ref.
+*)
+
+type 'a con = {name : string; stamp : int; kind : 'a ref}
+type 'a t = 'a con
+
+module Stamps = Env.Make(String)
+
+let stamps : int Stamps.t ref = ref Stamps.empty
+
+let session f =
+  let original = !stamps in
+  try let result = f () in
+       stamps := original;
+       result
+  with e -> begin
+     stamps := original;
+     raise e
+  end
+
+let fresh_stamp name =
+  let n = Lib.Option.get (Stamps.find_opt name !stamps) 0 in
+  stamps := Stamps.add name (n + 1) !stamps;
+  n
+
+let fresh name k = {name; stamp = fresh_stamp name; kind = ref k}
+let clone c k = {c with stamp = fresh_stamp c.name; kind = ref k}
+
+let kind c = !(c.kind)
+let unsafe_set_kind c k = c.kind := k
+
+let name c = c.name
+
+let to_string show_stamps sep c =
+  if not show_stamps || c.stamp = 0 then c.name else Printf.sprintf "%s%s%i" c.name sep c.stamp
+
+let eq c1 c2 = c1.stamp = c2.stamp && c1.name = c2.name
+
+let compare c1 c2 =
+  match Int.compare c1.stamp c2.stamp with
+  | 0 -> String.compare c1.name c2.name
+  | ord -> ord
+
+
+
+ + + diff --git a/coverage/mo_types/expansive.ml.html b/coverage/mo_types/expansive.ml.html new file mode 100644 index 00000000000..c6eb2eba989 --- /dev/null +++ b/coverage/mo_types/expansive.ml.html @@ -0,0 +1,679 @@ + + + + + expansive.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+
+
open Type
+
+(*
+
+  Check the non-expansiveness criterion identified first by Viroli and
+  adopted by Pierce and Kennedy [1] to ensure termination of sub-typing
+  in *nominal* type systems with generics and subtyping.
+
+  Given a set of mutually recursive type definitions, construct a graph
+  whose vertices are the formal parameters (identified by position),
+  `C#i`, and two sorts of labeled edges:
+
+  * an occurrence of parameter `C#i` as immediate `j`-th argument to
+    type `D<..,C#i,..>`, adds a (non-expansive) 0-labeled edge `C#i -0->D#j`.
+
+  * an occurrence of parameter `C#i` as a proper sub-term of the `j`-th
+    argument to type `D<...,T[C#i],..>` adds an (expansive) 1-labeled
+    edge `C#i -1-> D#j`.
+
+  The graph is expansive iff it contains a cycle with at least one
+  expansive edge.
+
+  Non-expansiveness (hopefully) ensures that the set of types
+  encountered during sub-typing, and added to the visited set, is
+  finite. In nominal systems, a visited set is used to reject a
+  cyclic sub-type check, but in our co-inductive setting, it is used
+  to succeed a cyclic check. In either case, it is used to terminate the
+  procedure, which is what we care about.
+
+  To detect the existence of a cycle, we construct the plain graph
+  obtained by deleting labels (possibly identifying edges), compute
+  its strongly connected components (sccs), and then check whether
+  there is a 1-weighted edge (in the original graph) connecting any
+  two vertices of the *same* component of the sccs.
+
+  [1] Andrew Kennedy Benjamin C. Pierce
+  International Workshop on Foundations and Developments of Object-Oriented Languages (FOOL/WOOD),
+  January 2007
+
+  https://www.microsoft.com/en-us/research/publication/on-decidability-of-nominal-subtyping-with-variance/
+
+*)
+
+let debug = false (* set to 1 to show graph in error message *)
+
+(* Collecting type constructors *)
+
+module Vertex = struct
+  type t = Type.con * int
+  let compare (c,i) (d,j) =
+  match Cons.compare c d with
+  | 0 -> compare i j
+  | n -> n
+end
+
+module Edge = struct
+  type t = Vertex.t * int * Vertex.t
+  let compare (c1, w1, d1) (c2, w2, d2) =
+  match Vertex.compare c1 c2 with
+  | 0 ->
+    begin
+      match compare w1 w2 with
+      | 0 -> Vertex.compare d1 d2
+      | n -> n
+    end
+  | n -> n
+end
+
+module VertexSet = Set.Make(Vertex)
+
+module EdgeSet = Set.Make(Edge)
+
+let string_of_vertex (c, i) = Printf.sprintf "(%s,%i)" (Cons.name c) i
+
+let string_of_vertices vs =
+  Printf.sprintf "{ %s }" (String.concat "," (List.map string_of_vertex (VertexSet.elements vs)))
+
+let string_of_edge (ci,w,dj) =
+  Printf.sprintf ("%s -%i-> %s") (string_of_vertex ci) w (string_of_vertex dj)
+
+let string_of_edges es =
+  Printf.sprintf "{ %s }" (String.concat "," (List.map string_of_edge (EdgeSet.elements es)))
+
+let edges_typ cs c (es : EdgeSet.t) t : EdgeSet.t =
+  let rec go_typs i exp non es ts =
+    List.fold_left (go_typ i exp non) es ts
+  and go_typ i exp non es = function
+    | Var (s, j) when j >= i  ->
+      let ci = (c, j - i) in
+      let es1 = VertexSet.fold (fun dj es -> EdgeSet.add (ci, 1, dj) es) exp es in
+      let es2 = VertexSet.fold (fun dj es -> EdgeSet.add (ci, 0, dj) es) non es1 in
+      es2
+    | Var (s, j) ->
+      assert (j < i);
+      es
+    | (Prim _ | Any | Non | Pre ) -> es
+    | Con (d, ts) when ConSet.mem d cs ->
+      let exp1 = VertexSet.union exp non in
+      let _, es = List.fold_left
+        (fun (k, es) t ->
+          (k + 1,
+           go_typ i exp1 (VertexSet.singleton (d, k)) es t))
+        (0, es)
+        ts
+      in
+      es
+    | Con (_, ts) (* Cons from outer scopes are assumed to be non-expansive *)
+    | Tup ts ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es ts
+    | (Opt t1 | Mut t1 | Array t1) ->
+      go_typ i (VertexSet.union exp non) VertexSet.empty es t1
+    | Async (s, t1, t2) ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es [t1;t2]
+    | Func (s, _c, tbs, ts1, ts2) ->
+      let i1 = i + List.length tbs in
+      let exp1 = VertexSet.union exp non in
+      let es1 = go_typs i1 exp1 VertexSet.empty es
+        (List.map (fun tb -> tb.bound) tbs)
+      in
+      let es2 = go_typs i1 exp1 VertexSet.empty es1 ts1
+      in
+      go_typs i1 exp1 VertexSet.empty es2 ts2
+    | (Obj (_, fs) | Variant fs) ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es
+        (List.map (fun f -> f.typ) fs)
+    | Typ c ->
+      (* Since constructors must be closed, no further edges possible *)
+      es
+  in
+  go_typ 0 VertexSet.empty VertexSet.empty es t
+
+let edges_con cs c es : EdgeSet.t =
+  match Cons.kind c with
+  | Def (tbs, t) ->
+    (* It's not clear we actually need to consider parameters bounds, since, unlike
+       function type parameters, they don't introduce new subgoals during subtyping.
+       But let's be conservative and consider them, until we find out that that's undesirable
+       and know its safe to ignore them here. *)
+    let es1 = List.fold_left (fun es tb ->
+      edges_typ cs c es tb.bound) es tbs
+    in
+    edges_typ cs c es1 t
+  | Abs (tbs, t) ->
+    assert false
+
+let edges cs = ConSet.fold (edges_con cs) cs EdgeSet.empty
+
+let vertices cs =
+  ConSet.fold
+    (fun c vs ->
+      match Cons.kind c with
+      | Def (tbs, t) ->
+        let ws = List.mapi (fun i _tb -> (c, i)) tbs in
+        List.fold_left (fun vs v -> VertexSet.add v vs) vs ws
+      | Abs (tbs, t) ->
+        assert false) cs VertexSet.empty
+
+module VertexMap = Map.Make(Vertex)
+
+module Scc = Scc.Make(Vertex)
+
+let string_of_sccs sccs =
+  Printf.sprintf "{ %s }" (String.concat ","
+   (List.map string_of_vertices sccs))
+
+module Pretty = MakePretty(ElideStamps)
+
+let is_expansive cs =
+  (* Collect vertices and labeled edges *)
+  let vs = vertices cs in
+  let es = edges cs in
+  (* Compute the strongly connected components (ignoring edge labels) *)
+  let unlabeled_es = EdgeSet.fold
+    (fun (ci, w, dj) -> Scc.EdgeSet.add (ci, dj)) es Scc.EdgeSet.empty
+  in
+  let vss = Scc.scc vs unlabeled_es in
+
+  (* Map each vertex to the number of its component *)
+  let component = List.fold_left (fun m (vs, i) ->
+    VertexSet.fold (fun v m -> VertexMap.add v i m) vs m)
+    VertexMap.empty (List.mapi (fun i vs -> (vs, i)) vss)
+  in
+
+  (* The constructor are expansive if some component (cycle) contains
+     an edge with non-zero weight *)
+  let e_opt = List.find_opt
+    (fun (ci, w, dj) ->
+      w > 0 && VertexMap.find ci component = VertexMap.find dj component)
+    (EdgeSet.elements es)
+  in
+  match e_opt with
+  | None -> None
+  | Some ((c,i), _, (d,j)) ->
+    (* Construct an error messages with optional debug info *)
+    let op, sbs, st = Pretty.strings_of_kind (Cons.kind c) in
+    let def = Printf.sprintf "type %s%s %s %s" (Cons.name c) sbs op st in
+    let x = match Cons.kind c with Def(tbs, _) | Abs(tbs, _) ->
+      (List.nth tbs i).var in
+    let dys = match Cons.kind d with Def(tbs, _) | Abs(tbs, _) ->
+      Printf.sprintf "%s<%s>" (Cons.name d)
+        (String.concat "," (List.mapi (fun k _ ->
+          if i = k then "-" ^ x ^"-" else "_") tbs))
+    in
+    Some (Printf.sprintf
+      ":\n  %s\nis expansive, because %s occurs as an indirect argument of recursive type %s.\n(%s would be allowed as an immediate argument, but cannot be part of a larger type expression.)%s"
+      def x dys x
+      (if debug then
+         Printf.sprintf
+           "\n  vertices:\n    %s\n  edges:\n    %s\n  components:\n    %s"
+           (string_of_vertices vs) (string_of_edges es) (string_of_sccs vss)
+       else ""))
+
+
+
+ + + diff --git a/coverage/mo_types/hash.ml.html b/coverage/mo_types/hash.ml.html new file mode 100644 index 00000000000..c93f60932f0 --- /dev/null +++ b/coverage/mo_types/hash.ml.html @@ -0,0 +1,71 @@ + + + + + hash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
+
(*
+We hash field names using the following hash function,
+which results in values [0..2^31-1]
+*)
+
+let hash : string -> int32 = fun s ->
+  let open Int32 in
+  let sum = ref zero in
+  for i = 0 to String.length s - 1 do
+    sum := add (mul (!sum) (of_int 223)) (of_int (Char.code (s.[i])))
+  done;
+  logand (shift_right_logical minus_one 1) (!sum)
+
+
+
+ + + diff --git a/coverage/mo_types/productive.ml.html b/coverage/mo_types/productive.ml.html new file mode 100644 index 00000000000..a601fdf1f09 --- /dev/null +++ b/coverage/mo_types/productive.ml.html @@ -0,0 +1,240 @@ + + + + + productive.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+
+
open Type
+
+(*
+  Maintain a map from con to info = {Nonproductive, Productive, Param n}`.
+  After the analysis, this map says, for all type constructors, whether they are  really unproductive, productive, or if their unfolding is equal to one of their parameters.
+* Maintain a set of type definitions under scrutiny
+* For each type definition:
+  * If it is already in the memo map, use that result. Else analyze it as follows, updating the memo map afterwards.
+  * If it is already in the set, we have found a loop. Mark it as `unproductive`. Else add to the setduring the next step.
+  * Consider its RHS:
+    * If it is a concrete type, return `Productive`.
+    * If it is the nth type parameter, return `Param n`
+    * If it is a type application `T<t1,…,tn>`, recurse.
+      * If recursion returns `Productive` or `Nonproductive`, return that.
+      * If recursion returns `Param n`, loop to “Consider its RHS”, as if `tn`
+        is the RHS.
+*)
+
+type info =
+  | Nonproductive
+  | Productive
+  | Param of int
+
+let non_productive cs =
+  let map = ref ConEnv.empty in
+  let rec rhs cs = function
+    | Pre
+    | Mut _ | Typ _ ->
+      assert false (* body of a Def shouldn't be 2nd class *)
+    | Var (s, j) ->
+      Param j
+    | Con (d, ts) ->
+      begin
+        visit_con cs d;
+        match ConEnv.find d (!map) with
+        | Param n ->
+          begin
+          match Cons.kind d with
+          | Def (tbs, t) ->
+            assert (n < List.length tbs); (* assume types are arity-correct *)
+            rhs cs (List.nth ts n)
+          | Abs (tbs, t) ->
+            (* we could assert here since Defs should be closed *)
+            Productive
+          end
+        | info -> info
+      end
+    | _ ->  (* anything else is productive *)
+      Productive
+
+  and visit_con cs c =
+    match ConEnv.find_opt c (!map) with
+    | Some info -> ()
+    | None ->
+      let info =
+        if ConSet.mem c cs then
+          Nonproductive
+        else
+          let t = match Cons.kind c with
+            | Def (_, t) -> t
+            | _ -> assert false
+          in
+          rhs (ConSet.add c cs) t
+      in
+      map := ConEnv.add c info !map
+  in
+  ConSet.iter (visit_con ConSet.empty) cs;
+  ConSet.filter (fun c -> ConEnv.find c !map = Nonproductive) cs
+
+
+
+ + + diff --git a/coverage/mo_types/scope.ml.html b/coverage/mo_types/scope.ml.html new file mode 100644 index 00000000000..0901c1a2c56 --- /dev/null +++ b/coverage/mo_types/scope.ml.html @@ -0,0 +1,155 @@ + + + + + scope.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
+
module T = Type
+
+(* Scopes *)
+
+type val_env = T.typ T.Env.t
+type lib_env = T.typ T.Env.t
+type typ_env = T.con T.Env.t
+type con_env = T.ConSet.t
+
+type obj_env = scope T.Env.t  (* internal object scopes *)
+
+and scope =
+  { val_env : val_env;
+    lib_env : lib_env;
+    typ_env : typ_env;
+    con_env : con_env;
+    obj_env : obj_env;
+  }
+and t = scope
+
+let empty : scope =
+  { val_env = T.Env.empty;
+    lib_env = T.Env.empty;
+    typ_env = T.Env.empty;
+    con_env = T.ConSet.empty;
+    obj_env = T.Env.empty;
+  }
+
+let adjoin scope1 scope2 =
+  { val_env = T.Env.adjoin scope1.val_env scope2.val_env;
+    lib_env = T.Env.adjoin scope1.lib_env scope2.lib_env;
+    typ_env = T.Env.adjoin scope1.typ_env scope2.typ_env;
+    con_env = T.ConSet.union scope1.con_env scope2.con_env;
+    obj_env = T.Env.adjoin scope1.obj_env scope2.obj_env;
+  }
+
+let adjoin_val_env scope ve = {scope with val_env = T.Env.adjoin scope.val_env ve}
+
+let lib f t =
+  { empty with lib_env = T.Env.add f t empty.lib_env }
+
+
+
+ + + diff --git a/coverage/mo_types/typ_hash.ml.html b/coverage/mo_types/typ_hash.ml.html new file mode 100644 index 00000000000..bf3ea753a6a --- /dev/null +++ b/coverage/mo_types/typ_hash.ml.html @@ -0,0 +1,625 @@ + + + + + typ_hash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+
+
open ExpGraph
+open Type
+
+(*
+This module exports a function
+
+  typ_hash : typ -> string
+
+with these properties
+ - Its domain are closed types
+ - It does not support abstract types (for now)
+ - It does not support type parameters (for now)
+ - Type.eq t1 t2 = (typ_hash t1 = typ_hash t2)
+ - The output is readable yet compact
+
+
+The output format does not matter hugely (equality is what counts), but here is
+a little reading advice:
+
+ * Nullary types are described a single letter, or few letters:
+
+     Nat: N
+     Int8: i8
+     (): u
+
+ * Unary type constructors just prefix their type argument
+
+     ?Nat: ?N
+     [Blob]: vB
+     [Mut Text]: Vt
+
+ * Tuples put parentheses around the component types, without separator:
+
+     (Int, ?Bool, Text) = (I?bt)
+
+ * Objects and variants have comma-separated lists of label-type-pairs:
+
+     {foo : Int; var bar : Text} = r(foo:I,bar!:t)
+     {#tag : Int} = v(tag:I)
+
+   The various object forms are indicated after the r:
+
+     module {foo : Int; var bar : Text} = rm(foo:I,bar!:t)
+
+ * Functions:
+
+     shared (Int, Bool) -> Text = Fs(Ib)(t)
+
+ * Types that occur more than once are prefixed with a number when seen first,
+   and later referenced by that number:
+
+     ([mut Int]) -> ([mut Int]) = F(1=VI)(!1)
+
+     type List = ?(Nat,List)
+     (List, ?List) = (1=?(N!1)?!1)
+
+     type List<A> = ?(Nat,List<A>)
+     List<N> = 1=?(N!1)
+
+For this encoding to be injective, it must be prefix free, i.e.
+
+  ∀ t1 t2 s. typ_hash t1 = (typ_hash t2 ^ s) ⟹ eq t1 t2 = true
+
+*)
+
+(* A hint about how to print the node *)
+type arity = Nullary | Unary | Nary | Labeled of string list | TwoSeq of int
+
+(*
+Type construtors are (mostly) described by a single letter.
+NB: This code better be prefix-free. Hence capital N, otherwise n8=u
+is a bit ambigous
+*)
+
+let prim = function
+  | Null -> "z"
+  | Bool -> "b"
+  | Nat -> "N"
+  | Nat8 -> "n8"
+  | Nat16 -> "n16"
+  | Nat32 -> "n32"
+  | Nat64 -> "n64"
+  | Int -> "I"
+  | Int8 -> "i8"
+  | Int16 -> "i16"
+  | Int32 -> "i32"
+  | Int64 -> "i64"
+  | Float -> "f"
+  | Char -> "c"
+  | Text -> "t"
+  | Blob -> "B"
+  | Error -> "E"
+  | Principal -> "P"
+
+let rec go = function
+  | Prim p -> ((Nullary, prim p), [])
+  | Any -> ((Nullary, "a"), [])
+  | Non -> ((Nullary, "e"), []) (* e for empty *)
+  | Opt t -> ((Unary, "?"), [t])
+  | Tup [] -> ((Nullary, "u"), [])
+  | Tup ts -> ((Nary, ""), ts)
+  | Array (Mut t) -> ((Unary, "V"), [t])
+  | Array t -> ((Unary, "v"), [t])
+
+  (* Here we pretend we support first-class mutable values;
+     this is useful for stable serialization *)
+  | Mut t -> ((Unary, "M"), [t])
+
+  | Obj (s, fs) ->
+    ( ( Labeled (List.map (fun f -> f.lab ^ if is_mut f.typ then "!" else "") fs),
+        (match s with Object -> "r" | Module -> "rm" | Memory -> "rs" | Actor -> "ra")
+      )
+    , List.map (fun f -> as_immut f.typ) fs
+    )
+  | Variant fs ->
+    ( ( Labeled (List.map (fun f -> f.lab) fs),
+        "v"
+      )
+    , List.map (fun f -> f.typ) fs
+    )
+
+  | Func (s, c, tbs, ts1, ts2) ->
+    List.iter (fun bind -> assert (bind.sort = Scope)) tbs;
+    ( ( TwoSeq (List.length ts1),
+        "F" ^
+        (match s with Local -> "" | Shared Query -> "q" | Shared Write -> "s" | Shared Composite -> "C") ^
+        (match c with Returns -> "" | Promises -> "p" | Replies -> "r")
+      )
+    , ts1 @ ts2
+    )
+  | Async _ -> raise (Invalid_argument "typ_hash: Only supports serializable data")
+
+  | Con _ as t -> go (normalize t)
+  | Pre -> assert false
+  | Var _ -> assert false
+  | Typ _ -> assert false
+
+let paren xs = "(" ^ String.concat "" xs ^ ")"
+
+let of_con (a, k) args =
+  match a, args with
+  | Nullary, _ ->
+    assert (args = []);
+    k
+  | Unary, [a] ->
+    k ^ a
+  | Unary, _ ->
+    assert false
+  | Nary, _ ->
+    k ^ paren args
+  | Labeled ls, _ ->
+    k ^ "(" ^ String.concat "," (List.map2 (fun l a -> l ^ ":" ^ a) ls args) ^ ")"
+  | TwoSeq n, _->
+    let (a1, a2) = Lib.List.split_at n args in
+    k ^ paren a1 ^ paren a2
+
+let of_ref i x =
+  Int.to_string i ^ "=" ^ x
+
+let of_def i =
+  "!" ^ Int.to_string i
+
+let typ_hash : typ -> string =
+  fun t -> t |> unfold go |> canonicalize |> fold of_con of_ref of_def
+
+let typ_seq_hash : typ list -> string = fun ts ->
+  String.concat "" (List.map typ_hash ts)
+
+
+(* Some small unit tests *)
+
+[@@@warning "-32"]
+let test t expected =
+  let actual = typ_hash t in
+  if actual = expected then
+    true
+  else
+    (Printf.printf "\nExpected:\n  %s\nbut got:\n  %s\n" expected actual; false)
+
+let%test "monolist" =
+  let con = Cons.fresh "List" (Abs ([], Pre))  in
+  let t = Con (con, []) in
+  Cons.unsafe_set_kind con (Def ([], Opt (Tup [nat; t])));
+  test t "0=?(N!0)"
+
+let%test "polylist" =
+  let con = Cons.fresh "List" (Abs ([], Pre))  in
+  let bind = { var = "T"; sort = Type; bound = Any } in
+  let v = Var ("T", 0) in
+  Cons.unsafe_set_kind con (Def ([bind], Opt (Tup [v; Con (con, [v])])));
+  let t = Con (con, [nat]) in
+  test t "0=?(N!0)"
+
+
+
+ + + diff --git a/coverage/mo_types/type.ml.html b/coverage/mo_types/type.ml.html new file mode 100644 index 00000000000..64f1697b961 --- /dev/null +++ b/coverage/mo_types/type.ml.html @@ -0,0 +1,5681 @@ + + + + + type.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+
+
(* Representation *)
+type lab = string
+type var = string
+
+type control =
+  | Returns        (* regular local function or one-shot shared function *)
+  | Promises       (* shared function producing a future value upon call *)
+  | Replies        (* (IR only): responds asynchronously using `reply` *)
+
+type obj_sort =
+   Object
+ | Actor
+ | Module
+ | Memory          (* (codegen only): stable memory serialization format *)
+
+type async_sort = Fut | Cmp
+type shared_sort = Query | Write | Composite
+type 'a shared = Local | Shared of 'a
+type func_sort = shared_sort shared
+type eff = Triv | Await
+
+type prim =
+  | Null
+  | Bool
+  | Nat
+  | Nat8
+  | Nat16
+  | Nat32
+  | Nat64
+  | Int
+  | Int8
+  | Int16
+  | Int32
+  | Int64
+  | Float
+  | Char
+  | Text
+  | Blob (* IR use: Packed representation, vec u8 IDL type *)
+  | Error
+  | Principal
+
+type t = typ
+and typ =
+  | Var of var * int                          (* variable *)
+  | Con of con * typ list                     (* constructor *)
+  | Prim of prim                              (* primitive *)
+  | Obj of obj_sort * field list              (* object *)
+  | Variant of field list                     (* variant *)
+  | Array of typ                              (* array *)
+  | Opt of typ                                (* option *)
+  | Tup of typ list                           (* tuple *)
+  | Func of func_sort * control * bind list * typ list * typ list  (* function *)
+  | Async of async_sort * scope * typ                      (* future *)
+  | Mut of typ                                (* mutable type *)
+  | Any                                       (* top *)
+  | Non                                       (* bottom *)
+  | Typ of con                                (* type (field of module) *)
+  | Pre                                       (* pre-type *)
+
+and scope = typ
+and bind_sort = Scope | Type
+
+and bind = {var : var; sort: bind_sort; bound : typ}
+and field = {lab : lab; typ : typ; depr : string option}
+
+and con = kind Cons.t
+and kind =
+  | Def of bind list * typ
+  | Abs of bind list * typ
+
+(* Efficient comparison *)
+let tag_prim = function
+  | Null -> 0
+  | Bool -> 1
+  | Nat -> 2
+  | Nat8 -> 3
+  | Nat16 -> 4
+  | Nat32 -> 5
+  | Nat64 -> 6
+  | Int -> 7
+  | Int8 -> 8
+  | Int16 -> 9
+  | Int32 -> 10
+  | Int64 -> 11
+  | Float -> 12
+  | Char -> 13
+  | Text -> 14
+  | Blob -> 15
+  | Error -> 16
+  | Principal -> 17
+
+let tag_func_sort = function
+  | Local -> 0
+  | Shared Write -> 1
+  | Shared Query -> 2
+  | Shared Composite -> 3
+
+let tag_obj_sort = function
+  | Object -> 0
+  | Module -> 1
+  | Actor -> 2
+  | Memory -> 3
+
+let tag_control = function
+  | Returns -> 0
+  | Promises -> 1
+  | Replies -> 2
+
+let tag = function
+  | Prim _ -> 0
+  | Var _ -> 1
+  | Con _ -> 2
+  | Array _ -> 3
+  | Tup _ -> 4
+  | Func _ -> 5
+  | Opt _ -> 6
+  | Async _ -> 7
+  | Obj _ -> 8
+  | Variant _ -> 9
+  | Mut _ -> 10
+  | Any -> 11
+  | Non -> 12
+  | Pre -> 13
+  | Typ _ -> 14
+
+let compare_prim p1 p2 =
+  let d = tag_prim p1 - tag_prim p2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_control c1 c2 =
+  let d = tag_control c1 - tag_control c2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_async_sort s1 s2 =
+  match s1, s2 with
+  | Fut, Fut
+  | Cmp, Cmp -> 0
+  | Fut, Cmp -> -1
+  | Cmp, Fut -> 1
+
+let compare_obj_sort s1 s2 =
+  let d = tag_obj_sort s1 - tag_obj_sort s2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_func_sort s1 s2 =
+  let d = tag_func_sort s1 - tag_func_sort s2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_bind_sort s1 s2 =
+  match s1, s2 with
+  | Type, Type
+  | Scope, Scope -> 0
+  | Type, Scope -> -1
+  | Scope, Type -> 1
+
+let compare_depr d1 d2 =
+  match (d1, d2) with
+  | None, None -> 0
+  | Some s1, Some s2 -> String.compare s1 s2
+  | None, Some _ -> -1
+  | _ -> 1
+
+let rec compare_typ (t1 : typ) (t2 : typ) =
+  if t1 == t2 then 0
+  else match (t1, t2) with
+  | Prim p1, Prim p2 ->
+    compare_prim p1 p2
+  | Var (s1, i1), Var (s2, i2) ->
+    (match Int.compare i1 i2 with
+     | 0 -> String.compare s1 s2
+     | ord -> ord)
+  | Con (c1, ts1), Con (c2, ts2) ->
+    (match Cons.compare c1 c2 with
+     | 0 -> compare_typs ts1 ts2
+     | ord -> ord)
+  | Array t1, Array t2 ->
+    compare_typ t1 t2
+  | Tup ts1, Tup ts2 ->
+    compare_typs ts1 ts2
+  | Func (s1, c1, tbs1, ts11, ts12),
+    Func (s2, c2, tbs2, ts21, ts22) ->
+    (match compare_func_sort s1 s2 with
+     | 0 ->
+       (match compare_control c1 c2 with
+        | 0 ->
+          (match compare_tbs tbs1 tbs2 with
+           | 0 ->
+             (match compare_typs ts11 ts21 with
+             | 0 -> compare_typs ts12 ts22
+             | ord -> ord)
+           | ord -> ord)
+        | ord -> ord)
+     | ord -> ord)
+  | Opt t1, Opt t2 -> compare_typ t1 t2
+  | Async (s1, t11, t12) , Async (s2, t21, t22) ->
+    (match compare_async_sort s1 s2 with
+     | 0 -> (match compare_typ t11 t21 with
+             | 0 -> compare_typ t12 t22
+             | ord -> ord)
+     | ord -> ord)
+  | Obj (s1, fs1), Obj (s2, fs2) ->
+    (match compare_obj_sort s1 s2 with
+     | 0 -> compare_flds fs1 fs2
+     | ord -> ord)
+  | Variant fs1, Variant fs2 ->
+    compare_flds fs1 fs2
+  | Mut t1, Mut t2 ->
+    compare_typ t1 t2
+  | Any, Any
+  | Non, Non
+  | Pre, Pre -> 0
+  | Typ c1, Typ c2 -> Cons.compare c1 c2
+  | _ -> Int.compare (tag t1) (tag t2)
+
+and compare_tb tb1 tb2 =
+  match String.compare tb1.var tb2.var with
+  | 0 ->
+    (match compare_typ tb1.bound tb2.bound with
+     | 0 -> compare_bind_sort tb1.sort tb2.sort
+     | ord -> ord)
+  | ord ->  ord
+
+and compare_tbs tbs1 tbs2 =
+  match (tbs1, tbs2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (_::_, []) -> 1
+  | (tb1::tbs1, tb2 :: tbs2) ->
+    (match compare_tb tb1 tb2 with
+     | 0 -> compare_tbs tbs1 tbs2
+     | ord -> ord)
+
+and compare_fld fld1 fld2 =
+  match String.compare fld1.lab fld2.lab with
+  | 0 ->
+    (match compare_typ fld1.typ fld2.typ with
+     | 0 -> compare_depr fld1.depr fld2.depr
+     | ord -> ord)
+  | ord -> ord
+
+and compare_flds flds1 flds2 =
+  match (flds1, flds2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (_::_, []) -> 1
+  | (fld1::flds1, fld2 :: flds2) ->
+    (match compare_fld fld1 fld2 with
+     | 0 -> compare_flds flds1 flds2
+     | ord -> ord)
+
+and compare_typs ts1 ts2 =
+  match (ts1, ts2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (t1::ts1, t2 :: ts2) ->
+    (match compare_typ t1 t2 with
+     | 0 -> compare_typs ts1 ts2
+     | ord -> ord)
+  | _ -> 1
+
+
+let compare_rel (t1, t2) (u1, u2) =
+  match compare_typ (t1 : typ) (u1 : typ) with
+  | 0 -> compare_typ (t2 : typ) (u2 : typ)
+  | ord -> ord
+
+(* Syntactic orderings *)
+
+module Ord = struct
+  type t = typ
+  let compare = compare_typ
+end
+
+module OrdPair = struct
+  type t = typ * typ
+  let compare = compare_rel
+end
+
+(* Function sorts *)
+
+let is_shared_sort sort = sort <> Local
+
+(* Constructors *)
+
+let set_kind c k =
+  match Cons.kind c with
+  | Abs (_, Pre) -> Cons.unsafe_set_kind c k
+  | _ -> raise (Invalid_argument "set_kind")
+
+module ConEnv = Env.Make(struct type t = con let compare = Cons.compare end)
+
+module ConSet = ConEnv.Dom
+
+
+(* Field ordering *)
+
+let compare_field f1 f2 =
+  match f1,f2 with
+  | {lab = l1; typ = Typ _; _}, {lab = l2; typ = Typ _; _} -> compare l1 l2
+  | {lab = l1; typ = Typ _; _}, {lab = l2; typ = _; _} -> -1
+  | {lab = l1; typ = _; _}, {lab = l2; typ = Typ _; _} -> 1
+  | {lab = l1; typ = _; _}, {lab = l2; typ = _; _} -> compare l1 l2
+
+
+(* Short-hands *)
+
+let unit = Tup []
+let bool = Prim Bool
+let nat = Prim Nat
+let nat64 = Prim Nat64
+let int = Prim Int
+let text = Prim Text
+let blob = Prim Blob
+let error = Prim Error
+let char = Prim Char
+let principal = Prim Principal
+
+let fields flds =
+  List.sort compare_field
+    (List.map (fun (lab, typ) -> {lab; typ; depr = None}) flds)
+
+let obj sort flds =
+  Obj (sort, fields flds)
+
+let sum flds =
+  Variant (fields flds)
+
+let throwErrorCodes = List.sort compare_field [
+  { lab = "canister_reject"; typ = unit; depr = None}
+]
+
+let call_error = Obj(Object,[{ lab = "err_code"; typ = Prim Nat32; depr = None }])
+
+let catchErrorCodes = List.sort compare_field (
+  throwErrorCodes @ [
+    { lab = "system_fatal"; typ = unit; depr = None};
+    { lab = "system_transient"; typ = unit; depr = None};
+    { lab = "destination_invalid"; typ = unit; depr = None};
+    { lab = "canister_error"; typ = unit; depr = None};
+    { lab = "future"; typ = Prim Nat32; depr = None};
+    { lab = "call_error"; typ = call_error; depr = None};
+  ])
+
+let throw = Prim Error
+let catch = Prim Error
+
+(* Shared call context *)
+
+let caller = principal
+let ctxt = Obj (Object,[{ lab = "caller"; typ = caller; depr = None}])
+
+let prim = function
+  | "Null" -> Null
+  | "Bool" -> Bool
+  | "Nat" -> Nat
+  | "Nat8" -> Nat8
+  | "Nat16" -> Nat16
+  | "Nat32" -> Nat32
+  | "Nat64" -> Nat64
+  | "Int" -> Int
+  | "Int8" -> Int8
+  | "Int16" -> Int16
+  | "Int32" -> Int32
+  | "Int64" -> Int64
+  | "Float" -> Float
+  | "Char" -> Char
+  | "Text" -> Text
+  | "Blob" -> Blob
+  | "Error" -> Error
+  | "Principal" -> Principal
+  | s -> raise (Invalid_argument ("Type.prim: " ^ s))
+
+let seq = function [t] -> t | ts -> Tup ts
+
+let codom c to_scope ts2 =  match c with
+  | Promises -> Async (Fut, to_scope(), seq ts2)
+  | Returns -> seq ts2
+  | Replies -> Tup []
+
+(* Coercions *)
+
+let iter_obj t =
+  Obj (Object,
+    [{lab = "next"; typ = Func (Local, Returns, [], [], [Opt t]); depr = None}])
+
+
+(* Shifting *)
+
+let rec shift i n t =
+  match t with
+  | Prim _ -> t
+  | Var (s, j) -> Var (s, if j < i then j else j + n)
+  | Con (c, ts) -> Con (c, List.map (shift i n) ts)
+  | Array t -> Array (shift i n t)
+  | Tup ts -> Tup (List.map (shift i n) ts)
+  | Func (s, c, tbs, ts1, ts2) ->
+    let i' = i + List.length tbs in
+    Func (s, c, List.map (shift_bind i' n) tbs, List.map (shift i' n) ts1, List.map (shift i' n) ts2)
+  | Opt t -> Opt (shift i n t)
+  | Async (s, t1, t2) -> Async (s, shift i n t1, shift i n t2)
+  | Obj (s, fs) -> Obj (s, List.map (shift_field n i) fs)
+  | Variant fs -> Variant (List.map (shift_field n i) fs)
+  | Mut t -> Mut (shift i n t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c
+
+and shift_bind i n tb =
+  {tb with bound = shift i n tb.bound}
+
+and shift_field i n {lab; typ; depr} =
+  {lab; typ = shift i n typ; depr}
+
+(*
+and shift_kind i n k =
+  match k with
+  | Def (tbs, t) ->
+    let i' = i + List.length tbs in
+    Def (List.map (shift_bind i' n) tbs, shift i' n t)
+  | Abs (tbs, t) ->
+    let i' = i + List.length tbs in
+    Abs (List.map (shift_bind i' n) tbs, shift i' n t)
+ *)
+
+
+(* First-order substitution *)
+
+let rec subst sigma t =
+  if sigma = ConEnv.empty then t else
+  match t with
+  | Prim _
+  | Var _ -> t
+  | Con (c, ts) ->
+    (match ConEnv.find_opt c sigma with
+    | Some t -> assert (List.length ts = 0); t
+    | None -> Con (c, List.map (subst sigma) ts)
+    )
+  | Array t -> Array (subst sigma t)
+  | Tup ts -> Tup (List.map (subst sigma) ts)
+  | Func (s, c, tbs, ts1, ts2) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Func (s, c, List.map (subst_bind sigma') tbs,
+          List.map (subst sigma') ts1, List.map (subst sigma') ts2)
+  | Opt t -> Opt (subst sigma t)
+  | Async (s, t1, t2) -> Async (s, subst sigma t1, subst sigma t2)
+  | Obj (s, fs) -> Obj (s, List.map (subst_field sigma) fs)
+  | Variant fs -> Variant (List.map (subst_field sigma) fs)
+  | Mut t -> Mut (subst sigma t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c (* NB: this is incorrect unless we ensure dom(sigma) \cap FV(c.kind) = {}
+                      For now, we could do this by ensuring all type definitions are closed,
+                      in particular, type components defined within the scope of an enclosing
+                      type parameter cannot mention that parameter
+                      (but can mention other (closed) type constructors).
+                    *)
+
+and subst_bind sigma tb =
+  { tb with bound = subst sigma tb.bound}
+
+and subst_field sigma {lab; typ; depr} =
+  {lab; typ = subst sigma typ; depr}
+
+(*
+and subst_kind sigma k =
+  match k with
+  | Def (tbs, t) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Def (List.map (subst_bind sigma') tbs, subst sigma' t)
+  | Abs (tbs, t) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Abs (List.map (subst_bind sigma') tbs, subst sigma' t)
+ *)
+
+(* Handling binders *)
+
+let close cs t =
+  if cs = [] then t else
+  let ts = List.mapi (fun i c -> Var (Cons.name c, i)) cs in
+  let sigma = List.fold_right2 ConEnv.add cs ts ConEnv.empty in
+  subst sigma t
+
+let close_binds cs tbs =
+  if cs = [] then tbs else
+  List.map (fun tb -> { tb with bound = close cs tb.bound })  tbs
+
+
+let rec open' i ts t =
+  match t with
+  | Prim _ -> t
+  | Var (_, j) -> if j < i then t else List.nth ts (j - i)
+  | Con (c, ts') -> Con (c, List.map (open' i ts) ts')
+  | Array t -> Array (open' i ts t)
+  | Tup ts' -> Tup (List.map (open' i ts) ts')
+  | Func (s, c, tbs, ts1, ts2) ->
+    let i' = i + List.length tbs in
+    Func (s, c, List.map (open_bind i' ts) tbs, List.map (open' i' ts) ts1, List.map (open' i' ts) ts2)
+  | Opt t -> Opt (open' i ts t)
+  | Async (s, t1, t2) -> Async (s, open' i ts t1, open' i ts t2)
+  | Obj (s, fs) -> Obj (s, List.map (open_field i ts) fs)
+  | Variant fs -> Variant (List.map (open_field i ts) fs)
+  | Mut t -> Mut (open' i ts t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c
+
+and open_bind i ts tb  =
+  {tb with bound = open' i ts tb.bound}
+
+and open_field i ts {lab; typ; depr} =
+  {lab; typ = open' i ts typ; depr}
+
+(*
+and open_kind i ts k =
+  match k with
+  | Def (tbs, t) ->
+    let i' = i + List.length tbs in
+    Def (List.map (open_bind i' ts) tbs, open' i' ts t)
+  | Abs (tbs, t) ->
+    let i' = i + List.length tbs in
+    Abs (List.map (open_bind i' ts) tbs, open' i' ts t)
+*)
+
+let open_ ts t =
+  if ts = [] then t else
+  open' 0 ts t
+
+let open_binds tbs =
+  if tbs = [] then [] else
+  let cs = List.map (fun {var; _} -> Cons.fresh var (Abs ([], Pre))) tbs in
+  let ts = List.map (fun c -> Con (c, [])) cs in
+  let ks = List.map (fun {bound; _} -> Abs ([], open_ ts bound)) tbs in
+  List.iter2 set_kind cs ks;
+  ts
+
+
+(* Normalization and Classification *)
+
+let reduce tbs t ts =
+  assert (List.length ts = List.length tbs);
+  open_ ts t
+
+let rec normalize = function
+  | Con (con, ts) as t ->
+    (match Cons.kind con with
+    | Def (tbs, t) -> normalize (reduce tbs t ts)
+    | _ -> t
+    )
+  | Mut t -> Mut (normalize t)
+  | t -> t
+
+let rec promote = function
+  | Con (con, ts) ->
+    let Def (tbs, t) | Abs (tbs, t) = Cons.kind con
+    in promote (reduce tbs t ts)
+  | t -> t
+
+
+(* Projections *)
+
+let is_non = function Non -> true | _ -> false
+let is_prim p = function Prim p' -> p = p' | _ -> false
+let is_obj = function Obj _ -> true | _ -> false
+let is_module = function Obj (Module, _) -> true | _ -> false
+let is_variant = function Variant _ -> true | _ -> false
+let is_array = function Array _ -> true | _ -> false
+let is_opt = function Opt _ -> true | _ -> false
+let is_tup = function Tup _ -> true | _ -> false
+let is_unit = function Tup [] -> true | _ -> false
+let is_pair = function Tup [_; _] -> true | _ -> false
+let is_func = function Func _ -> true | _ -> false
+let is_async = function Async _ -> true | _ -> false
+let is_mut = function Mut _ -> true | _ -> false
+let is_typ = function Typ _ -> true | _ -> false
+let is_con = function Con _ -> true | _ -> false
+
+let invalid s = raise (Invalid_argument ("Type." ^ s))
+
+let as_prim p = function Prim p' when p = p' -> () | _ -> invalid "as_prim"
+let as_obj = function Obj (s, tfs) -> s, tfs | _ -> invalid "as_obj"
+let as_array = function Array t -> t | _ -> invalid "as_array"
+let as_opt = function Opt t -> t | _ -> invalid "as_opt"
+let as_variant = function Variant fs -> fs | _ -> invalid "as_variant"
+let as_tup = function Tup ts -> ts | _ -> invalid "as_tup"
+let as_unit = function Tup [] -> () | _ -> invalid "as_unit"
+let as_pair = function Tup [t1; t2] -> t1, t2 | _ -> invalid "as_pair"
+let as_func = function Func (s, c, tbs, ts1, ts2) -> s, c, tbs, ts1, ts2 | _ -> invalid "as_func"
+let as_async = function Async (s, t1, t2) -> (s, t1, t2) | _ -> invalid "as_async"
+let as_mut = function Mut t -> t | _ -> invalid "as_mut"
+let as_immut = function Mut t -> t | t -> t
+let as_typ = function Typ c -> c | _ -> invalid "as_typ"
+let as_con = function Con (c, ts) -> c, ts | _ -> invalid "as_con"
+
+let as_seq t =
+  match normalize t with
+  | Tup ts -> ts
+  | t -> [t]
+
+let seq_of_tup t =
+  match normalize t with
+  | Tup ts -> ts
+  | t -> invalid "seq_of_tup"
+
+let arity t =
+  match normalize t with
+  | Tup ts -> List.length ts
+  | t -> 1
+
+let as_prim_sub p t = match promote t with
+  | Prim p' when p = p' -> ()
+  | Non -> ()
+  | _ -> invalid "as_prim_sub"
+let as_obj_sub ls t = match promote t with
+  | Obj (s, tfs) -> s, tfs
+  | Non -> Object, List.map (fun l -> {lab = l; typ = Non; depr = None}) ls
+  | _ -> invalid "as_obj_sub"
+let as_variant_sub l t = match promote t with
+  | Variant tfs -> tfs
+  | Non -> [{lab = l; typ = Non; depr = None}]
+  | _ -> invalid "as_variant_sub"
+let as_array_sub t = match promote t with
+  | Array t -> t
+  | Non -> Non
+  | _ -> invalid "as_array_sub"
+let as_opt_sub t = match promote t with
+  | Opt t -> t
+  | Prim Null -> Non
+  | Non -> Non
+  | _ -> invalid "as_opt_sub"
+let as_tup_sub n t = match promote t with
+  | Tup ts -> ts
+  | Non -> Lib.List.make n Non
+  | _ -> invalid "as_tup_sub"
+let as_unit_sub t = match promote t with
+  | Tup []
+  | Non -> ()
+  | _ -> invalid "as_unit_sub"
+let as_pair_sub t = match promote t with
+  | Tup [t1; t2] -> t1, t2
+  | Non -> Non, Non
+  | _ -> invalid "as_pair_sub"
+let as_func_sub default_s default_arity t = match promote t with
+  | Func (s, c, tbs, ts1, ts2) ->
+    s, tbs, seq ts1, codom c (fun () -> Var((List.hd tbs).var, 0)) ts2
+  | Non -> default_s, Lib.List.make default_arity {var = "X"; sort = Type; bound = Any}, Any, Non
+  | _ -> invalid "as_func_sub"
+let as_mono_func_sub t = match promote t with
+  | Func (_, _, [], ts1, ts2) -> seq ts1, seq ts2
+  | Non -> Any, Non
+  | _ -> invalid "as_func_sub"
+let as_async_sub s default_scope t = match promote t with
+  | Async (s0, t1, t2) when s = s0 -> (t1, t2)
+  | Non -> default_scope, Non (* TBR *)
+  | _ -> invalid "as_async_sub"
+
+let is_immutable_obj obj_type =
+  let _, fields = as_obj_sub [] obj_type in
+  List.for_all (fun f -> not (is_mut f.typ)) fields
+
+
+let lookup_val_field_opt l tfs =
+  let is_lab = function {typ = Typ _; _} -> false | {lab; _} -> lab = l in
+  match List.find_opt is_lab tfs with
+  | Some tf -> Some tf.typ
+  | None -> None
+
+let lookup_typ_field_opt l tfs =
+  let is_lab = function {typ = Typ _; lab; _} -> lab = l | _ -> false in
+  match List.find_opt is_lab tfs with
+  | Some {typ = Typ c; _} -> Some c
+  | _ -> None
+
+let lookup_val_field l tfs =
+  match lookup_val_field_opt l tfs with
+  | Some t -> t
+  | None -> invalid "lookup_val_field"
+
+let lookup_typ_field l tfs =
+  match lookup_typ_field_opt l tfs with
+  | Some c -> c
+  | _ -> invalid "lookup_typ_field"
+
+
+let lookup_val_deprecation l tfs =
+  let is_lab = function {typ = Typ _; _} -> false | {lab; _} -> lab = l in
+  match List.find_opt is_lab tfs with
+  | Some tf -> tf.depr
+  | None -> invalid "lookup_val_deprecation"
+
+let lookup_typ_deprecation l tfs =
+  let is_lab = function {typ = Typ _; lab; _} -> lab = l | _ -> false in
+  match List.find_opt is_lab tfs with
+  | Some tf -> tf.depr
+  | _ -> invalid "lookup_typ_deprecation"
+
+
+(* Span *)
+
+let rec span = function
+  | Var _ | Pre -> assert false
+  | Con _ as t -> span (promote t)
+  | Prim Null -> Some 1
+  | Prim Bool -> Some 2
+  | Prim (Nat | Int | Float | Text | Blob | Error | Principal) -> None
+  | Prim (Nat8 | Int8) -> Some 0x100
+  | Prim (Nat16 | Int16) -> Some 0x10000
+  | Prim (Nat32 | Int32 | Nat64 | Int64 | Char) -> None  (* for all practical purposes *)
+  | Obj _ | Tup _ | Async _ -> Some 1
+  | Variant fs -> Some (List.length fs)
+  | Array _ | Func _ | Any -> None
+  | Opt _ -> Some 2
+  | Mut t -> span t
+  | Non -> Some 0
+  | Typ _ -> Some 1
+
+
+(* Collecting type constructors *)
+
+(* Parameter `inTyp` controls whether to count a constructor, `c`,  that only occurs as an argument of
+   `Typ` field, `Typ c`, but not in its own unfolding.
+   Set to false to avoid emitting redundant bindings in stable signature.
+*)
+
+let rec cons' inTyp t cs =
+  match t with
+  | Var _ | Prim _ | Any | Non | Pre -> cs
+  | Con (c, ts) ->
+    List.fold_right (cons' inTyp) ts (cons_con inTyp c cs)
+  | Opt t | Mut t | Array t ->
+    cons' inTyp t cs
+  | Async (_, t1, t2) ->
+    cons' inTyp t2 (cons' inTyp t1 cs)
+  | Tup ts -> List.fold_right (cons' inTyp) ts cs
+  | Func (s, c, tbs, ts1, ts2) ->
+    let cs = List.fold_right (cons_bind inTyp) tbs cs in
+    let cs = List.fold_right (cons' inTyp) ts1 cs in
+    List.fold_right (cons' inTyp) ts2 cs
+  | Obj (_, fs) | Variant fs ->
+    List.fold_right (cons_field inTyp) fs cs
+  | Typ c ->
+    if inTyp then
+      cons_con inTyp c cs
+    else
+      (* don't add c unless mentioned in Cons.kind c *)
+      cons_kind' inTyp (Cons.kind c) cs
+
+and cons_con inTyp c cs =
+  if ConSet.mem c cs
+  then cs
+  else cons_kind' inTyp (Cons.kind c) (ConSet.add c cs)
+
+and cons_bind inTyp tb cs =
+  cons' inTyp tb.bound cs
+
+and cons_field inTyp {lab; typ; depr} cs =
+  cons' inTyp typ cs
+
+and cons_kind' inTyp k cs =
+  match k with
+  | Def (tbs, t)
+  | Abs (tbs, t) ->
+    cons' inTyp t (List.fold_right (cons_bind inTyp) tbs cs)
+
+let cons t = cons' true t ConSet.empty
+let cons_kind k = cons_kind' true k ConSet.empty
+
+(* Checking for concrete types *)
+
+module S = Set.Make (Ord)
+
+(*
+This check is a stop-gap measure until we have an IDL strategy that
+allows polymorphic types, see #250. It is not what we desire for Motoko.
+*)
+
+let concrete t =
+  let seen = ref S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim _ | Any | Non -> true
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> false
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t | Mut t -> go t
+      | Async (s, t1, t2) -> go t2 (* t1 is a phantom type *)
+      | Tup ts -> List.for_all go ts
+      | Obj (_, fs) | Variant fs -> List.for_all (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        let ts = open_binds tbs in
+        List.for_all go (List.map (open_ ts) ts1) &&
+        List.for_all go (List.map (open_ ts) ts2)
+      | Typ c -> (* assumes type defs are closed *)
+        true (* so we can transmit actors with typ fields *)
+    end
+  in go t
+
+(* stable or shared *)
+let serializable allow_mut t =
+  let seen = ref S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim Error -> false
+      | Any | Non | Prim _ | Typ _ -> true
+      | Async _ -> false
+      | Mut t -> allow_mut && go t
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> false
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t -> go t
+      | Tup ts -> List.for_all go ts
+      | Obj (s, fs) ->
+        (match s with
+         | Actor -> true
+         | Module -> false (* TODO(1452) make modules sharable *)
+         | Object | Memory -> List.for_all (fun f -> go f.typ) fs)
+      | Variant fs -> List.for_all (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) -> is_shared_sort s
+    end
+  in go t
+
+(* Find the first unshared subexpression in a type *)
+let find_unshared t =
+  let seen = ref S.empty in
+  let rec go t =
+    if S.mem t !seen then None else
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim Error -> Some t
+      | Any | Non | Prim _ | Typ _ -> None
+      | Async _ | Mut _ -> Some t
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> None
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t -> go t
+      | Tup ts -> List.find_map go ts
+      | Obj (s, fs) ->
+        (match s with
+         | Actor -> None
+         | Module -> Some t (* TODO(1452) make modules sharable *)
+         | Object ->
+           List.find_map (fun f -> go f.typ) fs
+         | Memory -> assert false)
+      | Variant fs -> List.find_map (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        if is_shared_sort s
+        then None
+        else Some t
+    end
+  in go t
+
+let is_shared_func typ =
+  match promote typ with
+  | Func (Shared _, _, _, _, _) -> true
+  | _ -> false
+
+let is_local_async_func typ =
+  match promote typ with
+  | Func
+      (Local, Returns,
+       { sort = Scope; _ }::_,
+       _,
+       [Async (Fut, Var (_ ,0), _)]) ->
+    true
+  | _ ->
+    false
+
+let shared t = serializable false t
+let stable t = serializable true t
+
+
+(* Forward declare
+   TODO: haul string_of_typ before the lub/glb business, if possible *)
+let str = ref (fun _ -> failwith "")
+
+
+(* Equivalence & Subtyping *)
+
+exception PreEncountered
+
+
+module SS = Set.Make (OrdPair)
+
+let rel_list p rel eq xs1 xs2 =
+  try List.for_all2 (p rel eq) xs1 xs2 with Invalid_argument _ -> false
+
+let rec rel_typ rel eq t1 t2 =
+  t1 == t2 || SS.mem (t1, t2) !rel || begin
+  rel := SS.add (t1, t2) !rel;
+  match t1, t2 with
+  (* Second-class types first, since they mustn't relate to Any/Non *)
+  | Pre, _ | _, Pre ->
+    raise PreEncountered
+  | Mut t1', Mut t2' ->
+    eq_typ rel eq t1' t2'
+  | Typ c1, Typ c2 ->
+    eq_con eq c1 c2
+  | Mut _, _ | _, Mut _
+  | Typ _, _ | _, Typ _ ->
+    false
+  | Any, Any ->
+    true
+  | _, Any when rel != eq ->
+    true
+  | Non, Non ->
+    true
+  | Non, _ when rel != eq ->
+    true
+  | Con (con1, ts1), Con (con2, ts2) ->
+    (match Cons.kind con1, Cons.kind con2 with
+    | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+      rel_typ rel eq (open_ ts1 t) t2
+    | _, Def (tbs, t) -> (* TBR this may fail to terminate *)
+      rel_typ rel eq t1 (open_ ts2 t)
+    | _ when Cons.eq con1 con2 ->
+      rel_list eq_typ rel eq ts1 ts2
+    | Abs (tbs, t), _ when rel != eq ->
+      rel_typ rel eq (open_ ts1 t) t2
+    | _ ->
+      false
+    )
+  | Con (con1, ts1), t2 ->
+    (match Cons.kind con1, t2 with
+    | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+      rel_typ rel eq (open_ ts1 t) t2
+    | Abs (tbs, t), _ when rel != eq ->
+      rel_typ rel eq (open_ ts1 t) t2
+    | _ -> false
+    )
+  | t1, Con (con2, ts2) ->
+    (match Cons.kind con2 with
+    | Def (tbs, t) -> (* TBR this may fail to terminate *)
+      rel_typ rel eq t1 (open_ ts2 t)
+    | _ -> false
+    )
+  | Prim p1, Prim p2 when p1 = p2 ->
+    true
+  | Prim p1, Prim p2 when rel != eq ->
+    p1 = Nat && p2 = Int
+  | Obj (s1, tfs1), Obj (s2, tfs2) ->
+    s1 = s2 &&
+    rel_fields rel eq tfs1 tfs2
+  | Array t1', Array t2' ->
+    rel_typ rel eq t1' t2'
+  | Opt t1', Opt t2' ->
+    rel_typ rel eq t1' t2'
+  | Prim Null, Opt t2' when rel != eq ->
+    true
+  | Variant fs1, Variant fs2 ->
+    rel_tags rel eq fs1 fs2
+  | Tup ts1, Tup ts2 ->
+    rel_list rel_typ rel eq ts1 ts2
+  | Func (s1, c1, tbs1, t11, t12), Func (s2, c2, tbs2, t21, t22) ->
+    s1 = s2 && c1 = c2 &&
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts ->
+      rel_list rel_typ rel eq (List.map (open_ ts) t21) (List.map (open_ ts) t11) &&
+      rel_list rel_typ rel eq (List.map (open_ ts) t12) (List.map (open_ ts) t22)
+    | None -> false
+    )
+  | Async (s1, t11, t12), Async (s2, t21, t22) ->
+    s1 = s2 &&
+    eq_typ rel eq t11 t21 &&
+    rel_typ rel eq t12 t22
+  | _, _ -> false
+  end
+
+and rel_fields rel eq tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] ->
+    true
+  | _, [] when rel != eq ->
+    true
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+    | 0 ->
+      rel_typ rel eq tf1.typ tf2.typ &&
+      rel_fields rel eq tfs1' tfs2'
+    | -1 when rel != eq ->
+      rel_fields rel eq tfs1' tfs2
+    | _ -> false
+    )
+  | _, _ -> false
+
+and rel_tags rel eq tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] ->
+    true
+  | [], _ when rel != eq ->
+    true
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+    | 0 ->
+      rel_typ rel eq tf1.typ tf2.typ &&
+      rel_tags rel eq tfs1' tfs2'
+    | +1 when rel != eq ->
+      rel_tags rel eq tfs1 tfs2'
+    | _ -> false
+    )
+  | _, _ -> false
+
+and rel_binds rel eq tbs1 tbs2 =
+  let ts = open_binds tbs2 in
+  if rel_list (rel_bind ts) rel eq tbs2 tbs1
+  then Some ts
+  else None
+
+and rel_bind ts rel eq tb1 tb2 =
+  tb1.sort == tb2.sort &&
+  rel_typ rel eq (open_ ts tb1.bound) (open_ ts tb2.bound)
+
+and eq_typ rel eq t1 t2 = rel_typ eq eq t1 t2
+
+and eq t1 t2 : bool =
+  let eq = ref SS.empty in eq_typ eq eq t1 t2
+
+and sub t1 t2 : bool =
+  rel_typ (ref SS.empty) (ref SS.empty) t1 t2
+
+and eq_binds tbs1 tbs2 =
+  let eq = ref SS.empty in rel_binds eq eq tbs1 tbs2 <> None
+
+and eq_kind' eq k1 k2 : bool =
+  match k1, k2 with
+  | Def (tbs1, t1), Def (tbs2, t2)
+  | Abs (tbs1, t1), Abs (tbs2, t2) ->
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts -> eq_typ eq eq (open_ ts t1) (open_ ts t2)
+    | None -> false
+    )
+  | _ -> false
+
+and eq_con eq c1 c2 =
+  match Cons.kind c1, Cons.kind c2 with
+  | (Def (tbs1, t1)) as k1, (Def (tbs2, t2) as k2) ->
+    eq_kind' eq k1 k2
+  | Abs _, Abs _ ->
+    Cons.eq c1 c2
+  | Def (tbs1, t1), Abs (tbs2, t2)
+  | Abs (tbs2, t2), Def (tbs1, t1) ->
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts -> eq_typ eq eq (open_ ts t1) (Con (c2, ts))
+    | None -> false
+    )
+
+let eq_kind k1 k2 : bool = eq_kind' (ref SS.empty) k1 k2
+
+
+(* Compatibility *)
+
+let compatible_list p co xs1 xs2 =
+  try List.for_all2 (p co) xs1 xs2 with Invalid_argument _ -> false
+
+let rec compatible_typ co t1 t2 =
+  t1 == t2 || SS.mem (t1, t2) !co || begin
+  co := SS.add (t1, t2) !co;
+  match promote t1, promote t2 with
+  | Pre, _ | _, Pre ->
+    assert false
+  | Mut t1', Mut t2' ->
+    compatible_typ co t1' t2'
+  | Typ _, Typ _ ->
+    true
+  | Mut _, _ | _, Mut _
+  | Typ _, _ | _, Typ _ ->
+    false
+  | Any, Any ->
+    true
+  | Any, _ | _, Any ->
+    false
+  | Non, _ | _, Non ->
+    true
+  | Prim p1, Prim p2 when p1 = p2 ->
+    true
+  | Prim (Nat | Int), Prim (Nat | Int) ->
+    true
+  | Array t1', Array t2' ->
+    compatible_typ co t1' t2'
+  | Tup ts1, Tup ts2 ->
+    compatible_list compatible_typ co ts1 ts2
+  | Obj (s1, tfs1), Obj (s2, tfs2) ->
+    s1 = s2 &&
+    compatible_fields co tfs1 tfs2
+  | Opt t1', Opt t2' ->
+    compatible_typ co t1' t2'
+  | Prim Null, Opt _ | Opt _, Prim Null  ->
+    true
+  | Variant tfs1, Variant tfs2 ->
+    compatible_tags co tfs1 tfs2
+  | Async (s1, t11, t12), Async (s2, t21, t22) ->
+    s1 = s2 &&
+    compatible_typ co t11 t21 && (* TBR *)
+    compatible_typ co t12 t22
+  | Func _, Func _ ->
+    true
+  | _, _ ->
+    false
+  end
+
+and compatible_fields co tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] -> true
+  | tf1::tfs1', tf2::tfs2' ->
+    tf1.lab = tf2.lab && compatible_typ co tf1.typ tf2.typ &&
+    compatible_fields co tfs1' tfs2'
+  | _, _ -> false
+
+and compatible_tags co tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], _ | _, [] -> true
+  | tf1::tfs1', tf2::tfs2' ->
+    match compare_field tf1 tf2 with
+    | -1 -> compatible_tags co tfs1' tfs2
+    | +1 -> compatible_tags co tfs1 tfs2'
+    | _ -> compatible_typ co tf1.typ tf2.typ && compatible_tags co tfs1' tfs2'
+
+and compatible t1 t2 : bool =
+  compatible_typ (ref SS.empty) t1 t2
+
+
+let opaque t = compatible t Any
+
+
+(* Inhabitance *)
+
+let rec inhabited_typ co t =
+  S.mem t !co || begin
+  co := S.add t !co;
+  match promote t with
+  | Pre -> assert false
+  | Non -> false
+  | Any | Prim _ | Array _ | Opt _ | Async _ | Func _ | Typ _ -> true
+  | Mut t' -> inhabited_typ co t'
+  | Tup ts -> List.for_all (inhabited_typ co) ts
+  | Obj (_, tfs) -> List.for_all (inhabited_field co) tfs
+  | Variant tfs -> List.exists (inhabited_field co) tfs
+  | Var _ -> true  (* TODO(rossberg): consider bound *)
+  | Con (c, ts) ->
+    match Cons.kind c with
+    | Def (tbs, t') -> (* TBR this may fail to terminate *)
+      inhabited_typ co (open_ ts t')
+    | Abs (tbs, t') ->
+      inhabited_typ co t'
+  end
+
+and inhabited_field co tf = inhabited_typ co tf.typ
+
+and inhabited t : bool = inhabited_typ (ref S.empty) t
+
+let rec singleton_typ co t =
+  S.mem t !co || begin
+  co := S.add t !co;
+  match normalize t with
+  | Pre -> assert false
+  | Prim Null | Any -> true
+  | Tup ts -> List.for_all (singleton_typ co) ts
+  | Obj ((Object|Memory|Module), fs) -> List.for_all (singleton_field co) fs
+  | Variant [f] -> singleton_field co f
+
+  | Non -> false
+  | Prim _ | Array _ | Opt _ | Async _ | Func _ | Typ _ -> false
+  | Mut t' -> false
+  | Obj (_, _) -> false
+  | Variant _ -> false
+  | Var _ -> false
+  | Con _ -> false
+  end
+
+and singleton_field co tf = singleton_typ co tf.typ
+
+and singleton t : bool = singleton_typ (ref S.empty) t
+
+
+(* Least upper bound and greatest lower bound *)
+
+module M = Map.Make (OrdPair)
+
+exception Mismatch
+
+let rec combine rel lubs glbs t1 t2 =
+  assert (rel == lubs || rel == glbs);
+  if t1 == t2 then t1 else
+  match M.find_opt (t1, t2) !rel with
+  | Some t -> t
+  | _ when eq t1 t2 ->
+    let t = if is_con t2 then t2 else t1 in
+    rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+    t
+  | _ ->
+    match t1, t2 with
+    | Pre, _ | _, Pre ->
+      raise PreEncountered
+    | Mut _, _ | _, Mut _
+    | Typ _, _ | _, Typ _ ->
+      raise Mismatch
+    | Any, t | t, Any ->
+      if rel == lubs then Any else t
+    | Non, t | t, Non ->
+      if rel == lubs then t else Non
+    | Prim Nat, Prim Int
+    | Prim Int, Prim Nat ->
+      Prim (if rel == lubs then Int else Nat)
+    | Opt t1', Opt t2' ->
+      Opt (combine rel lubs glbs t1' t2')
+    | (Opt _ as t), (Prim Null as t')
+    | (Prim Null as t'), (Opt _ as t) ->
+      if rel == lubs then t else t'
+    | Array t1', Array t2' ->
+      (try Array (combine rel lubs glbs t1' t2')
+      with Mismatch -> if rel == lubs then Any else Non)
+    | Variant t1', Variant t2' ->
+      Variant (combine_tags rel lubs glbs t1' t2')
+    | Tup ts1, Tup ts2 when List.(length ts1 = length ts2) ->
+      Tup (List.map2 (combine rel lubs glbs) ts1 ts2)
+    | Obj (s1, tf1), Obj (s2, tf2) when s1 = s2 ->
+      (try Obj (s1, combine_fields rel lubs glbs tf1 tf2)
+      with Mismatch -> assert (rel == glbs); Non)
+    | Func (s1, c1, bs1, ts11, ts12), Func (s2, c2, bs2, ts21, ts22) when
+        s1 = s2 && c1 = c2 && eq_binds bs1 bs2 &&
+        List.(length ts11 = length ts21 && length ts12 = length ts22) ->
+      let ts = open_binds bs1 in
+      let cs = List.map (fun t -> fst (as_con t)) ts in
+      let opened = List.map (open_ ts) in
+      let closed = List.map (close cs) in
+      let rel' = if rel == lubs then glbs else lubs in
+      Func (
+        s1, c1, bs1,
+        closed (List.map2 (combine rel' lubs glbs) (opened ts11) (opened ts21)),
+        closed (List.map2 (combine rel lubs glbs) (opened ts12) (opened ts22))
+      )
+    | Async (s1, t11, t12), Async (s2, t21, t22) when s1 == s2 && eq t11 t21 ->
+      Async (s1, t11, combine rel lubs glbs t12 t22)
+    | Con _, _
+    | _, Con _ ->
+      if sub t1 t2 then
+        let t = if rel == glbs then t1 else t2 in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        t
+      else if sub t2 t1 then
+        let t = if rel == lubs then t1 else t2 in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        t
+      else
+        let op, expand =
+          if rel == lubs then "lub", promote else "glb", normalize in
+        let name = op ^ "<" ^ !str t1 ^ ", " ^ !str t2 ^ ">" in
+        let c = Cons.fresh name (Abs ([], Pre)) in
+        let t = Con (c, []) in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        let t' =
+          (* When taking the glb of an abstract con and an incompatible type,
+           * normalisation will no further simplify t1 nor t2, so that t itself
+           * is returned via the extended relation. In that case, bottom is
+           * the correct result.
+           *)
+          match combine rel lubs glbs (expand t1) (expand t2) with
+          | t' when t' == t -> assert (rel == glbs); Non
+          | t' -> t'
+        in
+        set_kind c (Def ([], t'));
+        t'
+    | _, _ ->
+      if rel == lubs then Any else Non
+
+and cons_if b x xs = if b then x::xs else xs
+
+and combine_fields rel lubs glbs fs1 fs2 =
+  match fs1, fs2 with
+  | _, [] -> if rel == lubs then [] else fs1
+  | [], _ -> if rel == lubs then [] else fs2
+  | f1::fs1', f2::fs2' ->
+    match compare_field f1 f2 with
+    | -1 -> cons_if (rel == glbs) f1 (combine_fields rel lubs glbs fs1' fs2)
+    | +1 -> cons_if (rel == glbs) f2 (combine_fields rel lubs glbs fs1 fs2')
+    | _ ->
+      match combine rel lubs glbs f1.typ f2.typ with
+      | typ ->
+       {lab = f1.lab; typ; depr = None} :: combine_fields rel lubs glbs fs1' fs2'
+      | exception Mismatch when rel == lubs ->
+        combine_fields rel lubs glbs fs1' fs2'
+
+and combine_tags rel lubs glbs fs1 fs2 =
+  match fs1, fs2 with
+  | _, [] -> if rel == lubs then fs1 else []
+  | [], _ -> if rel == lubs then fs2 else []
+  | f1::fs1', f2::fs2' ->
+    match compare_field f1 f2 with
+    | -1 -> cons_if (rel == lubs) f1 (combine_tags rel lubs glbs fs1' fs2)
+    | +1 -> cons_if (rel == lubs) f2 (combine_tags rel lubs glbs fs1 fs2')
+    | _ ->
+      let typ = combine rel lubs glbs f1.typ f2.typ in
+      {lab = f1.lab; typ; depr = None} :: combine_tags rel lubs glbs fs1' fs2'
+
+let lub t1 t2 = let lubs = ref M.empty in combine lubs lubs (ref M.empty) t1 t2
+let glb t1 t2 = let glbs = ref M.empty in combine glbs (ref M.empty) glbs t1 t2
+
+
+(* Environments *)
+
+module Env = Env.Make(String)
+
+(* Scopes *)
+
+let scope_var var = "$" ^ var
+let default_scope_var = scope_var ""
+let scope_bound = Any
+let scope_bind = { var = default_scope_var; sort = Scope; bound = scope_bound }
+
+(* Well-known fields *)
+
+let motoko_async_helper_fld =
+  { lab = "__motoko_async_helper";
+    typ = Func(Shared Write, Promises, [scope_bind], [Prim Nat32], []);
+    depr = None;
+  }
+
+let motoko_stable_var_info_fld =
+  { lab = "__motoko_stable_var_info";
+    typ =
+      Func(Shared Query, Promises, [scope_bind], [],
+        [ Obj(Object, [{lab = "size"; typ = nat64; depr = None}]) ]);
+    depr = None;
+  }
+
+let get_candid_interface_fld =
+  { lab = "__get_candid_interface_tmp_hack";
+    typ = Func(Shared Query, Promises, [scope_bind], [], [text]);
+    depr = None;
+  }
+
+let well_known_actor_fields = [
+    motoko_async_helper_fld;
+    motoko_stable_var_info_fld;
+    get_candid_interface_fld
+  ]
+
+let decode_msg_typ tfs =
+  Variant
+    (List.sort compare_field (List.filter_map (fun tf ->
+       match normalize tf.typ with
+       | Func(Shared (Write | Query), _, tbs, ts1, ts2) ->
+         Some { tf with
+           typ =
+             Func(Local, Returns, [], [],
+               List.map (open_ (List.map (fun _ -> Non) tbs)) ts1);
+           depr = None }
+       | _ -> None)
+     tfs))
+
+let canister_settings_typ =
+  obj Object [
+    "settings",
+    Opt (
+      obj Object [
+      ("controllers", Opt (Array principal));
+      ("compute_allocation", Opt nat);
+      ("memory_allocation", Opt nat);
+      ("freezing_threshold", Opt nat)])]
+
+let install_arg_typ =
+  sum [
+    ("new", canister_settings_typ);
+    ("install", principal);
+    ("reinstall", obj Actor []);
+    ("upgrade", obj Actor [])
+  ]
+
+let install_typ ts actor_typ =
+  Func(Local, Returns, [],
+    [ install_arg_typ ],
+    [ Func(Local, Returns, [scope_bind], ts, [Async (Fut, Var (default_scope_var, 0), actor_typ)]) ])
+
+
+(* Pretty printing *)
+
+let string_of_async_sort = function
+  | Fut -> ""
+  | Cmp -> "*"
+
+let string_of_prim = function
+  | Null -> "Null"
+  | Bool -> "Bool"
+  | Nat -> "Nat"
+  | Nat8 -> "Nat8"
+  | Nat16 -> "Nat16"
+  | Nat32 -> "Nat32"
+  | Nat64 -> "Nat64"
+  | Int -> "Int"
+  | Int8 -> "Int8"
+  | Int16 -> "Int16"
+  | Int32 -> "Int32"
+  | Int64 -> "Int64"
+  | Float -> "Float"
+  | Char -> "Char"
+  | Text -> "Text"
+  | Blob -> "Blob"
+  | Error -> "Error"
+  | Principal -> "Principal"
+
+let string_of_obj_sort = function
+  | Object -> ""
+  | Module -> "module "
+  | Actor -> "actor "
+  | Memory -> "memory "
+
+let string_of_func_sort = function
+  | Local -> ""
+  | Shared Write -> "shared "
+  | Shared Query -> "shared query "
+  | Shared Composite -> "shared composite query " (* TBR *)
+
+(* PrettyPrinter configurations *)
+
+module type PrettyConfig = sig
+  val show_stamps : bool
+  val con_sep : string
+  val par_sep : string
+end
+
+module ShowStamps = struct
+  let show_stamps = true
+  let con_sep = "__" (* TODO: revert to "/" *)
+  let par_sep = "_"
+end
+
+module ElideStamps = struct
+  let show_stamps = false
+  let con_sep = ShowStamps.con_sep
+  let par_sep = ShowStamps.par_sep
+end
+
+module ParseableStamps = struct
+  let show_stamps = true
+  let con_sep = "__"
+  let par_sep = "_"
+end
+
+module MakePretty(Cfg : PrettyConfig) = struct
+
+open Format
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+module StringSet = Set.Make(String)
+
+let vs_of_cs cs =
+  let names = ConSet.fold (fun c ns -> StringSet.add (Cons.name c) ns) cs StringSet.empty in
+  StringSet.fold (fun n vs -> (n, 0)::vs) names []
+
+let string_of_var (x, i) =
+  if i = 0 then sprintf "%s" x else sprintf "%s%s%d" x Cfg.par_sep i
+
+let string_of_con c = Cons.to_string Cfg.show_stamps Cfg.con_sep c
+
+let rec can_sugar = function
+  | Func(s, Promises, tbs, ts1, ts2)
+  | Func((Shared _ as s), Returns, tbs, ts1, ([] as ts2))
+  | Func(s, Returns, (_::_ as tbs), ts1, ([Async (_, Var(_, 0),_)] as ts2)) ->
+    List.for_all (fun tb -> can_omit 0 tb.bound) tbs &&
+    List.for_all (can_omit 0) ts1 &&
+    List.for_all (can_omit 0) ts2
+  | _ -> false
+
+and can_omit n t =
+  let rec go i = function
+    | Var (_, j) -> i <> j
+    | Pre -> assert false
+    | Prim _ | Any | Non -> true
+    | Con (c, ts) -> List.for_all (go i ) ts
+    | Array t | Opt t | Mut t -> go i t
+    | Async (s, Var (_, j), t2) when j = i && i <= n -> go i t2 (* t1 is a phantom type *)
+    | Async (s, t1, t2) -> go i t1 && go i t2
+    | Tup ts -> List.for_all (go i ) ts
+    | Obj (_, fs) | Variant fs -> List.for_all (fun f -> go i f.typ) fs
+    | Func (s, c, tbs, ts1, ts2) ->
+      let i' = i+List.length tbs in
+      List.for_all (fun tb -> (go i' tb.bound)) tbs &&
+      List.for_all (go i') ts1 &&
+      List.for_all (go i') ts2
+    | Typ c -> true (* assumes type defs are closed *)
+  in go n t
+
+let rec pp_typ_obj vs ppf o =
+  match o with
+  | (Object, fs) ->
+    fprintf ppf "@[<hv 2>{@;<0 0>%a@;<0 -2>}@]"
+      (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+  | (s, fs) ->
+    fprintf ppf "@[<hv 2>%s{@;<0 0>%a@;<0 -2>}@]"
+      (string_of_obj_sort s)
+      (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+
+and pp_typ_variant vs ppf fs =
+  match fs with
+  | [] -> pr ppf "{#}"
+  | fs ->
+    fprintf ppf "@[<hv 2>{@;<0 0>%a@;<0 -2>}@]"
+      (pp_print_list ~pp_sep:semi (pp_tag vs)) fs
+
+and pp_typ_nullary vs ppf t =
+  match t with
+  | Tup ts ->
+    fprintf ppf "@[<1>(%a%s)@]"
+      (pp_print_list ~pp_sep:comma (pp_typ' vs)) ts
+      (if List.length ts = 1 then "," else "")
+  | Pre -> pr ppf "???"
+  | Any -> pr ppf "Any"
+  | Non -> pr ppf "None"
+  | Prim p -> pr ppf (string_of_prim p)
+  | Var (s, i) ->
+    pr ppf (try string_of_var (List.nth vs i) with _ -> Printf.sprintf "??? %s %i" s i)
+  | Con (c, []) -> pr ppf (string_of_con c)
+  | Con (c, ts) ->
+    fprintf ppf "@[%s<@[<1>%a@]>@]" (string_of_con c)
+      (pp_print_list ~pp_sep:comma (pp_typ' vs)) ts
+  | Array (Mut t) ->
+    fprintf ppf "@[<1>[var %a]@]" (pp_typ' vs) t
+  | Array t ->
+    fprintf ppf "@[<1>[%a]@]" (pp_typ' vs) t
+  | Obj (Object, fs) ->
+    pp_typ_obj vs ppf (Object, fs)
+  | Variant fs ->
+    pp_typ_variant vs ppf fs
+  | t ->
+    (* In the parser, this case is subsumed by the grammar production for `LPAR .. RPAR` *)
+    fprintf ppf "@[<1>(%a)@]" (pp_typ' vs) t
+
+and pp_typ_un vs ppf t =
+  match t with
+  | Opt t ->
+    fprintf ppf "@[<1>?%a@]"  (pp_typ_un vs) t
+  | t ->
+    pp_typ_nullary vs ppf t
+
+and pp_typ_pre vs ppf t =
+  match t with
+  (* No case for grammar production `PRIM s` *)
+  | Async (s, t1, t2) ->
+    if Cfg.show_stamps then
+      match t1 with
+      | Var(_, n) when fst (List.nth vs n) = "" ->
+        fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t2
+      | _ ->
+        fprintf ppf "@[<2>async%s<%a>@ %a@]"
+          (string_of_async_sort s)
+          (pp_typ' vs) t1
+          (pp_typ_pre vs) t2
+    else fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t2
+  | Obj ((Module | Actor | Memory) as os, fs) ->
+    pp_typ_obj vs ppf (os, fs)
+  | t ->
+    pp_typ_un vs ppf t
+
+and sequence pp ppf ts =
+  match ts with
+  | [Tup _] ->
+    fprintf ppf "@[<1>(%a)@]" pp (seq ts)
+  | ts ->
+    pp ppf (seq ts)
+
+and pp_typ_nobin vs ppf t =
+  match t with
+  | Func (s, c, tbs, ts1, ts2) ->
+    let sugar = can_sugar t in
+    let vs' = vars_of_binds vs tbs in
+    let vs'', tbs' =
+      if sugar then
+        List.tl vs', List.tl tbs
+      else
+        vs', tbs
+    in
+    let vs'vs = vs' @ vs in
+    fprintf ppf "@[<2>%s%a%a ->@ %a@]"
+      (string_of_func_sort s)
+      (pp_binds (vs'vs) vs'') tbs'
+      (sequence (pp_typ_un (vs'vs))) ts1
+      (pp_control_cod sugar c (vs'vs)) ts2
+  | t ->
+     pp_typ_pre vs ppf t
+
+and pp_control_cod sugar c vs ppf ts =
+  match c, ts with
+  (* sugar *)
+  | Returns, [Async (s, _, t)] when sugar ->
+    fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t
+  | Promises, ts ->
+    fprintf ppf "@[<2>async@ %a@]" (sequence (pp_typ_pre vs)) ts
+  | Returns, _ ->
+    sequence (pp_typ_nobin vs) ppf ts
+  | Replies, _ ->
+    fprintf ppf "@[<2>replies@ %a@]" (sequence (pp_typ_nobin vs)) ts
+
+and pp_typ' vs ppf t =
+  match t with
+  (* special, additional cases for printing second-class types *)
+  | Typ c ->
+    fprintf ppf "@[<1>=@ @[(type@ %a)@]@]" (pp_kind' vs) (Cons.kind c)
+  | Mut t ->
+    fprintf ppf "@[<1>var@ %a@]" (pp_typ_un vs) t
+  (* No cases for syntactic _ And _ & _ Or _ (already desugared) *)
+  | t -> pp_typ_nobin vs ppf t
+
+and pp_field vs ppf {lab; typ; depr} =
+  match typ with
+  | Typ c ->
+    let op, sbs, st = pps_of_kind' vs (Cons.kind c) in
+    fprintf ppf "@[<2>type %s%a %s@ %a@]" lab sbs () op st ()
+  | Mut t' ->
+    fprintf ppf "@[<2>var %s :@ %a@]" lab (pp_typ' vs) t'
+  | _ ->
+    fprintf ppf "@[<2>%s :@ %a@]" lab (pp_typ' vs) typ
+
+and pp_stab_field vs ppf {lab; typ; depr} =
+  match typ with
+  | Mut t' ->
+    fprintf ppf "@[<2>stable var %s :@ %a@]" lab (pp_typ' vs) t'
+  | _ ->
+    fprintf ppf "@[<2>stable %s :@ %a@]" lab (pp_typ' vs) typ
+
+and pp_tag vs ppf {lab; typ; depr} =
+  match typ with
+  | Tup [] -> fprintf ppf "#%s" lab
+  | _ ->
+    fprintf ppf "@[<2>#%s :@ %a@]" lab
+      (pp_typ' vs) typ
+
+and vars_of_binds vs bs =
+  List.map (fun b -> name_of_var vs (b.var, 0)) bs
+
+and name_of_var vs v =
+  match vs with
+  | [] -> v
+  | v'::vs' -> name_of_var vs' (if (fst v) = (fst v') then (fst v, snd v + 1) else v)
+
+and pp_bind vs ppf (v, {bound; _}) =
+  if bound = Any then
+    pr ppf (string_of_var v)
+  else
+    fprintf ppf "%s <: %a"
+      (string_of_var v)
+      (pp_typ' vs) bound
+
+and pp_binds vs vs' ppf = function
+  | [] -> ()
+  | tbs ->
+    fprintf ppf "@[<1><%a>@]"
+      (pp_print_list ~pp_sep:comma (pp_bind vs)) (List.combine vs' tbs)
+
+and pps_of_kind' vs k =
+  let op, tbs, t =
+    match k with
+    | Def (tbs, t) -> "=", tbs, t
+    | Abs (tbs, t) -> "<:", tbs, t
+  in
+  let vs' = vars_of_binds vs tbs in
+  let vs'vs = vs'@vs in
+  op,
+  (fun ppf () -> pp_binds vs'vs vs' ppf tbs),
+  (fun ppf () -> pp_typ' vs'vs ppf t)
+
+and pps_of_kind k =
+  let cs = cons_kind k in
+  let vs = vs_of_cs cs in
+  pps_of_kind' vs k
+
+and pp_kind' vs ppf k =
+  let op, sbs, st = pps_of_kind' vs k in
+  fprintf ppf "%s %a%a" op sbs () st ()
+
+and pp_kind ppf k =
+  let cs = cons_kind k in
+  let vs = vs_of_cs cs in
+  pp_kind' vs ppf k
+
+and pp_stab_sig ppf sig_ =
+  let cs = List.fold_right
+    (cons_field false)
+    (* false here ^ means ignore unreferenced Typ c components
+       that would produce unreferenced bindings when unfolded *)
+    sig_ ConSet.empty in
+  let vs = vs_of_cs cs in
+  let ds =
+    let cs' = ConSet.filter (fun c ->
+      match Cons.kind c with
+      | Def ([], Prim p) when string_of_con c = string_of_prim p -> false
+      | Def ([], Any) when string_of_con c = "Any" -> false
+      | Def ([], Non) when string_of_con c = "None" -> false
+      | Def _ -> true
+      | Abs _ -> false) cs in
+    ConSet.elements cs' in
+  let fs =
+    List.sort compare_field
+      (List.map (fun c ->
+        { lab = string_of_con c;
+          typ = Typ c;
+          depr = None }) ds)
+  in
+  let pp_stab_fields ppf sig_ =
+    fprintf ppf "@[<v 2>%s{@;<0 0>%a@;<0 -2>}@]"
+      (string_of_obj_sort Actor)
+      (pp_print_list ~pp_sep:semi (pp_stab_field vs)) sig_
+  in
+  fprintf ppf "@[<v 0>%a%a%a;@]"
+   (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+   (if fs = [] then fun ppf () -> () else semi) ()
+   pp_stab_fields sig_
+
+let rec pp_typ_expand' vs ppf t =
+  match t with
+  | Con (c, ts) ->
+    (match Cons.kind c with
+    | Abs _ -> pp_typ' vs ppf t
+    | Def _ ->
+      match normalize t with
+      | Prim _ | Any | Non -> pp_typ' vs ppf t
+      | t' -> fprintf ppf "%a = %a"
+        (pp_typ' vs) t
+        (pp_typ_expand' vs) t'
+    )
+  | _ -> pp_typ' vs ppf t
+
+let pp_lab = pr
+
+let pp_typ ppf t =
+  let vs = vs_of_cs (cons t) in
+  pp_typ' vs ppf t
+
+let pp_typ_expand ppf t =
+  let vs = vs_of_cs (cons t) in
+  pp_typ_expand' vs ppf t
+
+let string_of_typ typ : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_typ ppf) typ
+
+let string_of_kind k : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_kind ppf) k
+
+let strings_of_kind k : string * string * string =
+  let op, sbs, st = pps_of_kind k in
+  op, Lib.Format.with_str_formatter sbs (), Lib.Format.with_str_formatter st ()
+
+let string_of_typ_expand typ : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_typ_expand ppf) typ
+
+end
+
+module type Pretty = sig
+  val pp_lab : Format.formatter -> lab -> unit
+  val pp_typ : Format.formatter -> typ -> unit
+  val pp_typ_expand : Format.formatter -> typ -> unit
+  val pps_of_kind : kind ->
+    string *
+    (Format.formatter -> unit -> unit) *
+      (Format.formatter -> unit -> unit)
+
+  val string_of_con : con -> string
+  val string_of_typ : typ -> string
+  val string_of_kind : kind -> string
+  val strings_of_kind : kind -> string * string * string
+  val string_of_typ_expand : typ -> string
+end
+
+include MakePretty(ShowStamps)
+
+let _ = str := string_of_typ
+
+(* Stable signatures *)
+
+let rec match_stab_sig tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  (* Should we insist on monotonic preservation of fields, or relax? *)
+  match tfs1, tfs2 with
+  | [], _ ->
+    true (* no or additional fields ok *)
+  | _, [] ->
+    false (* true, should we allow fields to be dropped *)
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+     | 0 ->
+       is_mut tf1.typ = is_mut tf2.typ &&
+       sub (as_immut tf1.typ) (as_immut tf2.typ) &&
+         (* should we enforce equal mutability or not? Seems unncessary
+            since upgrade is read-once *)
+       match_stab_sig tfs1' tfs2'
+     | -1 ->
+       false (* match_sig tfs1' tfs2', should we allow fields to be dropped *)
+     | _ ->
+       (* new field ok *)
+       match_stab_sig tfs1 tfs2'
+    )
+
+let string_of_stab_sig fields : string =
+  let module Pretty = MakePretty(ParseableStamps) in
+  "// Version: 1.0.0\n" ^
+  Format.asprintf "@[<v 0>%a@]@\n" (fun ppf -> Pretty.pp_stab_sig ppf) fields
+
+
+
+ + + diff --git a/coverage/mo_values/arrange_ops.ml.html b/coverage/mo_values/arrange_ops.ml.html new file mode 100644 index 00000000000..6ba3f5b7585 --- /dev/null +++ b/coverage/mo_values/arrange_ops.ml.html @@ -0,0 +1,170 @@ + + + + + arrange_ops.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
+
open Wasm.Sexpr
+open Operator
+
+let unop uo = match uo with
+  | PosOp -> Atom "PosOp"
+  | NegOp -> Atom "NegOp"
+  | NotOp -> Atom "NotOp"
+
+let binop bo = match bo with
+  | AddOp  -> Atom "AddOp"
+  | SubOp  -> Atom "SubOp"
+  | MulOp  -> Atom "MulOp"
+  | DivOp  -> Atom "DivOp"
+  | ModOp  -> Atom "ModOp"
+  | AndOp  -> Atom "AndOp"
+  | OrOp   -> Atom "OrOp"
+  | XorOp  -> Atom "XorOp"
+  | ShLOp  -> Atom "ShiftLOp"
+  | ShROp  -> Atom "ShiftROp"
+  | RotLOp -> Atom "RotLOp"
+  | RotROp -> Atom "RotROp"
+  | CatOp  -> Atom "CatOp"
+  | PowOp  -> Atom "PowOp"
+  | WAddOp  -> Atom "WAddOp"
+  | WSubOp  -> Atom "WSubOp"
+  | WMulOp  -> Atom "WMulOp"
+  | WPowOp  -> Atom "WPowOp"
+
+let relop ro = match ro with
+  | EqOp  -> Atom "EqOp"
+  | NeqOp -> Atom "NeqOp"
+  | LtOp  -> Atom "LtOp"
+  | GtOp  -> Atom "GtOp"
+  | LeOp  -> Atom "LeOp"
+  | GeOp  -> Atom "GeOp"
+
+
+
+ + + diff --git a/coverage/mo_values/call_conv.ml.html b/coverage/mo_values/call_conv.ml.html new file mode 100644 index 00000000000..494a5b21b2f --- /dev/null +++ b/coverage/mo_values/call_conv.ml.html @@ -0,0 +1,156 @@ + + + + + call_conv.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
+
open Mo_types
+open Type
+
+(*
+Functions of different arities (even if the look like they have the same type)
+are not compatible, but the interpreters just pass tuples to them. In order to
+still catch mismatching arities in the interpreter, we tag function values
+with their “calling convention”, and check them in calls.
+*)
+
+type call_conv = {
+  sort: func_sort;
+  control : control;
+  n_args : int;
+  n_res : int;
+}
+type t = call_conv
+
+let local_cc n m = { sort = Local; control = Returns; n_args = n; n_res = m}
+let message_cc s n = { sort = Shared s; control = Returns; n_args = n; n_res = 0}
+let async_cc s n m = { sort = Shared s; control = Promises; n_args = n; n_res = m}
+let replies_cc s n m = { sort = Shared s; control = Replies; n_args = n; n_res = m}
+
+let call_conv_of_typ typ =
+  match typ with
+  | Func (sort, control, tbds, dom, res) ->
+    { sort; control; n_args = List.length dom; n_res = List.length res }
+  | Non ->
+    { sort = Local; control = Returns; n_args = 1; n_res = 1 }
+  | _ -> raise (Invalid_argument ("call_conv_of_typ " ^ string_of_typ typ))
+
+let string_of_call_conv {sort;control;n_args;n_res} =
+  Printf.sprintf "(%s%i %s %i)"
+    (string_of_func_sort sort)
+    n_args
+    (match control with Returns -> "->" | Promises -> "@>" | Replies -> "#>")
+    n_res
+
+
+
+
+ + + diff --git a/coverage/mo_values/numerics.ml.html b/coverage/mo_values/numerics.ml.html new file mode 100644 index 00000000000..52c320308cc --- /dev/null +++ b/coverage/mo_values/numerics.ml.html @@ -0,0 +1,1253 @@ + + + + + numerics.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+
+
(*
+This module contains all the numeric stuff, culminating
+in the NatN and Int_N modules, to be used by value.ml
+*)
+
+let rec add_digits buf s i j k =
+  if i < j then begin
+    if k = 0 then Buffer.add_char buf '_';
+    Buffer.add_char buf s.[i];
+    add_digits buf s (i + 1) j ((k + 2) mod 3)
+  end
+
+let is_digit c = '0' <= c && c <= '9'
+let isnt_digit c = not (is_digit c)
+
+let group_num s =
+  let len = String.length s in
+  let mant = Lib.Option.get (Lib.String.find_from_opt is_digit s 0) len in
+  let point = Lib.Option.get (Lib.String.find_from_opt isnt_digit s mant) len in
+  let frac = Lib.Option.get (Lib.String.find_from_opt is_digit s point) len in
+  let exp = Lib.Option.get (Lib.String.find_from_opt isnt_digit s frac) len in
+  let buf = Buffer.create (len*4/3) in
+  Buffer.add_substring buf s 0 mant;
+  add_digits buf s mant point ((point - mant) mod 3 + 3);
+  Buffer.add_substring buf s point (frac - point);
+  add_digits buf s frac exp 3;
+  Buffer.add_substring buf s exp (len - exp);
+  Buffer.contents buf
+
+(* OCaml version of LibTomMath's mp_set_double
+   Converts a Wasm f64 (represented as IEEE 754 double, same as OCaml `float`)
+   to Big_int *)
+let bigint_of_double (f : Wasm.F64.t) : Big_int.big_int =
+  let bits = Wasm.F64.to_bits f in
+
+  (* A bit pattern with 11 least significant bits set *)
+  let bits_11 = Int64.of_int 0x7FF in
+
+  (* Exponent part of IEEE 754 double, 11 bits *)
+  let exp = Int64.(logand (shift_right_logical bits 52) bits_11) in
+
+  (* Fraction part of IEEE 754 double, 52 bits from the float, with an implicit
+     1 at the 53rd bit *)
+  let frac = Int64.(logor (shift_right_logical (shift_left bits 12) 12) (shift_left (of_int 1) 52)) in
+
+  if Int64.(equal exp bits_11) then
+    (* Exponent is fully set: NaN or inf *)
+    raise (Invalid_argument "bigint_of_double: argument is NaN or inf");
+
+  (* Actual exponent value: subtract bias (1023), and 52 for the missing
+     fraction dot in `frac`. Reminder: if fractional part is `xxx...` (binary)
+     then actual fraction is `1.xxx...`, which we represent as `1xxx...` in
+     `frac`. `- 52` here is to take that lost fraction point into account. *)
+  let exp = Int64.(sub exp (of_int (1023 + 52))) in
+
+  let a = Big_int.big_int_of_int64 frac in
+
+  let a = if Int64.(compare exp (of_int 0)) < 0 then
+    (* Exponent < 0, shift right *)
+    Big_int.(shift_right_big_int a (- (Int64.to_int exp)))
+  else
+    (* Exponent >= 0, shift left *)
+    Big_int.(shift_left_big_int a (Int64.to_int exp))
+  in
+
+  (* Negate the number if sign bit is set (double is negative) *)
+  if Int64.shift_right_logical bits 63 = Int64.of_int 1 && a <> Big_int.zero_big_int then
+    Big_int.minus_big_int a
+  else
+    a
+
+(* a mild extension over Was.Int.RepType *)
+module type WordRepType =
+sig
+  include Wasm.Int.RepType
+  val of_big_int : Big_int.big_int -> t (* wrapping *)
+  val to_big_int : t -> Big_int.big_int
+end
+
+module Int64Rep : WordRepType =
+struct
+  include Int64
+  let bitwidth = 64
+  let to_hex_string = Printf.sprintf "%Lx"
+
+  let of_big_int i =
+    let open Big_int in
+    let i = mod_big_int i (power_int_positive_int 2 64) in
+    if lt_big_int i (power_int_positive_int 2 63)
+    then int64_of_big_int i
+    else int64_of_big_int (sub_big_int i (power_int_positive_int 2 64))
+
+  let to_big_int i =
+    let open Big_int in
+    if i < 0L
+    then add_big_int (big_int_of_int64 i) (power_int_positive_int 2 64)
+    else big_int_of_int64 i
+end
+
+
+(* Represent n-bit words using k-bit words by shifting left/right by k-n bits *)
+module SubRep (Rep : WordRepType) (Width : sig val bitwidth : int end) : WordRepType =
+struct
+  let _ = assert (Width.bitwidth < Rep.bitwidth)
+
+  type t = Rep.t
+
+  let bitwidth = Width.bitwidth
+  let bitdiff = Rep.bitwidth - Width.bitwidth
+  let inj r  = Rep.shift_left r bitdiff
+  let proj i = Rep.shift_right_logical i bitdiff
+
+  let zero = inj Rep.zero
+  let one = inj Rep.one
+  let minus_one = inj Rep.minus_one
+  let max_int = inj (Rep.shift_right_logical Rep.max_int bitdiff)
+  let min_int = inj (Rep.shift_right_logical Rep.min_int bitdiff)
+  let neg i = inj (Rep.neg (proj i))
+  let add i j = inj (Rep.add (proj i) (proj j))
+  let sub i j = inj (Rep.sub (proj i) (proj j))
+  let mul i j = inj (Rep.mul (proj i) (proj j))
+  let div i j = inj (Rep.div (proj i) (proj j))
+  let rem i j = inj (Rep.rem (proj i) (proj j))
+  let logand = Rep.logand
+  let logor = Rep.logor
+  let lognot i = inj (Rep.lognot (proj i))
+  let logxor i j = inj (Rep.logxor (proj i) (proj j))
+  let shift_left i j = Rep.shift_left i j
+  let shift_right i j = let res = Rep.shift_right i j in inj (proj res)
+  let shift_right_logical i j = let res = Rep.shift_right_logical i j in inj (proj res)
+  let of_int i = inj (Rep.of_int i)
+  let to_int i = Rep.to_int (proj i)
+  let to_string i = group_num (Rep.to_string (proj i))
+  let to_hex_string i = group_num (Rep.to_hex_string (proj i))
+  let of_big_int i = inj (Rep.of_big_int i)
+  let to_big_int i = Rep.to_big_int (proj i)
+end
+
+module Int8Rep = SubRep (Int64Rep) (struct let bitwidth = 8 end)
+module Int16Rep = SubRep (Int64Rep) (struct let bitwidth = 16 end)
+module Int32Rep = SubRep (Int64Rep) (struct let bitwidth = 32 end)
+
+(*
+This WordType is used only internally in this module, to implement the bit-wise
+or wrapping operations on NatN and IntN (see module Ranged)
+*)
+
+module type WordType =
+sig
+  include Wasm.Int.S
+  val neg : t -> t
+  val not : t -> t
+  val pow : t -> t -> t
+
+  val bitwidth : int
+  val of_big_int : Big_int.big_int -> t (* wrapping *)
+  val to_big_int : t -> Big_int.big_int (* returns natural numbers *)
+end
+
+module MakeWord (Rep : WordRepType) : WordType =
+struct
+  module WasmInt = Wasm.Int.Make (Rep)
+  include WasmInt
+  let neg w = sub zero w
+  let not w = xor w (of_int_s (-1))
+  let one = of_int_u 1
+  let rec pow x y =
+    if y = zero then
+      one
+    else if and_ y one = zero then
+      pow (mul x x) (shr_u y one)
+    else
+      mul x (pow x (sub y one))
+
+  let bitwidth = Rep.bitwidth
+  let of_big_int = Rep.of_big_int
+  let to_big_int = Rep.to_big_int
+end
+
+module Word8Rep  = MakeWord (Int8Rep)
+module Word16Rep = MakeWord (Int16Rep)
+module Word32Rep = MakeWord (Int32Rep)
+module Word64Rep = MakeWord (Int64Rep)
+
+module type FloatType =
+sig
+  include Wasm.Float.S
+  val rem : t -> t -> t
+  val pow : t -> t -> t
+  val to_pretty_string : t -> string
+end
+
+module MakeFloat(WasmFloat : Wasm.Float.S) =
+struct
+  include WasmFloat
+  let rem x y = of_float (Float.rem (to_float x) (to_float y))
+  let pow x y = of_float (to_float x ** to_float y)
+  let to_pretty_string w = group_num (WasmFloat.to_string w)
+  let to_string = to_pretty_string
+end
+
+module Float = MakeFloat(Wasm.F64)
+
+
+module type NumType =
+sig
+  type t
+  val signed : bool
+  val zero : t
+  val abs : t -> t
+  val neg : t -> t
+  val add : t -> t -> t
+  val sub : t -> t -> t
+  val mul : t -> t -> t
+  val div : t -> t -> t
+  val rem : t -> t -> t
+  val pow : t -> t -> t
+  val eq : t -> t -> bool
+  val ne : t -> t -> bool
+  val lt : t -> t -> bool
+  val gt : t -> t -> bool
+  val le : t -> t -> bool
+  val ge : t -> t -> bool
+  val compare : t -> t -> int
+  val to_int : t -> int
+  val of_int : int -> t
+  val to_big_int : t -> Big_int.big_int
+  val of_big_int : Big_int.big_int -> t
+  val of_string : string -> t
+  val to_string : t -> string
+  val to_pretty_string : t -> string
+end
+
+module Int : NumType with type t = Big_int.big_int =
+struct
+  open Big_int
+  type t = big_int
+  let signed = true
+  let zero = zero_big_int
+  let sub = sub_big_int
+  let abs = abs_big_int
+  let neg = minus_big_int
+  let add = add_big_int
+  let mul = mult_big_int
+  let div a b =
+    let q, m = quomod_big_int a b in
+    if sign_big_int m * sign_big_int a >= 0 then q
+    else if sign_big_int q = 1 then pred_big_int q else succ_big_int q
+  let rem a b =
+    let q, m = quomod_big_int a b in
+    let sign_m = sign_big_int m in
+    if sign_m * sign_big_int a >= 0 then m
+    else
+    let abs_b = abs_big_int b in
+    if sign_m = 1 then sub_big_int m abs_b else add_big_int m abs_b
+  let eq = eq_big_int
+  let ne x y = not (eq x y)
+  let lt = lt_big_int
+  let gt = gt_big_int
+  let le = le_big_int
+  let ge = ge_big_int
+  let compare = compare_big_int
+  let to_int = int_of_big_int
+  let of_int = big_int_of_int
+  let of_big_int i = i
+  let to_big_int i = i
+  let to_pretty_string i = group_num (string_of_big_int i)
+  let to_string = to_pretty_string
+  let of_string s =
+    big_int_of_string (String.concat "" (String.split_on_char '_' s))
+
+  let max_int = big_int_of_int max_int
+
+  let pow x y =
+    if gt y max_int
+    then raise (Invalid_argument "Int.pow")
+    else power_big_int_positive_int x (int_of_big_int y)
+end
+
+module Nat : NumType with type t = Big_int.big_int =
+struct
+  include Int
+  let signed = false
+  let of_big_int i =
+    if ge i zero then i else raise (Invalid_argument "Nat.of_big_int")
+  let sub x y =
+    let z = Int.sub x y in
+    if ge z zero then z else raise (Invalid_argument "Nat.sub")
+end
+
+(* Extension of NumType with wrapping and bit-wise operations *)
+module type BitNumType =
+sig
+  include NumType
+
+  val not : t -> t
+  val popcnt : t -> t
+  val clz : t -> t
+  val ctz : t -> t
+
+  val and_ : t -> t -> t
+  val or_ : t -> t -> t
+  val xor : t -> t -> t
+  val shl : t -> t -> t
+  val shr : t -> t -> t
+  val rotl : t -> t -> t
+  val rotr : t -> t -> t
+
+  val wrapping_of_big_int : Big_int.big_int -> t
+
+  val wadd : t -> t -> t
+  val wsub : t -> t -> t
+  val wmul : t -> t -> t
+  val wpow : t -> t -> t
+end
+
+module Ranged
+  (Rep : NumType)
+  (WordRep : WordType)
+  : BitNumType =
+struct
+  let to_word i = WordRep.of_big_int (Rep.to_big_int i)
+  let from_word i =
+    let n = WordRep.to_big_int i in
+    let n' =
+      let open Big_int in
+      if Rep.signed && le_big_int (power_int_positive_int 2 (WordRep.bitwidth - 1)) n
+      then sub_big_int n (power_int_positive_int 2 (WordRep.bitwidth))
+      else n
+    in
+    Rep.of_big_int n'
+
+  let check i =
+    if Rep.eq (from_word (to_word i)) i
+    then i
+    else raise (Invalid_argument "value out of bounds")
+
+  include Rep
+  (* bounds-checking operations *)
+  let neg a = let res = Rep.neg a in check res
+  let abs a = let res = Rep.abs a in check res
+  let add a b = let res = Rep.add a b in check res
+  let sub a b = let res = Rep.sub a b in check res
+  let mul a b = let res = Rep.mul a b in check res
+  let div a b = let res = Rep.div a b in check res
+  let pow a b = let res = Rep.pow a b in check res
+  let of_int i = let res = Rep.of_int i in check res
+  let of_big_int i = let res = Rep.of_big_int i in check res
+  let of_string s = let res = Rep.of_string s in check res
+
+  let on_word op a = from_word (op (to_word a))
+  let on_words op a b = from_word (op (to_word a) (to_word b))
+
+  (* bit-wise operations *)
+  let not = on_word WordRep.not
+  let popcnt = on_word WordRep.popcnt
+  let clz = on_word WordRep.clz
+  let ctz = on_word WordRep.ctz
+
+  let and_ = on_words WordRep.and_
+  let or_ = on_words WordRep.or_
+  let xor = on_words WordRep.xor
+  let shl = on_words WordRep.shl
+  let shr = on_words (if Rep.signed then WordRep.shr_s else WordRep.shr_u)
+  let rotl = on_words WordRep.rotl
+  let rotr = on_words WordRep.rotr
+
+
+  (* wrapping operations *)
+  let wrapping_of_big_int i = from_word (WordRep.of_big_int i)
+
+  let wadd = on_words WordRep.add
+  let wsub = on_words WordRep.sub
+  let wmul = on_words WordRep.mul
+  let wpow a b =
+    if Rep.ge b Rep.zero
+    then on_words WordRep.pow a b
+    else raise (Invalid_argument "negative exponent")
+end
+
+module Nat8 = Ranged (Nat) (Word8Rep)
+module Nat16 = Ranged (Nat) (Word16Rep)
+module Nat32 = Ranged (Nat) (Word32Rep)
+module Nat64 = Ranged (Nat) (Word64Rep)
+
+module Int_8 = Ranged (Int) (Word8Rep)
+module Int_16 = Ranged (Int) (Word16Rep)
+module Int_32 = Ranged (Int) (Word32Rep)
+module Int_64 = Ranged (Int) (Word64Rep)
+
+
+
+ + + diff --git a/coverage/mo_values/operator.ml.html b/coverage/mo_values/operator.ml.html new file mode 100644 index 00000000000..93558b98e8d --- /dev/null +++ b/coverage/mo_values/operator.ml.html @@ -0,0 +1,921 @@ + + + + + operator.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+
+
open Value
+open Numerics
+
+module T = Mo_types.Type
+
+(* Operators *)
+
+type unop =
+  | PosOp                                       (* +x *)
+  | NegOp                                       (* -x *)
+  | NotOp                                       (* bitwise negation *)
+
+type binop =
+  | AddOp                                       (* x+y *)
+  | SubOp                                       (* x-y *)
+  | MulOp                                       (* x*y *)
+  | DivOp                                       (* x/y *)
+  | ModOp                                       (* x%y *)
+  | PowOp                                       (* x^y *)
+  | AndOp                                       (* bitwise operators... *)
+  | OrOp
+  | XorOp
+  | ShLOp
+  | ShROp
+  | RotLOp
+  | RotROp
+  | WAddOp                                      (* wrapping operators... *)
+  | WSubOp
+  | WMulOp
+  | WPowOp
+  | CatOp                                       (* concatenation *)
+
+type relop =
+  | EqOp                                        (* x=y *)
+  | NeqOp                                       (* x!=y *)
+  | LtOp                                        (* x<y *)
+  | GtOp                                        (* x>y *)
+  | LeOp                                        (* x<=y *)
+  | GeOp                                        (* x>=y *)
+
+let impossible _ = raise (Invalid_argument "operator called for None")
+
+
+(* Unary operators *)
+
+(* bit-wise unops *)
+let bit_unop (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) = function
+  | T.Nat8 -> fun v -> Nat8 (fnat8 (as_nat8 v))
+  | T.Nat16 -> fun v -> Nat16 (fnat16 (as_nat16 v))
+  | T.Nat32 -> fun v -> Nat32 (fnat32 (as_nat32 v))
+  | T.Nat64 -> fun v -> Nat64 (fnat64 (as_nat64 v))
+  | T.Int8 -> fun v -> Int8 (fint8 (as_int8 v))
+  | T.Int16 -> fun v -> Int16 (fint16 (as_int16 v))
+  | T.Int32 -> fun v -> Int32 (fint32 (as_int32 v))
+  | T.Int64 -> fun v -> Int64 (fint64 (as_int64 v))
+  | _ -> raise (Invalid_argument "unop")
+
+(* types that support sign operations (+, -)  *)
+let sign_unop fint (fint8, fint16, fint32, fint64) ffloat = function
+  | T.Int -> fun v -> Int (fint (as_int v))
+  | T.Int8 -> fun v -> Int8 (fint8 (as_int8 v))
+  | T.Int16 -> fun v -> Int16 (fint16 (as_int16 v))
+  | T.Int32 -> fun v -> Int32 (fint32 (as_int32 v))
+  | T.Int64 -> fun v -> Int64 (fint64 (as_int64 v))
+  | T.Float -> fun v -> Float (ffloat (as_float v))
+  | _ -> raise (Invalid_argument "unop")
+
+let unop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | PosOp -> Fun.(sign_unop id (id, id, id, id) id p)
+    | NegOp ->
+      sign_unop
+        Int.neg
+        (Int_8.neg, Int_16.neg, Int_32.neg, Int_64.neg)
+        Float.neg
+        p
+    | NotOp -> bit_unop
+      (Nat8.not, Nat16.not, Nat32.not, Nat64.not,
+       Int_8.not, Int_16.not, Int_32.not, Int_64.not)
+      p
+    )
+  | T.Non -> impossible
+  | _ -> raise (Invalid_argument "unop")
+
+
+(* Binary operators *)
+
+let text_binop ftext = function
+  | T.Text -> fun v1 v2 -> Text (ftext (as_text v1) (as_text v2))
+  | _ -> raise (Invalid_argument "binop")
+
+let fixed_binop (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) = function
+  | T.Nat8 -> fun v1 v2 -> Nat8 (fnat8 (as_nat8 v1) (as_nat8 v2))
+  | T.Nat16 -> fun v1 v2 -> Nat16 (fnat16 (as_nat16 v1) (as_nat16 v2))
+  | T.Nat32 -> fun v1 v2 -> Nat32 (fnat32 (as_nat32 v1) (as_nat32 v2))
+  | T.Nat64 -> fun v1 v2 -> Nat64 (fnat64 (as_nat64 v1) (as_nat64 v2))
+  | T.Int8 -> fun v1 v2 -> Int8 (fint8 (as_int8 v1) (as_int8 v2))
+  | T.Int16 -> fun v1 v2 -> Int16 (fint16 (as_int16 v1) (as_int16 v2))
+  | T.Int32 -> fun v1 v2 -> Int32 (fint32 (as_int32 v1) (as_int32 v2))
+  | T.Int64 -> fun v1 v2 -> Int64 (fint64 (as_int64 v1) (as_int64 v2))
+  | _ -> raise (Invalid_argument "binop")
+
+let num_binop fnat fint ffixed ffloat = function
+  | T.Nat -> fun v1 v2 -> Int (fnat (as_int v1) (as_int v2))
+  | T.Int -> fun v1 v2 -> Int (fint (as_int v1) (as_int v2))
+  | T.Float -> fun v1 v2 -> Float (ffloat (as_float v1) (as_float v2))
+  | t -> fixed_binop ffixed t
+
+let binop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | AddOp -> num_binop Nat.add Int.add (Nat8.add, Nat16.add, Nat32.add, Nat64.add, Int_8.add, Int_16.add, Int_32.add, Int_64.add) Float.add p
+    | SubOp -> num_binop Nat.sub Int.sub (Nat8.sub, Nat16.sub, Nat32.sub, Nat64.sub, Int_8.sub, Int_16.sub, Int_32.sub, Int_64.sub) Float.sub p
+    | MulOp -> num_binop Nat.mul Int.mul (Nat8.mul, Nat16.mul, Nat32.mul, Nat64.mul, Int_8.mul, Int_16.mul, Int_32.mul, Int_64.mul) Float.mul p
+    | DivOp -> num_binop Nat.div Int.div (Nat8.div, Nat16.div, Nat32.div, Nat64.div, Int_8.div, Int_16.div, Int_32.div, Int_64.div) Float.div p
+    | ModOp -> num_binop Nat.rem Int.rem (Nat8.rem, Nat16.rem, Nat32.rem, Nat64.rem, Int_8.rem, Int_16.rem, Int_32.rem, Int_64.rem) Float.rem p
+    | PowOp -> num_binop Nat.pow Int.pow (Nat8.pow, Nat16.pow, Nat32.pow, Nat64.pow, Int_8.pow, Int_16.pow, Int_32.pow, Int_64.pow) Float.pow p
+    | AndOp -> fixed_binop (Nat8.and_, Nat16.and_, Nat32.and_, Nat64.and_, Int_8.and_, Int_16.and_, Int_32.and_, Int_64.and_) p
+    | OrOp  -> fixed_binop (Nat8.or_, Nat16.or_, Nat32.or_, Nat64.or_, Int_8.or_, Int_16.or_, Int_32.or_, Int_64.or_) p
+    | XorOp -> fixed_binop (Nat8.xor, Nat16.xor, Nat32.xor, Nat64.xor, Int_8.xor, Int_16.xor, Int_32.xor, Int_64.xor) p
+    | ShLOp -> fixed_binop (Nat8.shl, Nat16.shl, Nat32.shl, Nat64.shl, Int_8.shl, Int_16.shl, Int_32.shl, Int_64.shl) p
+    | ShROp -> fixed_binop (Nat8.shr, Nat16.shr, Nat32.shr, Nat64.shr, Int_8.shr, Int_16.shr, Int_32.shr, Int_64.shr) p
+    | RotLOp -> fixed_binop (Nat8.rotl, Nat16.rotl, Nat32.rotl, Nat64.rotl, Int_8.rotl, Int_16.rotl, Int_32.rotl, Int_64.rotl) p
+    | RotROp -> fixed_binop (Nat8.rotr, Nat16.rotr, Nat32.rotr, Nat64.rotr, Int_8.rotr, Int_16.rotr, Int_32.rotr, Int_64.rotr) p
+    | WAddOp -> fixed_binop (Nat8.wadd, Nat16.wadd, Nat32.wadd, Nat64.wadd, Int_8.wadd, Int_16.wadd, Int_32.wadd, Int_64.wadd) p
+    | WSubOp -> fixed_binop (Nat8.wsub, Nat16.wsub, Nat32.wsub, Nat64.wsub, Int_8.wsub, Int_16.wsub, Int_32.wsub, Int_64.wsub) p
+    | WMulOp -> fixed_binop (Nat8.wmul, Nat16.wmul, Nat32.wmul, Nat64.wmul, Int_8.wmul, Int_16.wmul, Int_32.wmul, Int_64.wmul) p
+    | WPowOp -> fixed_binop (Nat8.wpow, Nat16.wpow, Nat32.wpow, Nat64.wpow, Int_8.wpow, Int_16.wpow, Int_32.wpow, Int_64.wpow) p
+    | CatOp -> text_binop (^) p
+    )
+  | T.Non -> impossible
+  | _ -> raise (Invalid_argument "binop")
+
+
+(* Relational operators *)
+
+let num_relop fnat fint (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) ffloat = function
+  | T.Nat -> fun v1 v2 -> Bool (fnat (as_int v1) (as_int v2))
+  | T.Nat8 -> fun v1 v2 -> Bool (fnat8 (as_nat8 v1) (as_nat8 v2))
+  | T.Nat16 -> fun v1 v2 -> Bool (fnat16 (as_nat16 v1) (as_nat16 v2))
+  | T.Nat32 -> fun v1 v2 -> Bool (fnat32 (as_nat32 v1) (as_nat32 v2))
+  | T.Nat64 -> fun v1 v2 -> Bool (fnat64 (as_nat64 v1) (as_nat64 v2))
+  | T.Int -> fun v1 v2 -> Bool (fint (as_int v1) (as_int v2))
+  | T.Int8 -> fun v1 v2 -> Bool (fint8 (as_int8 v1) (as_int8 v2))
+  | T.Int16 -> fun v1 v2 -> Bool (fint16 (as_int16 v1) (as_int16 v2))
+  | T.Int32 -> fun v1 v2 -> Bool (fint32 (as_int32 v1) (as_int32 v2))
+  | T.Int64 -> fun v1 v2 -> Bool (fint64 (as_int64 v1) (as_int64 v2))
+  | T.Float -> fun v1 v2 -> Bool (ffloat (as_float v1) (as_float v2))
+  | _ -> raise (Invalid_argument "relop")
+
+let ord_relop fnat fint fwords ffloat fchar ftext fblob = function
+  | T.Char -> fun v1 v2 -> Bool (fchar (as_char v1) (as_char v2))
+  | T.Text -> fun v1 v2 -> Bool (ftext (as_text v1) (as_text v2))
+  | T.Blob | T.Principal -> fun v1 v2 -> Bool (ftext (as_blob v1) (as_blob v2))
+  | t -> num_relop fnat fint fwords ffloat t
+
+let eq_relop fnat fint fwords ffloat fchar ftext fblob fnull fbool = function
+  | T.Null -> fun v1 v2 -> Bool (fnull (as_null v1) (as_null v2))
+  | T.Bool -> fun v1 v2 -> Bool (fbool (as_bool v1) (as_bool v2))
+  | t -> ord_relop fnat fint fwords ffloat fchar ftext fblob t
+
+let eq_prim =
+  eq_relop Nat.eq  Int.eq (Nat8.eq, Nat16.eq, Nat32.eq, Nat64.eq, Int_8.eq, Int_16.eq, Int_32.eq, Int_64.eq) Float.eq (=) (=) (=) (=) (=)
+
+(* Follows the structure of `shared` in mo_type/type.ml *)
+let structural_equality t =
+  let rec go t =
+    match t with
+    | T.Var _ | T.Pre | T.Non | T.Async _ | T.Mut _ -> assert false
+    | T.Any | T.Typ _ -> fun v1 v2 -> Bool true
+    | T.Prim p -> eq_prim p
+    | T.Con (c, ts) -> (
+        match Mo_types.Cons.kind c with
+        | T.Abs _ -> assert false
+        | T.Def (_, t) -> go (T.open_ ts t) (* TBR this may fail to terminate *)
+        )
+    | T.Array t ->
+        fun v1 v2 ->
+          let eq_elem = go t in
+          let v1 = as_array v1 in
+          let v2 = as_array v2 in
+          Bool (
+            Array.length v1 == Array.length v2 &&
+            Lib.Array.for_all2 (fun x y -> as_bool (eq_elem x y)) v1 v2
+          )
+    | T.Opt t -> (
+        fun v1 v2 ->
+          match (v1, v2) with
+          | Null, Null -> Bool true
+          | Null, Opt _ 
+          | Opt _, Null -> Bool false
+          | Opt v1, Opt v2 -> go t v1 v2
+          | _, _ -> assert false )
+    | T.Tup ts ->
+        fun v1 v2 ->
+          let v1 = as_tup v1 in
+          let v2 = as_tup v2 in
+          let rec go_inner ts v1 v2 =
+            match (ts, v1, v2) with
+            | [], [], [] -> true
+            | t :: ts, v1 :: v1s, v2 :: v2s ->
+                as_bool (go t v1 v2) && go_inner ts v1s v2s
+            | _ -> assert false
+          in
+          Bool (go_inner ts v1 v2)
+    | T.Obj (s, fs) -> (
+        match s with
+        | T.Actor ->
+            fun v1 v2 ->
+              (match (v1, v2) with
+               | Blob s1, Blob s2 -> Bool (s1 = s2)
+               | _, _ -> Bool (v1 == v2) (* HACK *))
+        | T.Module | T.Memory -> assert false
+        | T.Object ->
+            fun v1 v2 ->
+              let v1 = as_obj v1 in
+              let v2 = as_obj v2 in
+              Bool
+                (List.for_all
+                   (fun f ->
+                     T.is_typ f.T.typ ||
+                     as_bool
+                       (go f.T.typ (Env.find f.T.lab v1) (Env.find f.T.lab v2)))
+                   fs) )
+    | T.Variant fs ->
+        fun v1 v2 ->
+          let l1, v1 = as_variant v1 in
+          let l2, v2 = as_variant v2 in
+          if l1 <> l2 then Bool false
+          else
+            go (List.find (fun f -> f.T.lab = l1) fs).T.typ v1 v2
+    | T.Func (s, c, tbs, ts1, ts2) ->
+        assert (T.is_shared_sort s);
+        fun v1 v2 -> Bool (v1 == v2)  (* HACK *)
+  in
+  go t
+
+let relop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | EqOp -> eq_prim p
+    | NeqOp -> eq_relop Nat.ne Int.ne (Nat8.ne, Nat16.ne, Nat32.ne, Nat64.ne, Int_8.ne, Int_16.ne, Int_32.ne, Int_64.ne) Float.ne (<>) (<>) (<>) (<>) (<>) p
+    | LtOp -> ord_relop Nat.lt Int.lt (Nat8.lt, Nat16.lt, Nat32.lt, Nat64.lt, Int_8.lt, Int_16.lt, Int_32.lt, Int_64.lt) Float.lt (<) (<) (<) p
+    | GtOp -> ord_relop Nat.gt Int.gt (Nat8.gt, Nat16.gt, Nat32.gt, Nat64.gt, Int_8.gt, Int_16.gt, Int_32.gt, Int_64.gt) Float.gt (>) (>) (>) p
+    | LeOp -> ord_relop Nat.le Int.le (Nat8.le, Nat16.le, Nat32.le, Nat64.le, Int_8.le, Int_16.le, Int_32.le, Int_64.le) Float.le (<=) (<=) (<=) p
+    | GeOp -> ord_relop Nat.ge Int.ge (Nat8.ge, Nat16.ge, Nat32.ge, Nat64.ge, Int_8.ge, Int_16.ge, Int_32.ge, Int_64.ge) Float.ge (>=) (>=) (>=) p
+    )
+  | T.Non -> impossible
+  | t when op = EqOp && T.shared t ->
+    structural_equality t
+  | t when op = NeqOp && T.shared t ->
+    fun v1 v2 -> Bool (not (as_bool (structural_equality t v1 v2)))
+  | _ -> raise (Invalid_argument "relop")
+
+
+let has f op t = try ignore (f op t); true with Invalid_argument _ -> false
+let has_unop op t = has unop op t
+let has_binop op t = has binop op t
+let has_relop op t = has relop op t
+
+let type_unop op t = if t = T.nat then T.int else t
+let type_binop op t = t
+let type_relop op t = t
+
+
+
+ + + diff --git a/coverage/mo_values/prim.ml.html b/coverage/mo_values/prim.ml.html new file mode 100644 index 00000000000..ece72447abd --- /dev/null +++ b/coverage/mo_values/prim.ml.html @@ -0,0 +1,1376 @@ + + + + + prim.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+
+
(* Primitives *)
+open Mo_types
+
+open Value
+open Numerics
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let as_big_int = function
+  | Type.Nat -> fun v -> Nat.to_big_int (as_int v)
+  | Type.Int -> fun v -> Int.to_big_int (as_int v)
+  | Type.Nat8 -> fun v -> Nat8.to_big_int (as_nat8 v)
+  | Type.Nat16 -> fun v -> Nat16.to_big_int (as_nat16 v)
+  | Type.Nat32 -> fun v -> Nat32.to_big_int (as_nat32 v)
+  | Type.Nat64 -> fun v -> Nat64.to_big_int (as_nat64 v)
+  | Type.Int8 -> fun v -> Int_8.to_big_int (as_int8 v)
+  | Type.Int16 -> fun v -> Int_16.to_big_int (as_int16 v)
+  | Type.Int32 -> fun v -> Int_32.to_big_int (as_int32 v)
+  | Type.Int64 -> fun v -> Int_64.to_big_int (as_int64 v)
+  | Type.Char -> fun v -> Big_int.big_int_of_int (as_char v)
+  | t -> raise (Invalid_argument ("Value.as_big_int: " ^ Type.string_of_typ (Type.Prim t)))
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let of_big_int_trap = function
+  | Type.Nat -> fun i -> Int (Nat.of_big_int i)
+  | Type.Int -> fun i -> Int (Int.of_big_int i)
+  | Type.Nat8 -> fun i -> Nat8 (Nat8.of_big_int i)
+  | Type.Nat16 -> fun i -> Nat16 (Nat16.of_big_int i)
+  | Type.Nat32 -> fun i -> Nat32 (Nat32.of_big_int i)
+  | Type.Nat64 -> fun i -> Nat64 (Nat64.of_big_int i)
+  | Type.Int8 -> fun i -> Int8 (Int_8.of_big_int i)
+  | Type.Int16 -> fun i -> Int16 (Int_16.of_big_int i)
+  | Type.Int32 -> fun i -> Int32 (Int_32.of_big_int i)
+  | Type.Int64 -> fun i -> Int64 (Int_64.of_big_int i)
+  | Type.Char -> fun i ->
+    let i = Big_int.int_of_big_int i in
+    if i < 0xD800 || i >= 0xE000 && i < 0x110000 then Char i else raise (Invalid_argument "character value out of bounds")
+  | t -> raise (Invalid_argument ("Value.of_big_int_trap: " ^ Type.string_of_typ (Type.Prim t)))
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let of_big_int_wrap = function
+  | Type.Nat8 -> fun i -> Nat8 (Nat8.wrapping_of_big_int i)
+  | Type.Nat16 -> fun i -> Nat16 (Nat16.wrapping_of_big_int i)
+  | Type.Nat32 -> fun i -> Nat32 (Nat32.wrapping_of_big_int i)
+  | Type.Nat64 -> fun i -> Nat64 (Nat64.wrapping_of_big_int i)
+  | Type.Int8 -> fun i -> Int8 (Int_8.wrapping_of_big_int i)
+  | Type.Int16 -> fun i -> Int16 (Int_16.wrapping_of_big_int i)
+  | Type.Int32 -> fun i -> Int32 (Int_32.wrapping_of_big_int i)
+  | Type.Int64 -> fun i -> Int64 (Int_64.wrapping_of_big_int i)
+  | t -> raise (Invalid_argument ("Value.of_big_int_wrap: " ^ Type.string_of_typ (Type.Prim t)))
+
+(*
+Wrapping numeric conversions are all specified uniformly by going through bigint
+*)
+
+type trap = { trap : 'a. string -> 'a  }
+
+(* Trapping conversions (the num_conv_t1_t2 prim used in prelude/prelude.ml) *)
+let num_conv_trap_prim trap t1 t2 =
+  let module T = Type in
+  match t1, t2 with
+  | T.Nat, T.(T.Nat8|Nat16|Nat32|Nat64)
+  | T.Int, T.(Int8|Int16|Int32|Int64)
+  | T.(Nat8|Nat16|Nat32|Nat64), T.Nat
+  | T.(Int8|Int16|Int32|Int64), T.Int
+  | T.Nat32, T.Char
+  -> fun v -> (try of_big_int_trap t2 (as_big_int t1 v)
+               with Invalid_argument msg -> trap.trap msg)
+
+  | T.Float, T.Int64 -> fun v -> Int64 (Int_64.of_big_int (bigint_of_double (as_float v)))
+  | T.Int64, T.Float -> fun v -> Float (Wasm.F64_convert.convert_i64_s (Big_int.int64_of_big_int (Int_64.to_big_int (as_int64 v))))
+
+  | T.Float, T.Int -> fun v -> Int (Int.of_big_int (bigint_of_double (as_float v)))
+  | T.Int, T.Float -> fun v -> Float (Wasm.F64.of_float (Big_int.float_of_big_int (Int.to_big_int (as_int v))))
+
+  | t1, t2 -> trap.trap T.("Value.num_conv_trap_prim: " ^ string_of_typ (Prim t1) ^ string_of_typ (Prim t2))
+
+(*
+It is the responsibility of prelude/prelude.ml to define num_wrap_t1_t2 only
+for suitable types t1 and t2
+*)
+let num_conv_wrap_prim trap t1 t2 =
+  fun v -> try of_big_int_wrap t2 (as_big_int t1 v)
+           with Invalid_argument msg -> trap.trap msg
+
+let prim trap =
+  let via_float f v = Float.(Float (of_float (f (to_float (as_float v))))) in
+  let via_float2 f v w = Float.(Float (of_float (f (to_float (as_float v)) (to_float (as_float w))))) in
+  let unpack_nat8 v = Nat8.to_int (as_nat8 v) in
+  let float_formatter prec : int -> float -> string =
+    let open Printf in
+    function
+    | 0 -> sprintf "%.*f" prec 
+    | 1 -> sprintf "%.*e" prec
+    | 2 -> sprintf "%.*g" prec
+    | 3 -> sprintf "%.*h" prec
+    | _ -> fun _ -> trap.trap "float_formatter: unrecognised mode" in
+  function
+  | "abs" -> fun _ v k -> k (Int (Nat.abs (as_int v)))
+  | "fabs" -> fun _ v k -> k (Float (Float.abs (as_float v)))
+  | "fsqrt" -> fun _ v k -> k (Float (Float.sqrt (as_float v)))
+  | "fceil" -> fun _ v k -> k (Float (Float.ceil (as_float v)))
+  | "ffloor" -> fun _ v k -> k (Float (Float.floor (as_float v)))
+  | "ftrunc" -> fun _ v k -> k (Float (Float.trunc (as_float v)))
+  | "fnearest" -> fun _ v k -> k (Float (Float.nearest (as_float v)))
+  | "fmin" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.min (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "fmax" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.max (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "fcopysign" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.copysign (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "Float->Text" -> fun _ v k -> k (Text (Float.to_string (as_float v)))
+  | "fmtFloat->Text" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [f; prec; mode] ->
+       k (Text (float_formatter (unpack_nat8 prec) (unpack_nat8 mode) Float.(to_float (as_float f))))
+     | _ -> assert false)
+  | "fsin" -> fun _ v k -> k (via_float Stdlib.sin v)
+  | "fcos" -> fun _ v k -> k (via_float Stdlib.cos v)
+  | "ftan" -> fun _ v k -> k (via_float Stdlib.tan v)
+  | "fasin" -> fun _ v k -> k (via_float Stdlib.asin v)
+  | "facos" -> fun _ v k -> k (via_float Stdlib.acos v)
+  | "fatan" -> fun _ v k -> k (via_float Stdlib.atan v)
+  | "fatan2" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [y; x] -> k (via_float2 Stdlib.atan2 y x)
+     | _ -> assert false)
+  | "fexp" -> fun _ v k -> k (via_float Stdlib.exp v)
+  | "flog" -> fun _ v k -> k (via_float Stdlib.log v)
+
+  | "popcnt8" | "popcnt16" | "popcnt32" | "popcnt64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. popcnt w)
+        | Nat16 w -> Nat16 (Nat16.popcnt w)
+        | Nat32 w -> Nat32 (Nat32.popcnt w)
+        | Nat64 w -> Nat64 (Nat64.popcnt w)
+        | Int8  w -> Int8  (Int_8. popcnt w)
+        | Int16 w -> Int16 (Int_16.popcnt w)
+        | Int32 w -> Int32 (Int_32.popcnt w)
+        | Int64 w -> Int64 (Int_64.popcnt w)
+        | _ -> failwith "popcnt")
+
+  | "clz8" | "clz16" | "clz32" | "clz64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. clz w)
+        | Nat16 w -> Nat16 (Nat16.clz w)
+        | Nat32 w -> Nat32 (Nat32.clz w)
+        | Nat64 w -> Nat64 (Nat64.clz w)
+        | Int8  w -> Int8  (Int_8. clz w)
+        | Int16 w -> Int16 (Int_16.clz w)
+        | Int32 w -> Int32 (Int_32.clz w)
+        | Int64 w -> Int64 (Int_64.clz w)
+        | _ -> failwith "clz")
+
+  | "ctz8" | "ctz16" | "ctz32" | "ctz64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. ctz w)
+        | Nat16 w -> Nat16 (Nat16.ctz w)
+        | Nat32 w -> Nat32 (Nat32.ctz w)
+        | Nat64 w -> Nat64 (Nat64.ctz w)
+        | Int8  w -> Int8  (Int_8. ctz w)
+        | Int16 w -> Int16 (Int_16.ctz w)
+        | Int32 w -> Int32 (Int_32.ctz w)
+        | Int64 w -> Int64 (Int_64.ctz w)
+        | _ -> failwith "ctz")
+
+  | "btst8" | "btst16" | "btst32" | "btst64" ->
+     fun _ v k ->
+     let w, a = as_pair v
+     in k (match w with
+           | Nat8  y -> Nat8  Nat8. (and_ y (shl (of_int 1) (as_nat8  a)))
+           | Nat16 y -> Nat16 Nat16.(and_ y (shl (of_int 1) (as_nat16 a)))
+           | Nat32 y -> Nat32 Nat32.(and_ y (shl (of_int 1) (as_nat32 a)))
+           | Nat64 y -> Nat64 Nat64.(and_ y (shl (of_int 1) (as_nat64 a)))
+           | Int8  y -> Int8  Int_8. (and_ y (shl (of_int 1) (as_int8  a)))
+           | Int16 y -> Int16 Int_16.(and_ y (shl (of_int 1) (as_int16 a)))
+           | Int32 y -> Int32 Int_32.(and_ y (shl (of_int 1) (as_int32 a)))
+           | Int64 y -> Int64 Int_64.(and_ y (shl (of_int 1) (as_int64 a)))
+           | _ -> failwith "btst")
+
+  | "lsh_Nat" -> fun _ v k ->
+    (match as_tup v with
+     | [x; shift] -> k (Int Numerics.Int.(mul (as_int x) (pow (of_int 2) (of_big_int (Nat32.to_big_int (as_nat32 shift))))))
+     | _ -> failwith "lsh_Nat")
+  | "rsh_Nat" -> fun _ v k ->
+    (match as_tup v with
+     | [x; shift] -> k (Int Numerics.Int.(div (as_int x) (pow (of_int 2) (of_big_int (Nat32.to_big_int (as_nat32 shift))))))
+     | _ -> failwith "rsh_Nat")
+
+  | "conv_Char_Text" -> fun _ v k -> let str = match as_char v with
+                                          | c when c <= 0o177 -> String.make 1 (Char.chr c)
+                                          | code -> Lib.Utf8.encode [code]
+                               in k (Text str)
+  | "print" -> fun _ v k -> Printf.printf "%s\n%!" (as_text v); k unit
+  | "trap" -> fun _ v k -> trap.trap ("explicit trap: " ^ (as_text v))
+  | "rts_version" -> fun _ v k -> as_unit v; k (Text "0.1")
+  | (  "rts_memory_size"
+     | "rts_heap_size"
+     | "rts_total_allocation"
+     | "rts_reclaimed"
+     | "rts_max_live_size"
+     | "rts_callback_table_count"
+     | "rts_callback_table_size"
+     | "rts_mutator_instructions"
+     | "rts_collector_instructions") ->
+        fun _ v k -> as_unit v; k (Int (Int.of_int 0))
+  | "time" -> fun _ v k -> as_unit v; k (Value.Nat64 (Numerics.Nat64.of_int 42))
+  | "idlHash" -> fun _ v k ->
+    let s = as_text v in
+    k (Nat32 (Nat32.wrapping_of_big_int (Big_int.big_int_of_int32 (Lib.Uint32.to_int32 (Idllib.IdlHash.idl_hash s)))))
+  | "crc32Hash" -> fun _ v k -> let s = as_blob v in
+    let i = Optint.(to_int32 (Checkseum.Crc32.digest_string s 0 (String.length s) zero)) in
+    k (Nat32 (Nat32.wrapping_of_big_int (Big_int.big_int_of_int32 i)))
+  | "array_len" -> fun _ v k ->
+    k (Int (Int.of_int (Array.length (Value.as_array v))))
+  | "blob_size" -> fun _ v k ->
+    k (Int (Nat.of_int (String.length (Value.as_blob v))))
+  | "blob_vals_iter" -> fun _ v k ->
+    let s = String.to_seq (Value.as_blob v) in
+    let valuation b = Nat8 (Nat8.of_int (Char.code b)) in
+    k (Iter (ref (Seq.map valuation s)))
+  | "blob_iter_done" | "text_iter_done" -> fun _ v k ->
+    let i = Value.as_iter v in
+    k (Bool (!i () = Seq.Nil))
+  | "blob_iter_next" | "text_iter_next" -> fun _ v k ->
+    let i = Value.as_iter v in
+    begin match !i () with
+    | Seq.Nil -> assert false
+    | Seq.Cons (v, vs) -> i := vs; k v
+    end
+  | "text_len" -> fun _ v k ->
+    k (Int (Nat.of_int (List.length (Lib.Utf8.decode (Value.as_text v)))))
+  | "text_compare" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Int8 (Int_8.of_int
+                            (let a, b = Value.as_text a, Value.as_text b in
+                             if a = b then 0 else if a < b then -1 else 1)))
+     | _ -> assert false)
+  | "blob_compare" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Int8 (Int_8.of_int
+                            (let a, b = Value.as_blob a, Value.as_blob b in
+                             if a = b then 0 else if a < b then -1 else 1)))
+     | _ -> assert false)
+  | "text_iter" -> fun _ v k ->
+    let s = Lib.Utf8.decode (Value.as_text v) in
+    let i = Seq.map (fun c -> Char c) (List.to_seq s) in
+    k (Iter (ref i))
+  | "Array.init" -> fun _ v k ->
+    (match Value.as_tup v with
+    | [len; x] ->
+      k (Array (Array.init (Int.to_int (as_int len)) (fun _ -> Mut (ref x))))
+    | _ -> assert false
+    )
+  | "Array.tabulate" -> fun c v k ->
+    (match Value.as_tup v with
+    | [len; g] ->
+      let len_nat = Int.to_int (as_int len) in
+      let (_, g') = Value.as_func g in
+      let rec go prefix k i =
+        if i == len_nat
+        then k (Array (Array.of_list (prefix [])))
+        else g' c (Int (Int.of_int i)) (fun x -> go (fun tl -> prefix (x::tl)) k (i + 1))
+      in go (fun xs -> xs) k 0
+    | _ -> assert false
+    )
+  | "blobToArray" -> fun _ v k ->
+    k (Array (Array.of_seq (Seq.map (fun c ->
+      Nat8 (Nat8.of_int (Char.code c))
+    ) (String.to_seq (Value.as_blob v)))))
+  | "blobToArrayMut" -> fun _ v k ->
+    k (Array (Array.of_seq (Seq.map (fun c ->
+      Mut (ref (Nat8 (Nat8.of_int (Char.code c))))
+    ) (String.to_seq (Value.as_blob v)))))
+  | "arrayToBlob" -> fun _ v k ->
+    k (Blob (String.of_seq (Seq.map (fun v ->
+      Char.chr (Nat8.to_int (Value.as_nat8 v))
+    ) (Array.to_seq (Value.as_array v)))))
+  | "arrayMutToBlob" -> fun _ v k ->
+    k (Blob (String.of_seq (Seq.map (fun v ->
+      Char.chr (Nat8.to_int (Value.as_nat8 !(Value.as_mut v)))
+    ) (Array.to_seq (Value.as_array v)))))
+
+  | "cast" -> fun _ v k -> k v
+
+  (* calls never fail in the interpreter *)
+  | "call_perform_status" -> fun _ v k -> k (Nat32 Nat32.zero)
+  | "call_perform_message" -> fun _ v k -> k (Value.Text "")
+
+  | p when Lib.String.chop_prefix "num_conv" p <> None ->
+    begin match String.split_on_char '_' p with
+    | [_;_;s1;s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      fun env v k -> k (num_conv_trap_prim trap p1 p2 v)
+    | _ -> assert false
+    end
+
+  | p when Lib.String.chop_prefix "num_wrap" p <> None ->
+    begin match String.split_on_char '_' p with
+    | [_;_;s1;s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      fun env v k -> k (num_conv_wrap_prim trap p1 p2 v)
+    | _ -> assert false
+    end
+
+  | "char_to_upper" ->
+      fun _ v k ->
+        begin match Uucp.Case.Map.to_upper (Uchar.of_int (as_char v)) with
+        | `Uchars [c] -> k (Char (Uchar.to_int c))
+        | `Uchars _ ->
+            (* RTS implementation of to_upper returns the input for characters
+               that map to multiple characters in uppercase versions, so to be
+               in sync with that we do the same here *)
+            k v
+        | `Self -> k v
+        end
+
+  | "char_to_lower" ->
+      fun _ v k ->
+        begin match Uucp.Case.Map.to_lower (Uchar.of_int (as_char v)) with
+        | `Uchars [c] -> k (Char (Uchar.to_int c))
+        | `Uchars _ -> k v (* same as above, in char_to_upper *)
+        | `Self -> k v
+        end
+
+  | "char_is_whitespace" ->
+      fun _ v k -> k (Bool (Uucp.White.is_white_space (Uchar.of_int (as_char v))))
+
+  | "char_is_lowercase" ->
+      fun _ v k -> k (Bool (Uucp.Case.is_lower (Uchar.of_int (as_char v))))
+
+  | "char_is_uppercase" ->
+      fun _ v k -> k (Bool (Uucp.Case.is_upper (Uchar.of_int (as_char v))))
+
+  | "char_is_alphabetic" ->
+      fun _ v k -> k (Bool (Uucp.Alpha.is_alphabetic (Uchar.of_int (as_char v))))
+
+  | "decodeUtf8" ->
+      fun _ v k ->
+        let s = as_blob v in
+        begin match Lib.Utf8.decode s with
+          | _ -> k (Opt (Text s))
+          | exception Lib.Utf8.Utf8 -> k Null
+        end
+
+  | "encodeUtf8" ->
+      fun _ v k -> k (Blob (as_text v))
+
+  | "is_controller" ->
+      fun _ v k -> k (Bool false)
+
+  | "canister_version" ->
+      fun _ v k -> as_unit v; k (Nat64 (Numerics.Nat64.of_int 42))
+
+  | s -> trap.trap ("Value.prim: " ^ s)
+
+
+
+ + + diff --git a/coverage/mo_values/show.ml.html b/coverage/mo_values/show.ml.html new file mode 100644 index 00000000000..7753e42a28b --- /dev/null +++ b/coverage/mo_values/show.ml.html @@ -0,0 +1,386 @@ + + + + + show.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+
+
module T = Mo_types.Type
+
+(* Entry point for type checking: *)
+
+let can_show t =
+  let open T in
+  let seen = ref T.S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match normalize t with
+      | Prim (Bool|Nat|Int|Text|Blob|Char|Null|Principal) -> true
+      | Prim (Nat8|Int8)
+      | Prim (Nat16|Int16)
+      | Prim (Nat32|Int32)
+      | Prim (Nat64|Int64) -> true
+      | Prim Float -> true
+      | Tup ts' -> List.for_all go ts'
+      | Opt t' -> go t'
+      | Array t' -> go (as_immut t')
+      | Obj (Object, fs) ->
+        List.for_all (fun f -> go (as_immut f.typ)) fs
+      | Variant cts ->
+        List.for_all (fun f -> go f.typ) cts
+      | Non -> true
+      | Typ _ -> true
+      | _ -> false
+    end
+  in go t
+
+(* Entry point for the interpreter (reference implementation) *)
+
+let needs_parens s = s.[0] = '+' || s.[0] = '-' || s.[0] = '?' || s.[0] = '#'
+let parens s = if needs_parens s then "(" ^ s ^ ")" else s
+let sign b s = (if b then "+" else "") ^ s
+
+let rec show_val t v =
+  let t = T.normalize t in
+  match t, v with
+  | T.(Prim Bool), Value.Bool b -> if b then "true" else "false"
+  | T.(Prim Nat), Value.Int i -> Numerics.Int.to_string i
+  | T.(Prim Nat8), Value.Nat8 i -> Numerics.Nat8.to_string i
+  | T.(Prim Nat16), Value.Nat16 i -> Numerics.Nat16.to_string i
+  | T.(Prim Nat32), Value.Nat32 i -> Numerics.Nat32.to_string i
+  | T.(Prim Nat64), Value.Nat64 i -> Numerics.Nat64.to_string i
+  | T.(Prim Int), Value.Int i -> Numerics.Int.(sign (gt i zero) (to_string i))
+  | T.(Prim Int8), Value.Int8 i -> Numerics.Int_8.(sign (gt i zero) (to_string i))
+  | T.(Prim Int16), Value.Int16 i -> Numerics.Int_16.(sign (gt i zero) (to_string i))
+  | T.(Prim Int32), Value.Int32 i -> Numerics.Int_32.(sign (gt i zero) (to_string i))
+  | T.(Prim Int64), Value.Int64 i -> Numerics.Int_64.(sign (gt i zero) (to_string i))
+  | T.(Prim Float), Value.Float i -> Numerics.Float.to_string i
+  | T.(Prim Text), Value.Text s -> "\"" ^ s ^ "\""
+  | T.(Prim Blob), Value.Blob s -> "\"" ^ Value.Blob.escape s ^ "\""
+  | T.(Prim Char), Value.Char c -> "\'" ^ Lib.Utf8.encode [c] ^ "\'"
+  | T.(Prim Principal), Value.Blob s -> Ic.Url.encode_principal s
+  | T.(Prim Null), Value.Null -> "null"
+  | T.Opt _, Value.Null -> "null"
+  | T.Opt t', Value.Opt v -> "?" ^ parens (show_val t' v)
+  | T.Tup ts', Value.Tup vs ->
+    Printf.sprintf "(%s%s)"
+      (String.concat ", " (List.map2 show_val ts' vs))
+      (if List.length vs = 1 then "," else "")
+  | T.Array (T.Mut t'), Value.Array a ->
+    if a = [||] then "[var]" else
+    Printf.sprintf "[var %s]"
+      (String.concat ", " (List.map (fun v -> show_val t' !(Value.as_mut v)) (Array.to_list a)))
+  | T.Array t', Value.Array a ->
+    Printf.sprintf "[%s]"
+      (String.concat ", " (List.map (show_val t') (Array.to_list a)))
+  | T.Obj (_, fts), Value.Obj fs ->
+    Printf.sprintf "{%s}"
+      (String.concat "; "
+         (List.filter_map (fun ft ->
+            if T.is_typ ft.T.typ then None else
+            Some (show_field fs ft)) fts))
+  | T.Variant fs, Value.Variant (l, v) ->
+    begin match List.find_opt (fun {T.lab = l'; _} -> l = l') fs with
+    | Some {T.typ = T.Tup []; _} -> Printf.sprintf "#%s" l
+    | Some {T.typ = T.Tup _ as t'; _} -> Printf.sprintf "#%s%s" l (show_val t' v)
+    | Some {T.typ = t'; _} -> Printf.sprintf "#%s(%s)" l (show_val t' v)
+    | _ -> assert false
+    end
+  | _ ->
+    Format.eprintf "@[show_val: %a : %a@.@]"
+      (Value.pp_val 2) v
+      T.pp_typ t;
+    assert false
+
+and show_field fs ft =
+  let v = Value.Env.find ft.T.lab fs in
+  let m, t', v' =
+    match ft.T.typ with
+    | T.Mut t' -> "var ", t', !(Value.as_mut  v)
+    | t' -> "", t', v
+  in
+  (* With types:
+  Printf.sprintf "%s%s : %s = %s" m ft.T.name (T.string_of_typ t') (show_val t' v')
+  *)
+  Printf.sprintf "%s = %s" ft.T.lab (show_val t' v')
+
+
+
+ + + diff --git a/coverage/mo_values/value.ml.html b/coverage/mo_values/value.ml.html new file mode 100644 index 00000000000..a834afac1ed --- /dev/null +++ b/coverage/mo_values/value.ml.html @@ -0,0 +1,867 @@ + + + + + value.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+
+
open Numerics
+
+(* Environments *)
+
+module Env = Env.Make(String)
+
+(* Blobs *)
+
+module Blob = struct
+  let escape b =
+    String.concat "" (
+      List.of_seq (
+        Seq.map (fun c ->
+          "\\" ^ Lib.Hex.hex_of_char c
+        ) (String.to_seq b)
+      )
+    )
+  let rand32() = String.init 32 (fun _ -> Char.chr (Random.int 256))
+end
+
+(* Types *)
+
+type unicode = int
+
+type actor_id = string
+
+type context = value
+
+and func =
+  context -> value -> value cont -> unit
+
+and comp =
+  value cont -> value cont -> unit
+
+and value =
+  | Null
+  | Bool of bool
+  | Int of Int.t
+  | Int8 of Int_8.t
+  | Int16 of Int_16.t
+  | Int32 of Int_32.t
+  | Int64 of Int_64.t
+  | Nat8 of Nat8.t
+  | Nat16 of Nat16.t
+  | Nat32 of Nat32.t
+  | Nat64 of Nat64.t
+  | Float of Float.t
+  | Char of unicode
+  | Text of string
+  | Blob of string
+  | Tup of value list
+  | Opt of value
+  | Variant of string * value
+  | Array of value array
+  | Obj of value Env.t
+  | Func of Call_conv.t * func
+  | Async of async
+  | Comp of comp
+  | Mut of value ref
+  | Iter of value Seq.t ref (* internal to {b.vals(), t.chars()} iterator *)
+
+and res = Ok of value | Error of value
+and async = {result : res Lib.Promise.t ; mutable waiters : (value cont * value cont) list}
+
+and def = value Lib.Promise.t
+and 'a cont = 'a -> unit
+
+
+(* Shorthands *)
+
+let unit = Tup []
+
+let local_func n m f = Func (Call_conv.local_cc n m, f)
+let message_func s n f = Func (Call_conv.message_cc s n, f)
+let async_func s n m f = Func (Call_conv.async_cc s n m, f)
+let replies_func s n m f = Func (Call_conv.replies_cc s n m, f)
+
+
+(* Projections *)
+
+let invalid s = raise (Invalid_argument ("Value." ^ s))
+
+let as_null = function Null -> () | _ -> invalid "as_null"
+let as_bool = function Bool b -> b | _ -> invalid "as_bool"
+let as_int = function Int n -> n | _ -> invalid "as_int"
+let as_int8 = function Int8 w -> w | _ -> invalid "as_int8"
+let as_int16 = function Int16 w -> w | _ -> invalid "as_int16"
+let as_int32 = function Int32 w -> w | _ -> invalid "as_int32"
+let as_int64 = function Int64 w -> w | _ -> invalid "as_int64"
+let as_nat8 = function Nat8 w -> w | _ -> invalid "as_nat8"
+let as_nat16 = function Nat16 w -> w | _ -> invalid "as_nat16"
+let as_nat32 = function Nat32 w -> w | _ -> invalid "as_nat32"
+let as_nat64 = function Nat64 w -> w | _ -> invalid "as_nat64"
+let as_float = function Float f -> f | _ -> invalid "as_float"
+let as_char = function Char c -> c | _ -> invalid "as_char"
+let as_text = function Text s -> s | _ -> invalid "as_text"
+let as_blob = function Blob b -> b | _ -> invalid "as_blob"
+let as_iter = function Iter i -> i | _ -> invalid "as_iter"
+let as_array = function Array a -> a | _ -> invalid "as_array"
+let as_opt = function Opt v -> v | _ -> invalid "as_opt"
+let as_variant = function Variant (i, v) -> i, v | _ -> invalid "as_variant"
+let as_tup = function Tup vs -> vs | _ -> invalid "as_tup"
+let as_unit = function Tup [] -> () | _ -> invalid "as_unit"
+let as_pair = function Tup [v1; v2] -> v1, v2 | _ -> invalid "as_pair"
+let as_obj = function Obj ve -> ve | _ -> invalid "as_obj"
+let as_func = function Func (cc, f) -> cc, f | _ -> invalid "as_func"
+let as_async = function Async a -> a | _ -> invalid "as_async"
+let as_comp = function Comp c -> c | _ -> invalid "as_comp"
+let as_mut = function Mut r -> r | _ -> invalid "as_mut"
+
+
+(* Ordering *)
+
+let generic_compare = compare
+
+let rec compare x1 x2 =
+  if x1 == x2 then 0 else
+  match x1, x2 with
+  | Int n1, Int n2 -> Int.compare n1 n2
+  | Int8 n1, Int8 n2 -> Int_8.compare n1 n2
+  | Int16 n1, Int16 n2 -> Int_16.compare n1 n2
+  | Int32 n1, Int32 n2 -> Int_32.compare n1 n2
+  | Int64 n1, Int64 n2 -> Int_64.compare n1 n2
+  | Nat8 n1, Nat8 n2 -> Nat8.compare n1 n2
+  | Nat16 n1, Nat16 n2 -> Nat16.compare n1 n2
+  | Nat32 n1, Nat32 n2 -> Nat32.compare n1 n2
+  | Nat64 n1, Nat64 n2 -> Nat64.compare n1 n2
+  | Opt v1, Opt v2 -> compare v1 v2
+  | Tup vs1, Tup vs2 -> Lib.List.compare compare vs1 vs2
+  | Array a1, Array a2 -> Lib.Array.compare compare a1 a2
+  | Obj fs1, Obj fs2 -> Env.compare compare fs1 fs2
+  | Variant (l1, v1), Variant (l2, v2) ->
+    (match String.compare l1 l2 with
+    | 0 -> compare v1 v2
+    | i -> i
+    )
+  | Mut r1, Mut r2 -> compare !r1 !r2
+  | Async _, Async _ -> raise (Invalid_argument "Value.compare")
+  | Comp _, Comp _ -> raise (Invalid_argument "Value.compare")
+  | _ -> generic_compare x1 x2
+
+let equal x1 x2 = compare x1 x2 = 0
+
+(* (Pseudo)-Identities (for caller and self) *)
+
+let next_id = ref 0
+
+let fresh_id() =
+  let id = Printf.sprintf "ID:%i" (!next_id) in
+  next_id := !next_id + 1;
+  id
+
+let top_id = fresh_id ()
+
+(* Pretty Printing *)
+
+let add_unicode buf = function
+  | 0x09 -> Buffer.add_string buf "\\t"
+  | 0x0a -> Buffer.add_string buf "\\n"
+  | 0x22 -> Buffer.add_string buf "\\\""
+  | 0x27 -> Buffer.add_string buf "\\\'"
+  | 0x5c -> Buffer.add_string buf "\\\\"
+  | c when 0x20 <= c && c < 0x7f -> Buffer.add_char buf (Char.chr c)
+  | c -> Printf.bprintf buf "\\u{%02x}" c
+
+let string_of_string lsep s rsep =
+  let buf = Buffer.create 256 in
+  Buffer.add_char buf lsep;
+  List.iter (add_unicode buf) s;
+  Buffer.add_char buf rsep;
+  Buffer.contents buf
+
+let pos_sign b = if b then "+" else ""
+
+open Format
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+let rec pp_val_nullary d ppf = function
+  | Null -> pr ppf "null"
+  | Bool b -> pr ppf (if b then "true" else "false")
+  | Int n when Int.(ge n zero) -> pr ppf (Int.to_pretty_string n)
+  | Int8 n when Int_8.(n = zero) -> pr ppf (Int_8.to_pretty_string n)
+  | Int16 n when Int_16.(n = zero) -> pr ppf (Int_16.to_pretty_string n)
+  | Int32 n when Int_32.(n = zero) -> pr ppf (Int_32.to_pretty_string n)
+  | Int64 n when Int_64.(n = zero) -> pr ppf (Int_64.to_pretty_string n)
+  | Nat8 n -> pr ppf (Nat8.to_pretty_string n)
+  | Nat16 n -> pr ppf (Nat16.to_pretty_string n)
+  | Nat32 n -> pr ppf (Nat32.to_pretty_string n)
+  | Nat64 n -> pr ppf (Nat64.to_pretty_string n)
+  | Float f -> pr ppf (Float.to_pretty_string f)
+  | Char c ->  pr ppf (string_of_string '\'' [c] '\'')
+  | Text t -> pr ppf (string_of_string '\"' (Lib.Utf8.decode t) '\"')
+  | Blob b -> pr ppf ("\"" ^ Blob.escape b ^ "\"")
+  | Tup vs ->
+    fprintf ppf "@[<1>(%a%s)@]"
+      (pp_print_list ~pp_sep:comma (pp_val d)) vs
+      (if List.length vs = 1 then "," else "")
+  | Obj ve ->
+    if d = 0 then pr ppf "{...}" else
+    fprintf ppf "@[<hv 2>{@;<0 0>%a@;<0 -2>}@]"
+      (pp_print_list ~pp_sep:semi (pp_field d)) (Env.bindings ve)
+  | Array a ->
+    fprintf ppf "@[<1>[%a]@]"
+      (pp_print_list ~pp_sep:comma (pp_val d)) (Array.to_list a)
+  | Func (_, _) -> pr ppf "func"
+  | Comp _ -> pr ppf "async*"
+  | v ->
+    (* "(" ^ string_of_val d v ^ ")" *)
+    fprintf ppf "@[<1>(%a)@]" (pp_val d) v
+
+and pp_field d ppf (lab, v) =
+    fprintf ppf "@[<2>%s =@ %a@]" lab (pp_val d) v
+
+and pp_val d ppf = function
+  | Int i -> pr ppf (Int.to_pretty_string i)
+  | Int8 i -> pr ppf (Int_8.(pos_sign (gt i zero) ^ to_pretty_string i))
+  | Int16 i -> pr ppf (Int_16.(pos_sign (gt i zero) ^ to_pretty_string i))
+  | Int32 i -> pr ppf (Int_32.(pos_sign (gt i zero) ^ to_pretty_string i))
+  | Int64 i -> pr ppf (Int_64.(pos_sign (gt i zero) ^ to_pretty_string i))
+  | Opt v -> fprintf ppf "@[<1>?%a@]" (pp_val_nullary d) v
+  | Variant (l, Tup []) -> fprintf ppf "#%s" l
+  | Variant (l, Tup vs) -> fprintf ppf "@[#%s@;<0 1>%a@]" l (pp_val d) (Tup vs)
+  | Variant (l, v) -> fprintf ppf "@[#%s@;<0 1>(%a)@]" l (pp_val d) v
+  | Async {result; waiters = []} ->
+    fprintf ppf "@[<2>async@ %a@]" (pp_res d) result
+  | Async {result; waiters} ->
+    fprintf ppf "@[<2>async[%d]@ %a@]"
+      (List.length waiters) (pp_res d) result
+  | Mut r -> pp_val d ppf !r
+  | v -> pp_val_nullary d ppf v
+
+and pp_res d ppf result =
+  match Lib.Promise.value_opt result with
+  | Some (Error v)-> fprintf ppf "@[Error@ %a@]" (pp_val_nullary d) v
+  | Some (Ok v) -> pp_val_nullary d ppf v
+  | None -> pr ppf "_"
+
+and pp_def d ppf def =
+  match Lib.Promise.value_opt def with
+  | Some v -> pp_val d ppf v
+  | None -> pr ppf "_"
+
+let string_of_val d v : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_val d ppf) v
+
+let string_of_def d def : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_def d ppf) def
+
+
+
+ + + diff --git a/coverage/nix-support/hydra-build-products b/coverage/nix-support/hydra-build-products new file mode 100644 index 00000000000..d81f635fccd --- /dev/null +++ b/coverage/nix-support/hydra-build-products @@ -0,0 +1 @@ +report coverage /nix/store/mj306hns8gc1cx03bkz1p617r2vqjjdi-test-coverage index.html diff --git a/coverage/pipeline/pipeline.ml.html b/coverage/pipeline/pipeline.ml.html new file mode 100644 index 00000000000..5a284698f87 --- /dev/null +++ b/coverage/pipeline/pipeline.ml.html @@ -0,0 +1,2342 @@ + + + + + pipeline.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+
+
open Mo_def
+open Mo_frontend
+open Mo_types
+open Mo_values
+open Mo_interpreter
+open Ir_def
+open Ir_interpreter
+open Ir_passes
+open Mo_config
+
+open Printf
+
+module ResolveImport = Resolve_import
+
+type stat_env = Scope.t
+type dyn_env = Interpret.scope
+type env = stat_env * dyn_env
+
+
+(* Diagnostics *)
+
+let phase heading name =
+  if !Flags.verbose then printf "-- %s %s:\n%!" heading name
+
+let print_ce =
+  Type.ConSet.iter (fun c ->
+    let eq, params, typ = Type.pps_of_kind (Cons.kind c) in
+    Format.printf "@[<hv 2>type %s%a %s@ %a@]@."
+      (Type.string_of_con c)
+      params ()
+      eq
+      typ ()
+  )
+
+let print_stat_ve =
+  Type.Env.iter (fun x t ->
+    let t' = Type.as_immut t in
+    Format.printf "@[<hv 2>%s %s :@ %a@]@."
+      (if t == t' then "let" else "var") x
+      Type.pp_typ t'
+  )
+
+let print_dyn_ve scope =
+  Value.Env.iter (fun x d ->
+    let open Type in
+    let t = Env.find x scope.Scope.val_env in
+    let t' = as_immut t in
+    match normalize t' with
+    | Obj (Module, fs) ->
+      Format.printf "@[<hv 2>%s %s : module {...}@]@."
+        (if t == t' then "let" else "var") x
+    | _ ->
+      Format.printf "@[<hv 2>%s %s :@ %a =@ %a@]@."
+        (if t == t' then "let" else "var") x
+        Type.pp_typ t'
+        (Value.pp_def !Flags.print_depth) d
+  )
+
+let print_scope senv scope dve =
+  print_ce scope.Scope.con_env;
+  print_dyn_ve senv dve
+
+let print_val _senv v t =
+  Format.printf "@[<hv 2>%a :@ %a@]@."
+    (Value.pp_val !Flags.print_depth) v
+    Type.pp_typ t
+
+
+(* Dumping *)
+
+let dump_prog flag prog =
+    if !flag then
+      Wasm.Sexpr.print 80 (Arrange.prog prog)
+
+let dump_ir flag prog_ir =
+    if !flag then
+      Wasm.Sexpr.print 80 (Arrange_ir.prog prog_ir)
+
+
+(* Parsing *)
+
+type rel_path = string
+
+type parse_result = (Syntax.prog * rel_path) Diag.result
+
+type no_region_parse_fn = string -> parse_result
+type parse_fn = Source.region -> no_region_parse_fn
+
+let generic_parse_with mode lexer parser name : _ Diag.result =
+  phase "Parsing" name;
+  let open Diag.Syntax in
+  lexer.Lexing.lex_curr_p <-
+    {lexer.Lexing.lex_curr_p with Lexing.pos_fname = name};
+  (* a back door to enable the `prim` syntax, for our test suite *)
+  let tokenizer, triv_table = Lexer.tokenizer mode lexer in
+  let* mk_syntax =
+    try
+      Parser_lib.triv_table := triv_table;
+      Parsing.parse mode (!Flags.error_detail) (parser lexer.Lexing.lex_curr_p) tokenizer lexer
+    with Lexer.Error (at, msg) -> Diag.error at"M0002" "syntax" msg
+  in
+  let phrase = mk_syntax name in
+  Diag.return phrase
+
+let parse_with mode lexer parser name : Syntax.prog Diag.result =
+  let open Diag.Syntax in
+  let* prog = generic_parse_with mode lexer parser name in
+  dump_prog Flags.dump_parse prog;
+  Diag.return prog
+
+let parse_string' mode name s : parse_result =
+  let open Diag.Syntax in
+  let lexer = Lexing.from_string s in
+  let parse = Parser.Incremental.parse_prog in
+  let* prog = parse_with mode lexer parse name in
+  Diag.return (prog, name)
+
+let parse_string = parse_string' Lexer.mode
+
+let parse_file' mode at filename : (Syntax.prog * rel_path) Diag.result =
+  let ic, messages = Lib.FilePath.open_in filename in
+  Diag.finally (fun () -> close_in ic) (
+    let open Diag.Syntax in
+    let* _ =
+      Diag.traverse_
+        (Diag.warn at "M0005" "import")
+        messages in
+    let lexer = Lexing.from_channel ic in
+    let parse = Parser.Incremental.parse_prog in
+    let* prog = parse_with mode lexer parse filename in
+    Diag.return (prog, filename)
+  )
+
+let parse_file = parse_file' Lexer.mode
+let parse_verification_file = parse_file' Lexer.mode_verification
+
+(* Import file name resolution *)
+
+type resolve_result = (Syntax.prog * ResolveImport.resolved_imports) Diag.result
+
+let resolve_flags () =
+  ResolveImport.{
+    package_urls = !Flags.package_urls;
+    actor_aliases = !Flags.actor_aliases;
+    actor_idl_path = !Flags.actor_idl_path
+  }
+
+let resolve_prog (prog, base) : resolve_result =
+  Diag.map
+    (fun libs -> (prog, libs))
+    (ResolveImport.resolve (resolve_flags ()) prog base)
+
+let resolve_progs =
+  Diag.traverse resolve_prog
+
+
+(* Printing dependency information *)
+
+let print_deps (file : string) : unit =
+  let (prog, _) =  Diag.run (parse_file Source.no_region file) in
+  let imports = Diag.run (ResolveImport.collect_imports prog file) in
+  List.iter (fun (url, path) ->
+      match path with
+      | None -> Printf.printf "%s\n" url
+      | Some path -> Printf.printf "%s %s\n" url path
+    ) imports
+
+(* Checking *)
+
+let infer_prog senv prog : (Type.typ * Scope.scope) Diag.result =
+  let filename = prog.Source.note.Syntax.filename in
+  phase "Checking" filename;
+  let r = Typing.infer_prog senv prog in
+  if !Flags.trace && !Flags.verbose then begin
+    match r with
+    | Ok ((_, scope), _) ->
+      print_ce scope.Scope.con_env;
+      print_stat_ve scope.Scope.val_env;
+      dump_prog Flags.dump_tc prog;
+    | Error _ -> ()
+  end;
+  phase "Definedness" filename;
+  let open Diag.Syntax in
+  let* t_sscope = r in
+  let* () = Definedness.check_prog prog in
+  Diag.return t_sscope
+
+let rec check_progs senv progs : Scope.scope Diag.result =
+  match progs with
+  | [] -> Diag.return senv
+  | p::ps ->
+    let open Diag.Syntax in
+    let* _t, sscope = infer_prog senv p in
+    let senv' = Scope.adjoin senv sscope in
+    check_progs senv' ps
+
+let check_lib senv lib : Scope.scope Diag.result =
+  let filename = lib.Source.note.Syntax.filename in
+  phase "Checking" (Filename.basename filename);
+  let open Diag.Syntax in
+  let* sscope = Typing.check_lib senv lib in
+  phase "Definedness" (Filename.basename filename);
+  let* () = Definedness.check_lib lib in
+  Diag.return sscope
+
+let lib_of_prog f prog : Syntax.lib  =
+  let lib = CompUnit.comp_unit_of_prog true prog in
+  { lib with Source.note = { lib.Source.note with Syntax.filename = f } }
+
+
+(* Prelude and internals *)
+
+let builtin_error phase what (msgs : Diag.messages) =
+  Printf.eprintf "%s %s failed\n" phase what;
+  Diag.print_messages msgs;
+  exit 1
+
+let check_builtin what src senv0 : Syntax.prog * stat_env =
+  let lexer = Lexing.from_string src in
+  let parse = Parser.Incremental.parse_prog in
+  match parse_with Lexer.mode_priv lexer parse what with
+  | Error es -> builtin_error "parsing" what es
+  | Ok (prog, _ws) ->
+    match infer_prog senv0 prog with
+    | Error es -> builtin_error "checking" what es
+    | Ok ((_t, sscope), _ws) ->
+      let senv1 = Scope.adjoin senv0 sscope in
+      prog, senv1
+
+let prelude, initial_stat_env0 =
+  check_builtin "prelude" Prelude.prelude Typing.initial_scope
+let internals, initial_stat_env =
+  check_builtin "internals" Prelude.internals initial_stat_env0
+
+(* Stable compatibility *)
+
+
+let parse_stab_sig s name  =
+  let open Diag.Syntax in
+  let mode = Lexer.{privileged = false; verification = false} in
+  let lexer = Lexing.from_string s in
+  let parse = Parser.Incremental.parse_stab_sig in
+  let* sig_ = generic_parse_with mode lexer parse name in
+  Diag.return sig_
+
+let parse_stab_sig_from_file filename : Syntax.stab_sig Diag.result =
+  let ic = Stdlib.open_in filename in
+  Diag.finally (fun () -> close_in ic) (
+    let open Diag.Syntax in
+    let mode = Lexer.{privileged = false; verification = false} in
+    let lexer = Lexing.from_channel ic in
+    let parse = Parser.Incremental.parse_stab_sig in
+    let* sig_ = generic_parse_with mode lexer parse filename in
+    Diag.return sig_
+  )
+
+let stable_compatible pre post : unit Diag.result =
+  let open Diag.Syntax in
+  let* p1 = parse_stab_sig_from_file pre in
+  let* p2 = parse_stab_sig_from_file post in
+  let* s1 = Typing.check_stab_sig initial_stat_env0 p1 in
+  let* s2 = Typing.check_stab_sig initial_stat_env0 p2 in
+  Stability.match_stab_sig s1 s2
+
+let validate_stab_sig s : unit Diag.result =
+  let open Diag.Syntax in
+  let name = "stable-types" in
+  let* p1 = parse_stab_sig s name in
+  let* p2 = parse_stab_sig s name in
+  let* s1 = Typing.check_stab_sig initial_stat_env0 p1 in
+  let* s2 = Typing.check_stab_sig initial_stat_env0 p2 in
+  Stability.match_stab_sig s1 s2
+
+(* The prim module *)
+
+let prim_name = "prim"
+
+let prim_error phase (msgs : Diag.messages) =
+  Printf.eprintf "%s prim failed\n" phase;
+  Diag.print_messages msgs;
+  exit 1
+
+let check_prim () : Syntax.lib * stat_env =
+  let lexer = Lexing.from_string (Prelude.prim_module ~timers:!Flags.global_timer) in
+  let parse = Parser.Incremental.parse_prog in
+
+  match parse_with Lexer.mode_priv lexer parse prim_name with
+  | Error es -> prim_error "parsing" es
+  | Ok (prog, _ws) ->
+    let open Syntax in
+    let open Source in
+    let senv0 = initial_stat_env in
+    let fs = List.map (fun d -> {vis = Public None @@ no_region; dec = d; stab = None} @@ d.at) prog.it in
+    let body = {it = ModuleU (None, fs); at = no_region; note = empty_typ_note} in
+    let lib = {
+      it = { imports = []; body };
+      at = no_region;
+      note = { filename = "@prim"; trivia = Trivia.empty_triv_table }
+    } in
+    match check_lib senv0 lib with
+    | Error es -> prim_error "checking" es
+    | Ok (sscope, _ws) ->
+      let senv1 = Scope.adjoin senv0 sscope in
+      lib, senv1
+
+
+(* Imported file loading *)
+
+(*
+Loading a file (or string) implies lexing, parsing, resolving imports to
+libraries, and typechecking.
+The resulting prog is typechecked.
+The Typing.scope field in load_result is the accumulated scope.
+When we load a declaration (i.e from the REPL), we also care about the type
+and the newly added scopes, so these are returned separately.
+*)
+
+
+type load_result =
+  (Syntax.lib list * Syntax.prog list * Scope.scope) Diag.result
+
+type load_decl_result =
+  (Syntax.lib list * Syntax.prog * Scope.scope * Type.typ * Scope.scope) Diag.result
+
+let chase_imports parsefn senv0 imports : (Syntax.lib list * Scope.scope) Diag.result =
+  (*
+  This function loads and type-checkes the files given in `imports`,
+  including any further dependencies.
+
+  The resulting `Syntax.libraries` list is in dependency order. To achieve this,
+  the function go below does an depth-first traversal of the import DAG.
+  * To detected illegal cycles, pending is a set of filenames that we started
+    processing, but did not add yet.
+  * To avoid duplicates, i.e. load each file at most once, we check the
+    senv.
+  * We accumulate the resulting libraries in reverse order, for O(1) appending.
+  *)
+
+  let open ResolveImport.S in
+  let pending = ref empty in
+  let senv = ref senv0 in
+  let libs = ref [] in
+
+  let rec go ri = match ri.Source.it with
+    | Syntax.PrimPath ->
+      (* a bit of a hack, lib_env should key on resolved_import *)
+      if Type.Env.mem "@prim" !senv.Scope.lib_env then
+        Diag.return ()
+      else
+        let lib, sscope = check_prim () in
+        libs := lib :: !libs; (* NB: Conceptually an append *)
+        senv := Scope.adjoin !senv sscope;
+        Diag.return ()
+    | Syntax.Unresolved -> assert false
+    | Syntax.LibPath f ->
+      if Type.Env.mem f !senv.Scope.lib_env then
+        Diag.return ()
+      else if mem ri.Source.it !pending then
+        Diag.error
+          ri.Source.at
+          "M0003"
+          "import"
+          (Printf.sprintf "file %s must not depend on itself" f)
+      else begin
+        pending := add ri.Source.it !pending;
+        let open Diag.Syntax in
+        let* prog, base = parsefn ri.Source.at f in
+        let* () = Static.prog prog in
+        let* more_imports = ResolveImport.resolve (resolve_flags ()) prog base in
+        let* () = go_set more_imports in
+        let lib = lib_of_prog f prog in
+        let* sscope = check_lib !senv lib in
+        libs := lib :: !libs; (* NB: Conceptually an append *)
+        senv := Scope.adjoin !senv sscope;
+        pending := remove ri.Source.it !pending;
+        Diag.return ()
+      end
+    | Syntax.IDLPath (f, _) ->
+      let open Diag.Syntax in
+      let* prog, idl_scope, actor_opt = Idllib.Pipeline.check_file f in
+      if actor_opt = None then
+        Diag.error
+          ri.Source.at
+          "M0004"
+          "import"
+          (Printf.sprintf "file %s does not define a service" f)
+      else
+        match Mo_idl.Idl_to_mo.check_prog idl_scope actor_opt with
+        | exception Idllib.Exception.UnsupportedCandidFeature error_message ->
+          Stdlib.Error [
+            Diag.error_message
+              ri.Source.at
+              "M0153"
+              "import"
+              (Printf.sprintf "file %s uses Candid types without corresponding Motoko type" f);
+            error_message ]
+        | actor ->
+          let sscope = Scope.lib f actor in
+          senv := Scope.adjoin !senv sscope;
+          Diag.return ()
+  and go_set todo = Diag.traverse_ go todo
+  in
+  Diag.map (fun () -> (List.rev !libs, !senv)) (go_set imports)
+
+let load_progs parsefn files senv : load_result =
+  let open Diag.Syntax in
+  let* parsed = Diag.traverse (parsefn Source.no_region) files in
+  let* rs = resolve_progs parsed in
+  let progs' = List.map fst rs in
+  let libs = List.concat_map snd rs in
+  let* libs, senv' = chase_imports parsefn senv libs in
+  let* senv'' = check_progs senv' progs' in
+  Diag.return (libs, progs', senv'')
+
+let load_decl parse_one senv : load_decl_result =
+  let open Diag.Syntax in
+  let* parsed = parse_one in
+  let* prog, libs = resolve_prog parsed in
+  let* libs, senv' = chase_imports parse_file senv libs in
+  let* t, sscope = infer_prog senv' prog in
+  let senv'' = Scope.adjoin senv' sscope in
+  Diag.return (libs, prog, senv'', t, sscope)
+
+
+(* Interpretation (Source) *)
+
+let interpret_prog denv prog : (Value.value * Interpret.scope) option =
+  let open Interpret in
+  phase "Interpreting" prog.Source.note.Syntax.filename;
+  let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+  let result = Interpret.interpret_prog flags denv prog in
+  Profiler.process_prog_result result ;
+  result
+
+let rec interpret_libs denv libs : Interpret.scope =
+  let open Interpret in
+  match libs with
+  | [] -> denv
+  | lib::libs' ->
+     phase "Interpreting" (Filename.basename lib.Source.note.Syntax.filename);
+    let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+    let dscope = interpret_lib flags denv lib in
+    let denv' = adjoin_scope denv dscope in
+    interpret_libs denv' libs'
+
+let rec interpret_progs denv progs : Interpret.scope option =
+  match progs with
+  | [] -> Some denv
+  | p::ps ->
+    match interpret_prog denv p with
+    | Some (_v, dscope) ->
+      let denv' = Interpret.adjoin_scope denv dscope in
+      interpret_progs denv' ps
+    | None -> None
+
+let interpret_files (senv0, denv0) files : (Scope.scope * Interpret.scope) option =
+  Option.bind
+    (Diag.flush_messages (load_progs parse_file files senv0))
+    (fun (libs, progs, senv1) ->
+      let denv1 = interpret_libs denv0 libs in
+      match interpret_progs denv1 progs with
+      | None -> None
+      | Some denv2 -> Some (senv1, denv2)
+    )
+
+let run_builtin prog denv : dyn_env =
+  match interpret_prog denv prog with
+  | None -> builtin_error "initializing" prog.Source.note.Syntax.filename []
+  | Some (_v, dscope) ->
+    Interpret.adjoin_scope denv dscope
+
+let initial_dyn_env = run_builtin internals (run_builtin prelude Interpret.empty_scope)
+
+let initial_env = (initial_stat_env, initial_dyn_env)
+
+
+(* Only checking *)
+
+type check_result = unit Diag.result
+
+let check_files' parsefn files : check_result =
+  Diag.map ignore (load_progs parsefn files initial_stat_env)
+
+let check_files files : check_result =
+  check_files' parse_file files
+
+(* Generate Viper *)
+
+type viper_result = (string * (Source.region -> Source.region option)) Diag.result
+
+let viper_files' parsefn files : viper_result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parsefn files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  let prog = CompUnit.combine_progs progs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  let* v = Viper.Trans.unit u in
+  let s = Viper.Pretty.prog_mapped "" v in
+  Diag.return s
+
+let viper_files files : viper_result =
+  viper_files' parse_verification_file files
+
+(* Generate IDL *)
+
+let generate_idl files : Idllib.Syntax.prog Diag.result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parse_file files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  Diag.return (Mo_idl.Mo_to_idl.prog (progs, senv))
+
+(* Running *)
+
+let run_files files : unit option =
+  Option.map ignore (interpret_files initial_env files)
+
+(* Interactively *)
+
+let continuing = ref false
+
+let lexer_stdin buf len =
+  let prompt = if !continuing then "  " else "> " in
+  printf "%s" prompt; flush_all ();
+  continuing := true;
+  let rec loop i =
+    if i = len then i else
+    let ch = input_char stdin in
+    Bytes.set buf i ch;
+    if ch = '\n' then i + 1 else loop (i + 1)
+  in loop 0
+
+let parse_lexer lexer : parse_result =
+  let open Lexing in
+  if lexer.lex_curr_pos >= lexer.lex_buffer_len - 1 then continuing := false;
+  match parse_with Lexer.mode lexer Parser.Incremental.parse_prog_interactive "stdin" with
+  | Error es ->
+    Lexing.flush_input lexer;
+    (* Reset beginning-of-line, too, to sync consecutive positions. *)
+    lexer.lex_curr_p <- {lexer.lex_curr_p with pos_bol = 0};
+    Error es
+  | Ok (prog, ws) -> Ok ((prog, Filename.current_dir_name), ws)
+
+let is_exp dec = match dec.Source.it with Syntax.ExpD _ -> true | _ -> false
+
+let output_scope (senv, _) t v sscope dscope =
+  print_scope senv sscope dscope.Interpret.val_env;
+  if v <> Value.unit then print_val senv v t
+
+let run_stdin lexer (senv, denv) : env option =
+  match Diag.flush_messages (load_decl (parse_lexer lexer) senv) with
+  | None ->
+    if !Flags.verbose then printf "\n";
+    None
+  | Some (libs, prog, senv', t, sscope) ->
+    let denv' = interpret_libs denv libs in
+    match interpret_prog denv' prog with
+    | None ->
+      if !Flags.verbose then printf "\n";
+      None
+    | Some (v, dscope) ->
+      phase "Finished" "stdin";
+      let denv' = Interpret.adjoin_scope denv dscope in
+      let env' = (senv', denv') in
+      (* TBR: hack *)
+      let t', v' =
+        if Option.fold ~none:false ~some:is_exp (Lib.List.last_opt prog.Source.it)
+        then t, v
+        else Type.unit, Value.unit
+      in
+      output_scope env' t' v' sscope dscope;
+      if !Flags.verbose then printf "\n";
+      Some env'
+
+let run_stdin_from_file files file : Value.value option =
+  let open Lib.Option.Syntax in
+  let* (senv, denv) = interpret_files initial_env files in
+  let* (libs, prog, senv', t, sscope) =
+    Diag.flush_messages (load_decl (parse_file Source.no_region file) senv) in
+  let denv' = interpret_libs denv libs in
+  let* (v, dscope) = interpret_prog denv' prog in
+  Format.printf "@[<hv 2>%a :@ %a@]@."
+    (Value.pp_val 10) v
+    Type.pp_typ t;
+  Some v
+
+let run_files_and_stdin files =
+  let open Lib.Option.Syntax in
+  let lexer = Lexing.from_function lexer_stdin in
+  let* env = interpret_files initial_env files in
+  let rec loop env = loop (Lib.Option.get (run_stdin lexer env) env) in
+  try loop env with End_of_file ->
+    printf "\n%!";
+    Some ()
+
+(* Desugaring *)
+
+let desugar_unit imports u name : Ir.prog =
+  phase "Desugaring" name;
+  let open Lowering.Desugar in
+  let prog_ir' : Ir.prog = link_declarations
+    (import_prelude prelude @ import_prelude internals @ imports)
+    (transform_unit u) in
+  dump_ir Flags.dump_lowering prog_ir';
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose "Desugaring" prog_ir';
+  prog_ir'
+
+(* IR transforms *)
+
+let transform transform_name trans prog name =
+  phase transform_name name;
+  let prog_ir' : Ir.prog = trans prog in
+  dump_ir Flags.dump_lowering prog_ir';
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose transform_name prog_ir';
+  prog_ir'
+
+let transform_if transform_name trans flag prog name =
+  if flag then transform transform_name trans prog name
+  else prog
+
+let await_lowering =
+  transform_if "Await Lowering" Await.transform
+
+let async_lowering mode =
+  transform_if "Async Lowering" Async.transform
+
+let tailcall_optimization =
+  transform_if "Tailcall optimization" Tailcall.transform
+
+let typ_field_translation =
+  transform_if "Erase type components" Erase_typ_field.transform
+
+let show_translation =
+  transform_if "Translate show" Show.transform
+
+let eq_translation =
+  transform_if "Translate polymorphic equality" Eq.transform
+
+let analyze analysis_name analysis prog name =
+  phase analysis_name name;
+  analysis prog;
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose analysis_name prog
+
+let ir_passes mode prog_ir name =
+  (* erase typ components from objects *)
+  let prog_ir = typ_field_translation true prog_ir name in
+  (* translations that extend the progam and must be done before await/cps conversion *)
+  let prog_ir = show_translation true prog_ir name in
+  let prog_ir = eq_translation true prog_ir name in
+  (* cps conversion and local transformations *)
+  let prog_ir = await_lowering !Flags.await_lowering prog_ir name in
+  let prog_ir = async_lowering mode !Flags.async_lowering prog_ir name in
+  let prog_ir = tailcall_optimization true prog_ir name in
+  analyze "constness analysis" Const.analyze prog_ir name;
+  prog_ir
+
+
+(* Compilation *)
+
+let load_as_rts () =
+  let rts = match (!Flags.gc_strategy, !Flags.sanity) with
+    | (Flags.Incremental, false) -> Rts.wasm_incremental_release
+    | (Flags.Incremental, true) -> Rts.wasm_incremental_debug
+    | (_, false) -> Rts.wasm_non_incremental_release
+    | (_, true) -> Rts.wasm_non_incremental_debug
+  in
+  Wasm_exts.CustomModuleDecode.decode "rts.wasm" (Lazy.force rts)
+
+type compile_result = (Idllib.Syntax.prog * Wasm_exts.CustomModule.extended_module) Diag.result
+
+(* This transforms the flat list of libs (some of which are classes)
+   into a list of imported libs and (compiled) classes *)
+let rec compile_libs mode libs : Lowering.Desugar.import_declaration =
+  let open Source in
+  let rec go imports = function
+    | [] -> imports
+    | l :: libs ->
+      let { Syntax.body = cub; _ } = l.it in
+      match cub.it with
+      | Syntax.ActorClassU _ ->
+        let wasm = compile_unit_to_wasm mode imports l in
+        go (imports @ Lowering.Desugar.import_compiled_class l wasm) libs
+      | _ ->
+        go (imports @ Lowering.Desugar.import_unit l) libs
+  in go [] libs
+
+and compile_unit mode do_link imports u : Wasm_exts.CustomModule.extended_module =
+  let name = u.Source.note.Syntax.filename in
+  let prog_ir = desugar_unit imports u name in
+  let prog_ir = ir_passes mode prog_ir name in
+  phase "Compiling" name;
+  let rts = if do_link then Some (load_as_rts ()) else None in
+  Codegen.Compile.compile mode rts prog_ir
+
+and compile_unit_to_wasm mode imports (u : Syntax.comp_unit) : string =
+  let wasm_mod = compile_unit mode true imports u in
+  let (_source_map, wasm) = Wasm_exts.CustomModuleEncode.encode wasm_mod in
+  wasm
+
+and compile_progs mode do_link libs progs : Wasm_exts.CustomModule.extended_module =
+  let imports = compile_libs mode libs in
+  let prog = CompUnit.combine_progs progs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  compile_unit mode do_link imports u
+
+let compile_files mode do_link files : compile_result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parse_file files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  let idl = Mo_idl.Mo_to_idl.prog (progs, senv) in
+  let ext_module = compile_progs mode do_link libs progs in
+  (* validate any stable type signature *)
+  let* () =
+    match Wasm_exts.CustomModule.(ext_module.motoko.stable_types) with
+    | Some (_, ss) -> validate_stab_sig ss
+    | _ -> Diag.return ()
+  in
+  Diag.return (idl, ext_module)
+
+
+(* Interpretation (IR) *)
+
+(*
+   This transforms the flat list of libs into a list of imported units,
+   Unlike, `compile_libs`, classes are imported as IR for interpretation,
+   not compiled to wasm
+*)
+let import_libs libs : Lowering.Desugar.import_declaration =
+  List.concat_map Lowering.Desugar.import_unit libs
+
+let interpret_ir_progs libs progs =
+  let prog = CompUnit.combine_progs progs in
+  let name = prog.Source.note.Syntax.filename in
+  let imports = import_libs libs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  let prog_ir = desugar_unit imports u name in
+  let prog_ir = ir_passes (!Flags.compile_mode) prog_ir name in
+  phase "Interpreting" name;
+  let open Interpret_ir in
+  let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+  interpret_prog flags prog_ir
+
+let interpret_ir_files files =
+  Option.map
+    (fun (libs, progs, senv) -> interpret_ir_progs libs progs)
+    (Diag.flush_messages (load_progs parse_file files initial_stat_env))
+
+
+
+ + + diff --git a/coverage/pipeline/resolve_import.ml.html b/coverage/pipeline/resolve_import.ml.html new file mode 100644 index 00000000000..ac8d1d3b118 --- /dev/null +++ b/coverage/pipeline/resolve_import.ml.html @@ -0,0 +1,878 @@ + + + + + resolve_import.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+
+
open Mo_def
+open Ic
+module Traversals = Mo_frontend.Traversals
+
+(*
+This module traverses the syntax tree. For each `import` statement, it looks
+at the given relative path and tries to resolve it to a full path (where
+full means relative to the current working directory, so that source
+directories do not creep into the build output). If no file can be found
+there, this prints an error message, otherwise it stores the real path
+in the second, mutable field of the ImportE statement.
+
+It returns a list of all imported file names.
+
+*)
+
+type filepath = string
+type url = string
+type blob = string
+
+type resolved_imports = Syntax.resolved_import Source.phrase list
+
+(* This returns a map from Syntax.resolved_import
+   to the location of the first import of that library
+*)
+module RIM = Map.Make
+  (struct
+    type t = Syntax.resolved_import
+    let compare = compare
+  end)
+
+(* The Set variant is used in the pipeline module *)
+module S = Set.Make
+  (struct
+    type t = Syntax.resolved_import
+    let compare = compare
+  end)
+
+
+(* a map of type package_map will map each package name to local, non-relative
+   filepath e.g.,
+   packages("std") = "/Users/home/username/.dfinity-sdk/src/mo-stdlib/0.1.0/"
+   packages("foo") = "/Users/home/username/fooPackage/1.2.3/src"
+*)
+module M = Map.Make(String)
+type package_map = filepath M.t
+
+open Syntax
+open Source
+
+let err_unrecognized_url msgs at url msg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0006"
+       "import"
+       (Printf.sprintf "cannot parse import URL \"%s\": %s" url msg))
+
+let err_unrecognized_alias msgs alias principal msg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0007"
+       "actor-alias"
+       (Printf.sprintf "cannot parse principal \"%s\" for actor alias \"%s\": %s" principal alias msg))
+
+let err_actor_import_without_idl_path msgs at =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0008"
+       "import"
+      (Printf.sprintf "cannot import canister urls without --actor-idl param"))
+
+let err_file_does_not_exist' at full_path =
+  Diag.error_message
+    at
+    "M0009"
+    "import"
+    (Printf.sprintf "file \"%s\" does not exist" full_path)
+
+let err_file_does_not_exist msgs at full_path =
+  Diag.add_msg msgs (err_file_does_not_exist' at full_path)
+
+let err_package_not_defined msgs at pkg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0010"
+       "import"
+       (Printf.sprintf "package \"%s\" not defined" pkg))
+
+let err_alias_not_defined msgs at alias =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0011"
+       "import"
+       (Printf.sprintf "canister alias \"%s\" not defined" alias))
+
+let err_package_file_does_not_exist msgs f pname =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0012"
+       "package"
+       (Printf.sprintf "file \"%s\" (for package `%s`) does not exist" f pname))
+
+let err_prim_pkg msgs =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0013"
+       "package" "the \"prim\" package is built-in, and cannot be mapped to a directory")
+
+let append_extension : (string -> bool) -> string -> string =
+  fun file_exists f ->
+  let file_path = f ^ ".mo" in
+  let lib_path = Filename.concat f "lib.mo" in
+  if Option.is_some (Lib.String.chop_suffix "/" f) then
+    lib_path
+  else if file_exists file_path then
+    file_path
+  else
+    lib_path
+
+let resolve_lib_import at full_path : (string, Diag.message) result =
+  let full_path = append_extension Sys.file_exists full_path in
+  let full_path = Lib.FilePath.normalise full_path in
+  if Sys.file_exists full_path
+  then Ok full_path
+  else Error (err_file_does_not_exist' at full_path)
+
+let add_lib_import msgs imported ri_ref at full_path =
+  match resolve_lib_import at full_path with
+  | Ok full_path -> begin
+      ri_ref := LibPath full_path;
+      imported := RIM.add (LibPath full_path) at !imported
+    end
+  | Error err ->
+     Diag.add_msg msgs err
+
+let add_idl_import msgs imported ri_ref at full_path bytes =
+  if Sys.file_exists full_path
+  then begin
+    ri_ref := IDLPath (full_path, bytes);
+    imported := RIM.add (IDLPath (full_path, bytes)) at !imported
+  end else
+    err_file_does_not_exist msgs at full_path
+
+let add_prim_import imported ri_ref at =
+  ri_ref := PrimPath;
+  imported := RIM.add PrimPath at !imported
+
+let in_base base f =
+  if base = "."
+  then f
+  else Filename.concat base f
+
+let resolve_import_string msgs base actor_idl_path aliases packages imported (f, ri_ref, at)  =
+  let resolve_ic bytes = match actor_idl_path with
+    | None -> err_actor_import_without_idl_path msgs at
+    | Some actor_base ->
+      let full_path = in_base actor_base (Url.idl_basename_of_blob bytes) in
+      add_idl_import msgs imported ri_ref at full_path bytes
+    in
+  match Url.parse f with
+  | Ok (Url.Relative path) ->
+    (* TODO support importing local .did file *)
+    add_lib_import msgs imported ri_ref at (in_base base path)
+  | Ok (Url.Package (pkg,path)) ->
+    begin match M.find_opt pkg packages with
+    | Some pkg_path -> add_lib_import msgs imported ri_ref at (in_base pkg_path path)
+    | None -> err_package_not_defined msgs at pkg
+    end
+  | Ok (Url.Ic bytes) -> resolve_ic bytes
+  | Ok (Url.IcAlias alias) ->
+    begin match M.find_opt alias aliases with
+    | Some bytes -> resolve_ic bytes
+    | None -> err_alias_not_defined msgs at alias
+    end
+  | Ok Url.Prim ->
+    add_prim_import imported ri_ref at
+  | Error msg ->
+    err_unrecognized_url msgs at f msg
+
+(* Resolve the argument to --package. *)
+let resolve_package_url (msgs:Diag.msg_store) (pname:string) (f:url) : filepath =
+  if pname = "prim" then (err_prim_pkg msgs ;"") else
+  let f = Lib.FilePath.normalise f in
+  if Sys.file_exists f
+  then f
+  else (err_package_file_does_not_exist msgs f pname;"")
+
+(* Resolve the argument to --actor-alias. Check eagerly for well-formedness *)
+let resolve_alias_principal (msgs:Diag.msg_store) (alias:string) (f:string) : blob =
+  match Url.decode_principal f with
+  | Ok bytes -> bytes
+  | Error msg -> err_unrecognized_alias msgs alias f msg; ""
+
+
+let prog_imports (p : prog): (url * resolved_import ref * region) list =
+  let res = ref [] in
+  let f e = match e.it with
+    | ImportE (f, fp) -> res := (f, fp, e.at) ::!res; e
+    | _ -> e in
+  let _ = ignore (Traversals.over_prog f p) in
+  List.rev !res
+
+type actor_idl_path = filepath option
+type package_urls = url M.t
+type actor_aliases = url M.t
+type aliases = blob M.t
+
+
+let resolve_packages : package_urls -> package_map Diag.result = fun purls ->
+  Diag.with_message_store (fun msgs -> Some (M.mapi (resolve_package_url msgs) purls))
+
+let resolve_aliases : actor_aliases -> aliases Diag.result = fun alias_principals ->
+  Diag.with_message_store (fun msgs -> Some (M.mapi (resolve_alias_principal msgs) alias_principals))
+
+type flags = {
+  package_urls : package_urls;
+  actor_aliases : actor_aliases;
+  actor_idl_path : actor_idl_path;
+  }
+
+type resolved_flags = {
+  packages : package_map;
+  aliases : aliases;
+  actor_idl_path : actor_idl_path;
+  }
+
+let resolve_flags : flags -> resolved_flags Diag.result
+  = fun { actor_idl_path; package_urls; actor_aliases } ->
+  let open Diag.Syntax in
+  let* packages = resolve_packages package_urls in
+  let* aliases = resolve_aliases actor_aliases in
+  Diag.return { packages; aliases; actor_idl_path }
+
+let resolve
+  : flags -> Syntax.prog -> filepath -> resolved_imports Diag.result
+  = fun flags p base ->
+  let open Diag.Syntax in
+  let* { packages; aliases; actor_idl_path } = resolve_flags flags in
+  Diag.with_message_store (fun msgs ->
+    let base = if Sys.is_directory base then base else Filename.dirname base in
+    let imported = ref RIM.empty in
+    List.iter (resolve_import_string msgs base actor_idl_path aliases packages imported) (prog_imports p);
+    Some (List.map (fun (rim,at) -> rim @@ at) (RIM.bindings !imported))
+  )
+
+
+let collect_imports (p:prog) base : ((url * url option) list) Diag.result =
+  (* TODO unify the code path for resolve and collect_imports *)
+  let base = if Sys.is_directory base then base else Filename.dirname base in
+  Diag.with_message_store (fun msgs ->
+      let imports =
+        List.map (fun (f, _, at) ->
+            match Url.parse f with
+            | Ok (Url.Relative path) -> begin
+               match resolve_lib_import at (in_base base path) with
+               | Ok full_path ->
+                  (f, Some full_path)
+               | Error err ->
+                  Diag.add_msg msgs err;
+                  (f, None)
+              end
+            | _ -> (f, None)
+          ) (prog_imports p) in
+       Some imports
+    )
+
+
+
+ + + diff --git a/coverage/prelude/prelude.ml.html b/coverage/prelude/prelude.ml.html new file mode 100644 index 00000000000..46ec69e32a6 --- /dev/null +++ b/coverage/prelude/prelude.ml.html @@ -0,0 +1,59 @@ + + + + + prelude.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+
+
let prelude = [%blob "prelude/prelude.mo"]
+let internals = [%blob "prelude/internals.mo"]
+let timers_api = [%blob "prelude/timers-api.mo"]
+let prim_module' = [%blob "prelude/prim.mo"]
+let prim_module ~timers:required =
+  if required
+  then prim_module' ^ timers_api
+  else prim_module'
+
+
+
+ + + diff --git a/coverage/profiler/counters.ml.html b/coverage/profiler/counters.ml.html new file mode 100644 index 00000000000..516bb7ce10d --- /dev/null +++ b/coverage/profiler/counters.ml.html @@ -0,0 +1,526 @@ + + + + + counters.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+
+
(**
+
+Counters for regions, for super-simple profiling support.
+
+Useful for debugging combinatoric algorithms
+or other algorithms with known complexity,
+such as search, sorting, etc.
+
+*)
+
+open Source
+module Value = Mo_values.Value
+
+type t = {
+    label  : ((region * string), int) Hashtbl.t ;
+    region : (region, int) Hashtbl.t ;
+  }
+
+let dump_count = ref 0
+
+let zeros () = {
+    label  = Hashtbl.create 100 ;
+    region = Hashtbl.create 100 ;
+  }
+
+let bump_region c reg =
+  if !ProfilerFlags.profile then
+    match Hashtbl.find_opt c.region reg with
+      Some n -> Hashtbl.replace c.region reg (n + 1)
+    | None   -> Hashtbl.replace c.region reg 1
+
+let bump_label c reg lab =
+  if !ProfilerFlags.profile then
+    match Hashtbl.find_opt c.label (reg, lab) with
+      Some n -> Hashtbl.replace c.label (reg, lab) (n + 1)
+    | None   -> Hashtbl.replace c.label (reg, lab) 1
+
+(* lexicographic on (left.file, left.line, left.column, right.line, right.column) *)
+let region_order rega regb =
+  if rega.left.file = regb.left.file then
+    if rega.left.line = regb.left.line then
+      if rega.left.column = regb.left.column then
+        if rega.right.line = regb.right.line then
+          compare rega.right.column regb.right.column
+        else
+          compare rega.right.line regb.right.line
+      else
+        compare rega.left.column regb.left.column
+    else
+      compare rega.left.line regb.left.line
+  else
+    compare rega.left.file regb.left.file
+
+let label_order laba labb =
+  compare laba labb
+
+let dump (c:t) (ve: Value.value Value.Env.t) =
+  if !ProfilerFlags.profile then
+    if !ProfilerFlags.profile_verbose then (
+      Printf.printf "{\n" ;
+      Value.Env.iter (fun fn fv ->
+          Printf.printf " %s = %s;\n"
+            fn (Value.string_of_val 0 fv)
+        )
+        ve ;
+      Printf.printf "}\n"
+    ) ;
+    let dump_count = begin
+        let d = !dump_count in
+        dump_count := d + 1;
+        d
+      end
+    in
+    (* Include all labeled regions in the final table: *)
+    let labeled_counts =
+      Hashtbl.fold (
+          fun (reg, label) count counts ->
+          ((reg, Some label), count) :: counts)
+        c.label []
+    in
+    (* Include all other regions in the final table: *)
+    let all_region_counts =
+      Hashtbl.fold (
+          fun reg count counts ->
+          ((reg, None), count) :: counts)
+        c.region labeled_counts
+    in
+    let sorted_counts =
+      List.sort (
+          (* Final ordering:
+             - counts; bigger first; this is the main ordering constraint.
+             - labels; labeled expressions before unlabeled
+             - regions; earlier/outer regions before later/enclosed ones
+           *)
+          fun
+            ((rega, laba), x)
+            ((regb, labb), y)
+          ->
+          let diff = x - y in
+          if diff <> 0 then -diff else
+            match (laba, labb) with
+              (Some _, None) -> -1
+            | (None, Some _) ->  1
+            | (Some _, Some _) -> label_order laba labb
+            | (None, None) -> region_order rega regb
+        ) all_region_counts
+    in
+    let file = open_out (!ProfilerFlags.profile_file) in
+    let (suffix, flds) =
+      (* the suffix of the line consists of field values for each field in `profile_field_names`: *)
+      List.fold_right
+        (fun var (line, flds) ->
+          match Value.Env.find_opt var ve with
+            None   -> (Printf.sprintf "%s, #err" line, (var :: flds))
+          | Some v -> (Printf.sprintf "%s, %s" line (Value.string_of_val 0 v), var :: flds)
+        ) !ProfilerFlags.profile_field_names ("", [])
+    in
+    Printf.fprintf file "# column: source region\n" ;
+    Printf.fprintf file "# column: source region count\n" ;
+    List.iter (fun fld -> Printf.fprintf file "# column: --profile-field: %s\n" fld)
+      (List.rev flds) ;
+    let lab_total = ref 0 in
+    let unlab_total = ref 0 in
+    List.iter (fun ((region, labop), region_count) ->
+        assert (dump_count = 0);
+        (match labop with
+           None   -> unlab_total := !unlab_total + region_count
+         | Some x -> lab_total := !lab_total + region_count
+        );
+      ) sorted_counts;
+    Printf.fprintf file "# count total (unlabeled): %d\n" !unlab_total ;
+    Printf.fprintf file "# ...             labeled: %d\n" !lab_total ;
+    List.iter (fun ((region, labop), region_count) ->
+        assert (dump_count = 0);
+        Printf.fprintf file "%s\"%s\", %s, %d%s\n"
+          (!ProfilerFlags.profile_line_prefix)
+          (string_of_region region)
+          (match labop with
+             None   -> "null"
+           | Some x -> Printf.sprintf "?\"%s\"" x
+          )
+          region_count
+          suffix
+      ) sorted_counts;
+    close_out file
+
+
+
+ + + diff --git a/coverage/profiler/profiler.ml.html b/coverage/profiler/profiler.ml.html new file mode 100644 index 00000000000..607c6596200 --- /dev/null +++ b/coverage/profiler/profiler.ml.html @@ -0,0 +1,112 @@ + + + + + profiler.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+
+
open Mo_values
+
+let counters : Counters.t = Counters.zeros ()
+
+let bump_region reg =
+  Counters.bump_region counters reg
+
+let bump_label lab reg =
+  Counters.bump_label counters lab reg
+
+let process_prog_result result =
+  if !ProfilerFlags.profile then
+    try
+      match result with
+        Some(Value.Async a,_) -> begin
+          match Lib.Promise.value_opt a.Value.result with
+          | Some (Value.Ok v) -> Counters.dump counters (Value.as_obj v)
+          | Some _
+          | None   -> ()
+        end
+      | _  -> ()
+    with
+    | Invalid_argument _ -> () ;
+
+
+
+ + + diff --git a/coverage/profiler/profilerFlags.ml.html b/coverage/profiler/profilerFlags.ml.html new file mode 100644 index 00000000000..b180ac3934a --- /dev/null +++ b/coverage/profiler/profilerFlags.ml.html @@ -0,0 +1,50 @@ + + + + + profilerFlags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+
+
let profile = ref false
+let profile_verbose = ref false
+let profile_file = ref "profiling-counters.csv"
+let profile_line_prefix = ref ""
+let profile_field_names : string list ref = ref []
+
+
+
+ + + diff --git a/coverage/rts/rts.ml.html b/coverage/rts/rts.ml.html new file mode 100644 index 00000000000..f6f457d874d --- /dev/null +++ b/coverage/rts/rts.ml.html @@ -0,0 +1,113 @@ + + + + + rts.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+
+
(*
+This source file loads the RTS (`mo-rts.wasm` etc.) via the environment
+variables. This is for local development (e.g. inside `nix-shell`). The nix
+build of `moc` will statically replace this file with one that just embeds
+`mo-rts.wasm` etc. as a static string, to produce a fully self-contained `moc`
+binary for distribution.
+*)
+
+let load_file env =
+  match Sys.getenv_opt env with
+  | Some filename ->
+    let ic = open_in_bin filename in
+    let n = in_channel_length ic in
+    let s = Bytes.create n in
+    really_input ic s 0 n;
+    close_in ic;
+    Bytes.to_string s
+  | None ->
+    Printf.eprintf "Environment variable %s not set. Please run moc via the bin/moc wrapper (which should be in your PATH in the nix-shell)." env;
+    exit 1
+
+let wasm_non_incremental_release : string Lazy.t = lazy (load_file "MOC_NON_INCREMENTAL_RELEASE_RTS")
+let wasm_non_incremental_debug : string Lazy.t = lazy (load_file "MOC_NON_INCREMENTAL_DEBUG_RTS")
+
+let wasm_incremental_release : string Lazy.t = lazy (load_file "MOC_INCREMENTAL_RELEASE_RTS")
+let wasm_incremental_debug : string Lazy.t = lazy (load_file "MOC_INCREMENTAL_DEBUG_RTS")
+
+
+
+ + + diff --git a/coverage/source_id/generated.ml.html b/coverage/source_id/generated.ml.html new file mode 100644 index 00000000000..1b6192682a6 --- /dev/null +++ b/coverage/source_id/generated.ml.html @@ -0,0 +1,41 @@ + + + + + generated.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+
+
+
+
+1
+2
+
+
let release = Some "0.9.7+"
+let id = "zrjp97zv-1vy81zb3-xai04qry-26ih4ay6"
+
+
+
+ + + diff --git a/coverage/source_id/source_id.ml.html b/coverage/source_id/source_id.ml.html new file mode 100644 index 00000000000..cf44b372100 --- /dev/null +++ b/coverage/source_id/source_id.ml.html @@ -0,0 +1,51 @@ + + + + + source_id.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+
+
let release = Generated.release
+let id = Generated.id
+let banner = match Generated.release with
+  | None -> "(source " ^ Generated.id ^ ")"
+  | Some r -> r ^ " (source " ^ Generated.id ^ ")"
+
+
+
+ + + diff --git a/coverage/viper/pretty.ml.html b/coverage/viper/pretty.ml.html new file mode 100644 index 00000000000..4fbd8967ecb --- /dev/null +++ b/coverage/viper/pretty.ml.html @@ -0,0 +1,859 @@ + + + + + pretty.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+
+
open Source
+open Syntax
+
+open Format
+
+let marks = ref []
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+let pp_info ppf info =
+  match info with
+  | NoInfo -> ()
+  | ActorInit -> fprintf ppf "@[// translation of actor initializers @]"
+  | PublicFunction x -> fprintf ppf "@[// translation of PUBLIC function %s@]" x
+  | PrivateFunction x -> fprintf ppf "@[// translation of _private_ function %s@]" x
+
+let rec pp_prog ppf p =
+  match p.it with
+  | is ->
+   fprintf ppf "@[<v 0>%a@]"
+   (pp_print_list pp_item) is
+
+and pp_item ppf i =
+  match i.it with
+  | FieldI (id, typ) ->
+    fprintf ppf "@[<2>field %s:@ %a@]"
+      id.it
+      pp_typ typ
+  | MethodI (id, locals, rets, pres, posts, bo) ->
+    marks := i.at :: !marks;
+    fprintf ppf "\017@[<v 2>method %s%a@; %a@; %a@; %a@; %a@]\019"
+      id.it
+      pp_locals locals
+      pp_returns rets
+      pp_pres pres
+      pp_posts posts
+      pp_block_opt bo
+  | InvariantI (inv_name, e) -> (* TODO: srcloc mapping *)
+    fprintf ppf "@[<2>define %s($Self) (%a)@]" inv_name pp_exp e
+
+and pp_block_opt ppf = function
+  | None -> ()
+  | Some seqn ->
+    pp_seqn ppf seqn
+
+and pp_seqn ppf seqn =
+    let (ds, ss) = seqn.it in
+    fprintf ppf "@[<v 2>{ %a@ %a @;<0 -2>}@]"
+     (pp_print_list pp_decl) ds
+     (pp_print_list pp_stmt) ss
+
+and pp_decl ppf decl =
+    let (id, typ) = decl.it in
+    fprintf ppf "@[<v 0>var %s: %a@]"
+    id.it
+    pp_typ typ
+
+and pp_pres ppf exps =
+   fprintf ppf "@[<v 0>%a@]" (pp_print_list pp_pre) exps
+
+and pp_pre ppf exp =
+   fprintf ppf "@[<v 2>requires %a@]" pp_exp exp
+
+and pp_posts ppf exps =
+   fprintf ppf "@[<v 0>%a@]" (pp_print_list pp_post) exps
+
+and pp_post ppf exp =
+   fprintf ppf "@[<v 2>ensures %a@]" pp_exp exp
+
+and pp_local ppf (id, typ) =
+  fprintf ppf "@[<2>%s: %a@]"
+    id.it
+    pp_typ typ
+
+and pp_locals ppf pars =
+  fprintf ppf "@[<1>(%a)@]"
+    (pp_print_list ~pp_sep:comma (pp_local)) pars
+
+and pp_returns ppf pars =
+  match pars with
+  | [] -> ()
+  | _ ->
+    fprintf ppf "@[<1> returns (%a)@]"
+      (pp_print_list ~pp_sep:comma (pp_local)) pars
+
+and pp_typ ppf t =
+  match t.it with
+  | IntT -> pr ppf "Int"
+  | BoolT -> pr ppf "Bool"
+  | RefT -> pr ppf "Ref"
+
+and pp_exp ppf exp =
+  match exp.it with
+  | LocalVar (id, _) ->
+     fprintf ppf "%s" id.it
+  | FldAcc fldacc ->
+     pp_fldacc ppf fldacc
+  | MacroCall (m, e) ->
+     fprintf ppf "@[%s(%a)@]" m pp_exp e
+  | NotE e ->
+     fprintf ppf "@[(!%a)@]" pp_exp e
+  | MinusE e ->
+     fprintf ppf "@[(-%a)@]" pp_exp e
+  | NullLitE ->
+     fprintf ppf "null"
+  | BoolLitE b ->
+     fprintf ppf "%s" (if b then "true" else "false")
+  | IntLitE i ->
+     fprintf ppf "%s" String.(of_seq (Seq.filter (fun c -> c <> '_') (to_seq (Mo_values.Numerics.Int.to_string i))))
+  | AddE (e1, e2) | SubE (e1, e2) | MulE (e1, e2) | DivE (e1, e2) | ModE (e1, e2)
+  | EqCmpE (e1, e2) | NeCmpE (e1, e2) | GtCmpE (e1, e2) | GeCmpE (e1, e2) | LtCmpE (e1, e2) | LeCmpE (e1, e2)
+  | Implies (e1, e2) | OrE (e1, e2) | AndE (e1, e2) ->
+     let op = match exp.it with
+       | AddE _ -> "+" | SubE _ -> "-"
+       | MulE _ -> "*" | DivE _ -> "/" | ModE _ -> "%"
+       | EqCmpE _ -> "==" | NeCmpE _ -> "!="
+       | GtCmpE _ -> ">" | GeCmpE _ -> ">="
+       | LtCmpE _ -> "<" | LeCmpE _ -> "<="
+       | Implies _ -> "==>" | OrE _ -> "||" | AndE _ -> "&&"
+       | _ -> failwith "not a binary operator" in
+     fprintf ppf "(%a %s %a)" pp_exp e1 op pp_exp e2
+  | Old e ->
+    fprintf ppf "@[old(%a)@]" pp_exp e
+  | PermE p -> pp_perm ppf p
+  | AccE (fldacc, perm) -> fprintf ppf "@[acc(%a,%a)@]" pp_fldacc fldacc pp_exp perm
+  | _ -> fprintf ppf "@[// pretty printer not implemented for node at %s@]" (string_of_region exp.at)
+
+and pp_perm ppf perm =
+  match perm.it with
+  | NoP -> fprintf ppf "none"
+  | FullP -> fprintf ppf "write"
+  | WildcardP -> fprintf ppf "wildcard"
+  | FractionalP (a, b) -> fprintf ppf "@[(%a/%a)@]" pp_exp a pp_exp b
+
+and pp_stmt ppf stmt =
+  marks := stmt.at :: !marks;
+  fprintf ppf "\017%a\019"
+    pp_stmt' stmt.it
+
+and pp_stmt' ppf = function
+  | SeqnS seqn -> pp_seqn ppf seqn
+  | IfS (exp1, s1, { it = ([],[]); _ }) ->
+    fprintf ppf "@[<v 2>if (%a)@ %a@]"
+      pp_exp exp1
+      pp_seqn s1
+  | IfS (exp1, s1, s2) ->
+    fprintf ppf "@[<v 2>if (%a)@ %aelse@ %a@]"
+      pp_exp exp1
+      pp_seqn s1
+      pp_seqn s2
+  | WhileS (exp, _, s) -> (* TODO: Invariant *)
+    fprintf ppf "@[<v 2>while (%a) {@ %a}@]"
+      pp_exp exp
+      pp_seqn s
+  | VarAssignS (id, exp) ->
+    fprintf ppf "@[<v 2>%s := %a@]"
+      id.it
+      pp_exp exp
+  | FieldAssignS (fldacc, exp) ->
+    fprintf ppf "@[<v 2>%a := %a@]"
+      pp_fldacc fldacc
+      pp_exp exp
+  | InhaleS exp ->
+    fprintf ppf "@[<v 2>inhale %a@]"
+      pp_exp exp
+  | ExhaleS exp ->
+    fprintf ppf "@[<v 2>exhale %a@]"
+      pp_exp exp
+  | AssumeS exp ->
+    fprintf ppf "@[<v 2>assume %a@]"
+      pp_exp exp
+  | AssertS exp ->
+    fprintf ppf "@[<v 2>assert %a@]"
+      pp_exp exp
+  | PreconditionS exp ->
+    fprintf ppf "@[<v 2>/*requires %a*/@]"
+      pp_exp exp
+  | PostconditionS exp ->
+    fprintf ppf "@[<v 2>/*ensures %a*/@]"
+      pp_exp exp
+  | ConcurrencyS (max, exp, _) ->
+    fprintf ppf "@[<v 2>/*concurrency max %s, cond: s %a*/@]"
+      max
+      pp_exp exp
+  | MethodCallS (rs, m, args) ->
+    let () = match rs with
+    | [] -> ()
+    | r :: rs ->
+      let () = fprintf ppf "@[%s@]" r.it in
+      List.iter (fun r ->
+        fprintf ppf ", @[%s@]" r.it
+      ) rs
+    in
+    let () = if rs != [] then
+      fprintf ppf " := "
+    in
+    let () = fprintf ppf "@[%s(@]" m.it in
+    let () = match args with
+    | [] -> ()
+    | arg :: args ->
+      let () = fprintf ppf "@[%a@]" pp_exp arg in
+      fprintf ppf "@[%a@]" (pp_print_list ~pp_sep:comma pp_exp) args
+    in
+    fprintf ppf ")"
+  | LabelS (_, _) -> failwith "LabelS?"
+
+and pp_fldacc ppf fldacc =
+  match fldacc with
+  | (exp1, id) ->
+    fprintf ppf "@[(%a).%s@]" pp_exp exp1 id.it
+
+let prog_mapped file p =
+    marks := [];
+    let b = Buffer.create 16 in
+    let ppf = Format.formatter_of_buffer b in
+    Format.fprintf ppf "@[%a@]" pp_prog p;
+    Format.pp_print_flush ppf ();
+    let in_file { left; right } =
+      let left, right = { left with file }, { right with file } in
+      { left ; right } in
+    let marks = ref (List.rev_map (fun loc -> loc, in_file loc) !marks, [], []) in
+    let pos = ref 0 in
+    let push line column = match !marks with
+        | (mot, vip) :: clos, ope, don -> marks := clos, (mot, { vip with left = { vip.left with line; column } }) :: ope, don
+        | _ -> assert false in
+    let pop line column = match !marks with
+        | clos, (mot, vip) :: ope, don -> marks := clos, ope, (mot, { vip with right = { vip.right with line; column } }) :: don
+        | _ -> assert false in
+    let line = ref 1 in
+    let examine = function
+    | '\n' -> line := !line + 1; pos := 0; '\n';
+    | '\017' -> push !line !pos; '\017'
+    | '\019' -> pop !line !pos; '\017'
+    | a -> pos := !pos + 1; a in
+    let clean = function
+    | '\017' -> false
+    | _ -> true in
+    let b = Buffer.(of_seq Seq.(filter clean (map examine (to_seq b)))) in
+    let _, _, mapping = !marks in
+    let inside { left; right } other =
+        left.file = other.left.file &&
+        right.file = other.right.file &&
+        (other.left.line, other.left.column) <= (left.line, left.column) &&
+        (right.line, right.column) <= (other.right.line, other.right.column) in
+    let lookup (r : Source.region) =
+        let tighten prev (mot, vip) =
+            if inside r vip
+            then Some mot
+            else prev in
+        List.fold_left tighten None mapping in
+    Buffer.contents b, lookup
+
+let prog p = fst (prog_mapped "" p)
+
+
+
+ + + diff --git a/coverage/viper/trans.ml.html b/coverage/viper/trans.ml.html new file mode 100644 index 00000000000..f34cdb66ce6 --- /dev/null +++ b/coverage/viper/trans.ml.html @@ -0,0 +1,1629 @@ + + + + + trans.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+
+
open Source
+
+open Syntax
+
+module T = Mo_types.Type
+module M = Mo_def.Syntax
+module Arrange = Mo_def.Arrange
+
+module Stamps = Env.Make(String)
+
+(* symbol generation *)
+
+let stamps : int Stamps.t ref = ref Stamps.empty
+
+let reset_stamps () = stamps := Stamps.empty
+
+let fresh_stamp name =
+  let n = Lib.Option.get (Stamps.find_opt name !stamps) 0 in
+  stamps := Stamps.add name (n + 1) !stamps;
+  n
+
+let fresh_id name =
+  let n = fresh_stamp name in
+  if n = 0 then
+    name
+  else Printf.sprintf "%s_%i" name (fresh_stamp name)
+
+(* helpers for constructing annotated syntax *)
+
+let (^^^) at it note = { it; at; note}
+
+let (!!!) at it = (^^^) at it NoInfo
+
+
+let intLitE at i =
+  !!! at (IntLitE (Mo_values.Numerics.Int.of_int i))
+
+let accE at fldacc =
+  !!! at
+    (AccE(
+         fldacc,
+         !!! at (PermE (!!! at FullP))))
+
+let conjoin es at =
+  match es with
+  | [] -> !!! at (BoolLitE true)
+  | e0::es0 ->
+    List.fold_left
+      (fun e1 -> fun e2 ->
+        !!! at (AndE(e1, e2)))
+        e0
+        es0
+
+let rec adjoin ctxt e = function
+  | [] -> e
+  | f :: fs -> f ctxt (adjoin ctxt e fs)
+
+
+(* exception for reporting unsupported Motoko syntax *)
+exception Unsupported of Source.region * string
+
+let unsupported at sexp =
+  raise (Unsupported (at, (Wasm.Sexpr.to_string 80 sexp)))
+
+type sort = Field | Local | Method
+
+module Env = T.Env
+
+type ctxt =
+  { self : string option;
+    ids : sort T.Env.t;
+    ghost_items : (ctxt -> item) list ref;
+    ghost_inits : (ctxt -> stmt) list ref;
+    ghost_perms : (ctxt -> Source.region -> exp) list ref;
+    ghost_conc : (ctxt -> exp -> exp) list ref;
+  }
+
+let self ctxt at =
+  match ctxt.self with
+  | Some id -> !!! at (LocalVar (!!! at id,!!! at RefT))
+  | _ -> failwith "no self"
+
+let rec extract_invariants : item list -> (par -> invariants -> invariants) = function
+  | [] -> fun _ x -> x
+  | { it = InvariantI (s, e); at; _ } :: p ->
+      fun self es ->
+        !!! at (MacroCall(s, !!! at (LocalVar (fst self, snd self))))
+        :: extract_invariants p self es
+  | _ :: p -> extract_invariants p
+
+let rec extract_concurrency (seq : seqn) : stmt' list * seqn =
+  let open List in
+  let extr (concs, stmts) s : stmt' list * stmt list =
+    match s.it with
+    | ConcurrencyS _ -> s.it :: concs, stmts
+    | SeqnS seq ->
+      let concs', seq = extract_concurrency seq in
+      rev_append concs' concs, { s with it = SeqnS seq } :: stmts
+    | WhileS (e, inv, seq) ->
+      let concs', seq = extract_concurrency seq in
+      rev_append concs' concs, { s with it = WhileS (e, inv, seq) } :: stmts
+    | IfS (e, the, els) ->
+      let the_concs, the = extract_concurrency the in
+      let els_concs, els = extract_concurrency els in
+      rev_append els_concs (rev_append the_concs concs), { s with it = IfS (e, the, els) } :: stmts
+    | _ -> concs, s :: stmts in
+
+  let stmts = snd seq.it in
+  let conc, stmts = List.fold_left extr ([], []) stmts in
+  rev conc, { seq with it = fst seq.it, rev stmts }
+
+let rec unit (u : M.comp_unit) : prog Diag.result =
+  Diag.(
+    reset_stamps();
+    try return (unit' u) with
+    | Unsupported (at, desc) -> error at "0" "viper" ("translation to viper failed:\n"^desc)
+    | _ -> error u.it.M.body.at "1" "viper" "translation to viper failed"
+  )
+
+and unit' (u : M.comp_unit) : prog =
+  let { M.imports; M.body } = u.it in
+  match body.it with
+  | M.ActorU(id_opt, decs) ->
+    let ctxt = { self = None; ids = Env.empty; ghost_items = ref []; ghost_inits = ref []; ghost_perms = ref []; ghost_conc = ref [] } in
+    let ctxt', inits, mk_is = dec_fields ctxt decs in
+    let is' = List.map (fun mk_i -> mk_i ctxt') mk_is in
+    (* given is', compute ghost_is *)
+    let ghost_is = List.map (fun mk_i -> mk_i ctxt') !(ctxt.ghost_items) in
+    let init_id = !!! (Source.no_region) "__init__" in
+    let self_id = !!! (Source.no_region) "$Self" in
+    let self_typ = !!! (self_id.at) RefT in
+    let ctxt'' = { ctxt' with self = Some self_id.it } in
+    let perms = List.map (fun (id, _) -> fun (at : region) ->
+       (accE at (self ctxt'' at, id))) inits in
+    let ghost_perms = List.map (fun mk_p -> mk_p ctxt'') !(ctxt.ghost_perms) in
+    let perm =
+      fun (at : region) ->
+       List.fold_left
+         (fun pexp -> fun p_fn ->
+           !!! at (AndE(pexp, p_fn at)))
+         (!!! at (BoolLitE true))
+         (perms @ ghost_perms)
+    in
+    (* Add initializer *)
+    let init_list = List.map (fun (id, init) ->
+        !!! { left = id.at.left; right = init.at.right }
+          (FieldAssignS((self ctxt'' init.at, id), exp ctxt'' init)))
+        inits in
+    let init_list = init_list @ List.map (fun mk_s -> mk_s ctxt'') !(ctxt.ghost_inits) in
+    let init_body =
+      !!! (body.at) ([], init_list)(* ATG: Is this the correct position? *)
+    in
+    let init_m =
+      (^^^) (body.at) (MethodI(init_id, [self_id, self_typ], [], [], [], Some init_body)) ActorInit
+    in
+    let is'' = init_m :: is' in
+    (* Add permissions *)
+    let is''' = List.map (function
+    | {it = MethodI (id, ins, outs, pres, posts, body); at; note: info} ->
+      (^^^)
+        at
+        (MethodI (id, ins, outs,
+          !!! at (MacroCall("$Perm", self ctxt'' at))::pres,
+          !!! at (MacroCall("$Perm", self ctxt'' at))::posts,
+          body))
+        note
+      | x -> x) is'' in
+    (* Add functional invariants to public functions *)
+    let invs = extract_invariants is''' (self_id, self_typ) [] in
+    let is4 = List.map (function
+      | {
+        it = MethodI (id, ins, outs, pres, posts, body);
+        at;
+        note = ActorInit
+      } -> ((^^^)
+        at
+        (MethodI(id, ins, outs,
+          pres,
+          posts @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          body))
+        ActorInit
+      )
+      | {
+        it = MethodI (id, ins, outs, pres, posts, body);
+        at;
+        note = PublicFunction x
+      } -> ((^^^)
+        at
+        (MethodI(id, ins, outs,
+          pres @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          posts @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          body))
+        (PublicFunction x)
+      )
+      | x -> x
+    ) is''' in
+    let perm_def = !!! (body.at) (InvariantI("$Perm", perm body.at)) in
+    let inv_def = !!! (body.at) (InvariantI("$Inv", adjoin ctxt'' (conjoin invs body.at) !(ctxt.ghost_conc))) in
+    let is = ghost_is @ (perm_def :: inv_def :: is4) in
+    !!! (body.at) is
+  | _ -> assert false
+
+and dec_fields (ctxt : ctxt) (ds : M.dec_field list) =
+  match ds with
+  | [] ->
+    (ctxt, [], [])
+  | d :: ds ->
+    let ctxt, init, mk_i = dec_field ctxt d in
+    let ctxt, inits, mk_is = dec_fields ctxt ds in
+    (ctxt, (match init with Some i -> i::inits | _ -> inits), mk_i::mk_is)
+
+and dec_field ctxt d =
+  let ctxt, init, mk_i = dec_field' ctxt d.it in
+   (ctxt,
+    init,
+    fun ctxt' ->
+      let (i, info) = mk_i ctxt' in
+      (^^^) (d.at) i info)
+
+and dec_field' ctxt d =
+  match d.M.dec.it with
+  | M.VarD (x, e) ->
+      { ctxt with ids = Env.add x.it Field ctxt.ids },
+      Some (id x, e),
+      fun ctxt' ->
+        (FieldI(id x, tr_typ e.note.M.note_typ),
+        NoInfo)
+  (* async functions *)
+  | M.(LetD ({it=VarP f;_},
+             {it=FuncE(x, sp, tp, p, t_opt, sugar,
+             {it = AsyncE (T.Fut, _, e); _} );_}, None)) -> (* ignore async *)
+      { ctxt with ids = Env.add f.it Method ctxt.ids },
+      None,
+      fun ctxt' ->
+        let open Either in
+        let self_id = !!! (Source.no_region) "$Self" in
+        let ctxt'' = { ctxt' with self = Some self_id.it }
+        in (* TODO: add args (and rets?) *)
+        let stmts = stmt ctxt'' e in
+        let _, stmts = extract_concurrency stmts in
+        let pres, stmts' = List.partition_map (function { it = PreconditionS exp; _ } -> Left exp | s -> Right s) (snd stmts.it) in
+        let posts, stmts' = List.partition_map (function { it = PostconditionS exp; _ } -> Left exp | s -> Right s) stmts' in
+        (MethodI(id f, (self_id, !!! Source.no_region RefT)::args p, rets t_opt, pres, posts, Some { stmts with it = fst stmts.it, stmts' } ),
+        PublicFunction f.it)
+  (* private sync functions *)
+  | M.(LetD ({it=VarP f;_},
+             {it=FuncE(x, sp, tp, p, t_opt, sugar, e );_},
+             None)) ->
+      { ctxt with ids = Env.add f.it Method ctxt.ids },
+      None,
+      fun ctxt' ->
+        let open Either in
+        let self_id = !!! (Source.no_region) "$Self" in
+        let ctxt'' = { ctxt' with self = Some self_id.it }
+        in (* TODO: add args (and rets?) *)
+        let stmts = stmt ctxt'' e in
+        let _, stmts = extract_concurrency stmts in
+        let pres, stmts' = List.partition_map (function { it = PreconditionS exp; _ } -> Left exp | s -> Right s) (snd stmts.it) in
+        let posts, stmts' = List.partition_map (function { it = PostconditionS exp; _ } -> Left exp | s -> Right s) stmts' in
+        (MethodI(id f, (self_id, !!! Source.no_region RefT)::args p, rets t_opt, pres, posts, Some { stmts with it = fst stmts.it, stmts' } ),
+        PrivateFunction f.it)
+  | M.(ExpD { it = AssertE (Invariant, e); at; _ }) ->
+      ctxt,
+      None,
+      fun ctxt' ->
+        (InvariantI (Printf.sprintf "invariant_%d" at.left.line, exp { ctxt' with self = Some "$Self" }  e), NoInfo)
+  | _ ->
+     unsupported d.M.dec.at (Arrange.dec d.M.dec)
+
+and args p = match p.it with
+  | M.TupP ps ->
+    List.map
+      (fun p ->
+        match p.it with
+        | M.VarP x ->
+          (id x, tr_typ p.note)
+        | _ -> unsupported p.at (Arrange.pat p))
+      ps
+  |  _ -> unsupported p.at (Arrange.pat p)
+
+and block ctxt at ds =
+  let ctxt, mk_ss = decs ctxt ds in
+  !!! at (mk_ss ctxt)
+
+and decs ctxt ds =
+  match ds with
+  | [] -> (ctxt, fun ctxt' -> ([],[]))
+  | d::ds' ->
+    let (ctxt1, mk_s) = dec ctxt d in
+    let (ctxt2, mk_ss) = decs ctxt1 ds' in
+    (ctxt2,
+     fun ctxt' ->
+       let (l, s) = mk_s ctxt' in
+       let (ls, ss) = mk_ss ctxt' in
+       (l @ ls, s @ ss))
+
+and dec ctxt d =
+  let (!!) p = !!! (d.at) p in
+  match d.it with
+  | M.VarD (x, e) ->
+     (* TODO: translate e? *)
+    { ctxt with ids = Env.add x.it Local ctxt.ids },
+    fun ctxt' ->
+      ([ !!(id x, tr_typ e.note.M.note_typ) ],
+       [ !!(VarAssignS (id x, exp ctxt' e)) ])
+  | M.(LetD ({it=VarP x;_}, e, None)) ->
+     { ctxt with ids = Env.add x.it Local ctxt.ids },
+     fun ctxt' ->
+       ([ !!(id x, tr_typ e.note.M.note_typ) ],
+        [ !!(VarAssignS (id x, exp ctxt' e)) ])
+  | M.(ExpD e) -> (* TODO: restrict to e of unit type? *)
+     (ctxt,
+      fun ctxt' ->
+        let s = stmt ctxt' e in
+        s.it)
+  | _ ->
+     unsupported d.at (Arrange.dec d)
+
+and stmt ctxt (s : M.exp) : seqn =
+  let (!!) p = !!! (s.at) p in
+  match s.it with
+  | M.TupE [] ->
+     block ctxt s.at []
+  | M.BlockE ds ->
+     block ctxt s.at ds
+  | M.IfE(e, s1, s2) ->
+    !!([],
+       [ !!(IfS(exp ctxt e, stmt ctxt s1, stmt ctxt s2))])
+  | M.(AwaitE(T.Fut, { it = AsyncE (T.Fut, _, e); at; _ })) -> (* gross hack *)
+     let id = fresh_id "$message_async" in
+     let (!!) p = !!! (s.at) p in
+     let (!@) p = !!! at p in
+     ctxt.ghost_items :=
+       (fun ctxt ->
+         !!(FieldI (!!id, !!IntT))) ::
+       !(ctxt.ghost_items);
+     let mk_s = fun ctxt ->
+       !!! at
+         (FieldAssignS (
+            (self  ctxt s.at, !!id),
+            intLitE (s.at) 0))
+     in
+     ctxt.ghost_inits := mk_s :: !(ctxt.ghost_inits);
+     let mk_p = fun ctxt at ->
+       accE at (self ctxt at, !!! at id)
+     in
+     ctxt.ghost_perms := mk_p :: !(ctxt.ghost_perms);
+     let stmts = stmt ctxt e in
+     (* assume that each `async {...}` has an assertion *)
+     let conc, _ = extract_concurrency stmts in
+     let mk_c = match conc with
+       | [] ->
+         fun _ x -> x
+       | ConcurrencyS ("1", _, cond) :: _ ->
+         let (!?) p = !!! (cond.at) p in
+         let zero, one = intLitE Source.no_region 0, intLitE Source.no_region 1 in
+         fun ctxt x ->
+           let ghost_fld () = !?(FldAcc (self ctxt cond.at, !?id)) in
+           let between = !?(AndE (!?(LeCmpE (zero, ghost_fld ())), !?(LeCmpE (ghost_fld (), one)))) in
+           let is_one = !?(EqCmpE (ghost_fld (), one)) in
+           !?(AndE (x, !?(AndE (between, !?(Implies (is_one, cond.it (exp ctxt)))))))
+       | _ -> unsupported e.at (Arrange.exp e) in
+     ctxt.ghost_conc := mk_c :: !(ctxt.ghost_conc);
+     !!([],
+        [ !!(FieldAssignS(
+            (self ctxt Source.no_region, !!id),
+            (!!(AddE(!!(FldAcc (self ctxt (s.at), !!id)),
+                     intLitE Source.no_region 1)))));
+          !@(ExhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                              !@(MacroCall("$Inv", self ctxt at))))));
+          !@(SeqnS (
+              !@([],
+                 [
+                   !@(InhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                                  !@(AndE(!@(MacroCall("$Inv", self ctxt at)),
+                                          !@(GtCmpE(!@(FldAcc (self ctxt at, !@id)),
+                                               intLitE Source.no_region 0))))))));
+                   !@(FieldAssignS(
+                          (self ctxt at, !@id),
+                          (!@(SubE(!@(FldAcc (self ctxt at, !@id)),
+                                   intLitE at 1)))));
+                   !!! (e.at) (SeqnS stmts);
+                   !@(ExhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                                       !@(MacroCall("$Inv", self ctxt at)))))) ])));
+          !!(InhaleS (!!(AndE(!!(MacroCall("$Perm", self ctxt at)),
+                              !!(MacroCall("$Inv", self ctxt at))))));
+        ])
+  | M.WhileE(e, s1) ->
+     !!([],
+        [ !!(WhileS(exp ctxt e, [], stmt ctxt s1)) ]) (* TODO: Invariant *)
+  | M.(AssignE({it = VarE x; _}, e2)) ->
+     begin match Env.find x.it ctxt.ids with
+     | Local ->
+       let loc = !!! (x.at) (x.it) in
+       !!([],
+          [ !!(VarAssignS(loc, exp ctxt e2)) ])
+     | Field ->
+       let fld = (self ctxt x.at, id x) in
+       !!([],
+          [ !!(FieldAssignS(fld, exp ctxt e2)) ])
+     | _ ->
+        unsupported s.at (Arrange.exp s)
+     end
+  | M.AssertE (M.Precondition, e) ->
+    !!( [],
+        [ !!(PreconditionS (exp ctxt e)) ])
+  | M.AssertE (M.Postcondition, e) ->
+    !!([],
+       [ !!(PostconditionS (exp ctxt e)) ])
+  | M.AssertE (M.Concurrency n, e) ->
+    !!([],
+       [ !!(ConcurrencyS (n, exp ctxt e, !! ((|>) e))) ])
+  | M.AssertE (M.Static, e) ->
+    !!([],
+       [ !!(AssertS (exp ctxt e)) ])
+  | M.AssertE (M.Runtime, e) ->
+    !!([],
+       [ !!(AssumeS (exp ctxt e)) ])
+  | M.(CallE({it = VarE m; _}, inst, {it = TupE args; _})) ->
+    !!([],
+       [ !!(MethodCallS ([], id m,
+       let self_var = self ctxt m.at in
+       self_var :: List.map (fun arg -> exp ctxt arg) args))])
+  | _ ->
+     unsupported s.at (Arrange.exp s)
+
+and exp ctxt e =
+  let open Mo_values.Operator in
+  let (!!) p = !!! (e.at) p in
+  match e.it with
+  | M.VarE x ->
+    begin
+     match Env.find x.it ctxt.ids with
+     | Local ->
+        !!(LocalVar (id x, tr_typ e.note.M.note_typ))
+     | Field ->
+        !!(FldAcc (self ctxt x.at, id x))
+     | _ ->
+        unsupported e.at (Arrange.exp e)
+    end
+  | M.AnnotE(a, b) ->
+    exp ctxt a
+  | M.LitE r ->
+    begin match !r with
+    | M.BoolLit b ->
+       !!(BoolLitE b)
+    | M.IntLit i ->
+       !!(IntLitE i)
+    | _ ->
+       unsupported e.at (Arrange.exp e)
+    end
+  | M.NotE e ->
+     !!(NotE (exp ctxt e))
+  | M.RelE (ot, e1, op, e2) ->
+     let e1, e2 = exp ctxt e1, exp ctxt e2 in
+     !!(match op with
+      | EqOp -> EqCmpE (e1, e2)
+      | NeqOp -> NeCmpE (e1, e2)
+      | GtOp -> GtCmpE (e1, e2)
+      | GeOp -> GeCmpE (e1, e2)
+      | LtOp -> LtCmpE (e1, e2)
+      | LeOp -> LeCmpE (e1, e2))
+  | M.BinE (ot, e1, op, e2) ->
+     let e1, e2 = exp ctxt e1, exp ctxt e2 in
+     !!(match op with
+      | AddOp -> AddE (e1, e2)
+      | SubOp -> SubE (e1, e2)
+      | MulOp -> MulE (e1, e2)
+      | DivOp -> DivE (e1, e2)
+      | ModOp -> ModE (e1, e2)
+      | _ -> unsupported e.at (Arrange.exp e))
+  | M.OrE (e1, e2) ->
+     !!(OrE (exp ctxt e1, exp ctxt e2))
+  | M.AndE (e1, e2) ->
+     !!(AndE (exp ctxt e1, exp ctxt e2))
+  | M.ImpliesE (e1, e2) ->
+     !!(Implies (exp ctxt e1, exp ctxt e2))
+  | M.OldE e ->
+    !!(Old (exp ctxt e))
+  | _ ->
+     unsupported e.at (Arrange.exp e)
+
+and rets t_opt =
+  match t_opt with
+  | None -> []
+  | Some t ->
+    (match T.normalize t.note with
+     | T.Tup [] -> []
+     | T.Async (T.Fut, _, _) -> []
+     | _ -> unsupported t.at (Arrange.typ t)
+    )
+
+and id id = { it = id.it; at = id.at; note = NoInfo }
+
+and tr_typ typ =
+  { it = tr_typ' typ;
+    at = Source.no_region;
+    note = NoInfo }
+and tr_typ' typ =
+  match T.normalize typ with
+  | T.Prim T.Int -> IntT
+  | T.Prim T.Bool -> BoolT
+  | _ -> unsupported Source.no_region (Mo_types.Arrange_type.typ (T.normalize typ))
+
+
+
+ + + diff --git a/coverage/wasm-exts/abbreviation.ml.html b/coverage/wasm-exts/abbreviation.ml.html new file mode 100644 index 00000000000..b69b205949f --- /dev/null +++ b/coverage/wasm-exts/abbreviation.ml.html @@ -0,0 +1,560 @@ + + + + + abbreviation.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+
+

+(* pseudo-tags
+
+There can be several abbreviated DW_TAGs in the
+abbreviation table, each with a different attribute set.
+
+To refer to the duplicated tags, we use the bits above
+the 16 bits that are possible for DW_TAGs.
+
+A regular tag is just a pseudo-tag with an ordinal of 0.
+
+ *)
+
+let pseudo_tag base ordinal =
+  assert (base > 0 && base <= Dwarf5.dw_TAG_hi_user);
+  base lor (ordinal lsl 16)
+
+let dw_TAG_member_Pointer_mark = pseudo_tag Dwarf5.dw_TAG_member 1
+let dw_TAG_member_Word_sized_typed = pseudo_tag Dwarf5.dw_TAG_member 2
+let dw_TAG_member_Tag_mark = pseudo_tag Dwarf5.dw_TAG_member 3
+let dw_TAG_member_Variant_mark = pseudo_tag Dwarf5.dw_TAG_member 4
+let dw_TAG_member_In_variant = pseudo_tag Dwarf5.dw_TAG_member 5
+
+let dw_TAG_base_type_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 1
+let dw_TAG_base_type_Unsigned_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 2
+let dw_TAG_base_type_Unsigned_Bytes_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 3
+
+let dw_TAG_variant_Named = pseudo_tag Dwarf5.dw_TAG_variant 1
+
+let dw_TAG_subprogram_Ret = pseudo_tag Dwarf5.dw_TAG_subprogram 1
+
+type dw_tag_id = int
+type dw_bool = int
+type dw_attr_id = int
+type dw_form = int
+
+type tag_to_contents_assoc = (dw_tag_id * dw_bool * (dw_attr_id * dw_form) list) list
+
+(* The following data associates the expected attribute sequence
+   (each with encoding form) and whether it is hierarchic with
+   each used tag identifier. It corresponds to the `.debug_abbrev`
+   section. *)
+let abbreviations : tag_to_contents_assoc =
+  let open Dwarf5 in
+  [ ( dw_TAG_compile_unit, dw_CHILDREN_yes,
+      [ dw_AT_producer, dw_FORM_strp;
+        dw_AT_language, dw_FORM_data2;
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_stmt_list, dw_FORM_sec_offset;
+        dw_AT_comp_dir, dw_FORM_strp;
+        dw_AT_use_UTF8, dw_FORM_flag_present;
+        dw_AT_low_pc, dw_FORM_addr; (* TODO: dw_FORM_addrx? *)
+        dw_AT_addr_base, dw_FORM_sec_offset;
+        dw_AT_ranges, dw_FORM_sec_offset
+      ] );
+    ( dw_TAG_subprogram, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addrx;
+        dw_AT_high_pc, dw_FORM_data4(*FIXME*);
+         (* dw_AT_GNU_all_call_sites, dw_FORM_flag_present; *)
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_file, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_prototyped, dw_FORM_flag_present;
+        dw_AT_external, dw_FORM_flag(*_present*)
+      ] );
+    ( dw_TAG_subprogram_Ret, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addrx;
+        dw_AT_high_pc, dw_FORM_data4(*FIXME*);
+         (* dw_AT_GNU_all_call_sites, dw_FORM_flag_present; *)
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_decl_file, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_prototyped, dw_FORM_flag_present;
+        dw_AT_external, dw_FORM_flag(*_present*)
+      ] );
+    ( dw_TAG_formal_parameter, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_line, dw_FORM_data1;
+        dw_AT_decl_column, dw_FORM_data1;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_location, dw_FORM_exprloc
+      ] );
+    ( dw_TAG_lexical_block, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addr; (* filled-in by tag open *)
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_high_pc, dw_FORM_addr (* filled-in by tag close *)
+      ] );
+    ( dw_TAG_variable, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_line, dw_FORM_data1;
+        dw_AT_decl_column, dw_FORM_data1;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_location, dw_FORM_exprloc
+      ] );
+    ( dw_TAG_typedef, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref4
+      ] );
+    ( dw_TAG_base_type, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Anon, dw_CHILDREN_no,
+      [ dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Unsigned_Anon, dw_CHILDREN_no,
+      [ dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Unsigned_Bytes_Anon, dw_CHILDREN_no,
+      [ dw_AT_byte_size, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_pointer_type, dw_CHILDREN_no, (* TODO: use dw_TAG_reference_type *)
+      [ dw_AT_type, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_reference_type, dw_CHILDREN_no, (* TODO: BETTER: DW_TAG_rvalue_reference_type *)
+      [ dw_AT_type, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_structure_type, dw_CHILDREN_yes,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Pointer_mark, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Tag_mark, dw_CHILDREN_no,
+      [ dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Variant_mark, dw_CHILDREN_no,
+      [ dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_byte_size, dw_FORM_data1;
+        dw_AT_data_member_location, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Word_sized_typed, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_In_variant, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_data_member_location, dw_FORM_data1
+      ] );
+    ( dw_TAG_variant_part, dw_CHILDREN_yes,
+      [ dw_AT_discr, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_variant, dw_CHILDREN_yes,
+      [ dw_AT_discr_value, dw_FORM_data1
+      ] );
+    ( dw_TAG_variant_Named, dw_CHILDREN_yes,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_discr_value, dw_FORM_data4
+      ] );
+    ( dw_TAG_enumeration_type, dw_CHILDREN_yes,
+      [ dw_AT_artificial, dw_FORM_flag_present (* to avoid elimination *)
+      ] );
+    ( dw_TAG_enumerator, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_const_value, dw_FORM_data4
+      ] )
+  ]
+
+
+
+ + + diff --git a/coverage/wasm-exts/ast.ml.html b/coverage/wasm-exts/ast.ml.html new file mode 100644 index 00000000000..4c2f79bcb8d --- /dev/null +++ b/coverage/wasm-exts/ast.ml.html @@ -0,0 +1,936 @@ + + + + + ast.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+
+
(*
+This module originated as a copy of interpreter/syntax/ast.ml in the
+reference implementation.
+
+Base revision: WebAssembly/spec@a7a1856.
+
+The changes are:
+ * None for now
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+*)
+
+(*
+ * Throughout the implementation we use consistent naming conventions for
+ * syntactic elements, associated with the types defined here and in a few
+ * other places:
+ *
+ *   x : var
+ *   v : value
+ *   e : instr
+ *   f : func
+ *   m : module_
+ *
+ *   t : value_type
+ *   s : func_type
+ *   c : context / config
+ *
+ * These conventions mostly follow standard practice in language semantics.
+ *)
+
+open Wasm.Types
+module Values = Wasm.Values
+module Memory = Wasm.Memory
+open Wasm.Source
+
+
+(* Operators *)
+
+module IntOp =
+struct
+  type unop = Clz | Ctz | Popcnt | ExtendS of pack_size
+  type binop = Add | Sub | Mul | DivS | DivU | RemS | RemU
+             | And | Or | Xor | Shl | ShrS | ShrU | Rotl | Rotr
+  type testop = Eqz
+  type relop = Eq | Ne | LtS | LtU | GtS | GtU | LeS | LeU | GeS | GeU
+  type cvtop = ExtendSI32 | ExtendUI32 | WrapI64
+             | TruncSF32 | TruncUF32 | TruncSF64 | TruncUF64
+             | TruncSatSF32 | TruncSatUF32 | TruncSatSF64 | TruncSatUF64
+             | ReinterpretFloat
+end
+
+module FloatOp =
+struct
+  type unop = Neg | Abs | Ceil | Floor | Trunc | Nearest | Sqrt
+  type binop = Add | Sub | Mul | Div | Min | Max | CopySign
+  type testop
+  type relop = Eq | Ne | Lt | Gt | Le | Ge
+  type cvtop = ConvertSI32 | ConvertUI32 | ConvertSI64 | ConvertUI64
+             | PromoteF32 | DemoteF64
+             | ReinterpretInt
+end
+
+module I32Op = IntOp
+module I64Op = IntOp
+module F32Op = FloatOp
+module F64Op = FloatOp
+
+type unop = (I32Op.unop, I64Op.unop, F32Op.unop, F64Op.unop) Values.op
+type binop = (I32Op.binop, I64Op.binop, F32Op.binop, F64Op.binop) Values.op
+type testop = (I32Op.testop, I64Op.testop, F32Op.testop, F64Op.testop) Values.op
+type relop = (I32Op.relop, I64Op.relop, F32Op.relop, F64Op.relop) Values.op
+type cvtop = (I32Op.cvtop, I64Op.cvtop, F32Op.cvtop, F64Op.cvtop) Values.op
+
+type 'a memop =
+  {ty : value_type; align : int; offset : Memory.offset; sz : 'a option}
+type loadop = (pack_size * extension) memop
+type storeop = pack_size memop
+
+
+(* Expressions *)
+
+type var = int32 phrase
+type literal = Values.value phrase
+type name = int list
+
+type block_type = VarBlockType of var | ValBlockType of value_type option
+
+type instr = instr' phrase
+and instr' =
+  | Unreachable                       (* trap unconditionally *)
+  | Nop                               (* do nothing *)
+  | Drop                              (* forget a value *)
+  | Select                            (* branchless conditional *)
+  | Block of block_type * instr list  (* execute in sequence *)
+  | Loop of block_type * instr list   (* loop header *)
+  | If of block_type * instr list * instr list  (* conditional *)
+  | Br of var                         (* break to n-th surrounding label *)
+  | BrIf of var                       (* conditional break *)
+  | BrTable of var list * var         (* indexed break *)
+  | Return                            (* break from function body *)
+  | Call of var                       (* call function *)
+  | CallIndirect of var               (* call function through table *)
+  | LocalGet of var                   (* read local variable *)
+  | LocalSet of var                   (* write local variable *)
+  | LocalTee of var                   (* write local variable and keep value *)
+  | GlobalGet of var                  (* read global variable *)
+  | GlobalSet of var                  (* write global variable *)
+  | Load of loadop                    (* read memory at address *)
+  | Store of storeop                  (* write memory at address *)
+  | MemorySize                        (* size of linear memory *)
+  | MemoryGrow                        (* grow linear memory *)
+  | Const of literal                  (* constant *)
+  | Test of testop                    (* numeric test *)
+  | Compare of relop                  (* numeric comparison *)
+  | Unary of unop                     (* unary numeric operator *)
+  | Binary of binop                   (* binary numeric operator *)
+  | Convert of cvtop                  (* conversion *)
+  | Meta of Dwarf5.Meta.die           (* debugging metadata *)
+
+(* Globals & Functions *)
+
+type const = instr list phrase
+
+type global = global' phrase
+and global' =
+{
+  gtype : global_type;
+  value : const;
+}
+
+type func = func' phrase
+and func' =
+{
+  ftype : var;
+  locals : value_type list;
+  body : instr list;
+}
+
+
+(* Tables & Memories *)
+
+type table = table' phrase
+and table' =
+{
+  ttype : table_type;
+}
+
+type memory = memory' phrase
+and memory' =
+{
+  mtype : memory_type;
+}
+
+type 'data segment = 'data segment' phrase
+and 'data segment' =
+{
+  index : var;
+  offset : const;
+  init : 'data;
+}
+
+type table_segment = var list segment
+type memory_segment = string segment
+
+
+(* Modules *)
+
+type type_ = func_type phrase
+
+type export_desc = export_desc' phrase
+and export_desc' =
+  | FuncExport of var
+  | TableExport of var
+  | MemoryExport of var
+  | GlobalExport of var
+
+type export = export' phrase
+and export' =
+{
+  name : name;
+  edesc : export_desc;
+}
+
+type import_desc = import_desc' phrase
+and import_desc' =
+  | FuncImport of var
+  | TableImport of table_type
+  | MemoryImport of memory_type
+  | GlobalImport of global_type
+
+type import = import' phrase
+and import' =
+{
+  module_name : name;
+  item_name : name;
+  idesc : import_desc;
+}
+
+type module_ = module_' phrase
+and module_' =
+{
+  types : type_ list;
+  globals : global list;
+  tables : table list;
+  memories : memory list;
+  funcs : func list;
+  start : var option;
+  elems : var list segment list;
+  data : string segment list;
+  imports : import list;
+  exports : export list;
+}
+
+
+(* Auxiliary functions *)
+
+let empty_module =
+{
+  types = [];
+  globals = [];
+  tables = [];
+  memories = [];
+  funcs = [];
+  start = None;
+  elems  = [];
+  data = [];
+  imports = [];
+  exports = [];
+}
+
+
+let func_type_for (m : module_) (x : var) : func_type =
+  (Lib.List32.nth m.it.types x.it).it
+
+let import_type (m : module_) (im : import) : extern_type =
+  let {idesc; _} = im.it in
+  match idesc.it with
+  | FuncImport x -> ExternFuncType (func_type_for m x)
+  | TableImport t -> ExternTableType t
+  | MemoryImport t -> ExternMemoryType t
+  | GlobalImport t -> ExternGlobalType t
+
+let export_type (m : module_) (ex : export) : extern_type =
+  let {edesc; _} = ex.it in
+  let its = List.map (import_type m) m.it.imports in
+  let open Lib.List32 in
+  match edesc.it with
+  | FuncExport x ->
+    let fts =
+      funcs its @ List.map (fun f -> func_type_for m f.it.ftype) m.it.funcs
+    in ExternFuncType (nth fts x.it)
+  | TableExport x ->
+    let tts = tables its @ List.map (fun t -> t.it.ttype) m.it.tables in
+    ExternTableType (nth tts x.it)
+  | MemoryExport x ->
+    let mts = memories its @ List.map (fun m -> m.it.mtype) m.it.memories in
+    ExternMemoryType (nth mts x.it)
+  | GlobalExport x ->
+    let gts = globals its @ List.map (fun g -> g.it.gtype) m.it.globals in
+    ExternGlobalType (nth gts x.it)
+
+let string_of_name n =
+  let b = Buffer.create 16 in
+  let escape uc =
+    if uc < 0x20 || uc >= 0x7f then
+      Buffer.add_string b (Printf.sprintf "\\u{%02x}" uc)
+    else begin
+      let c = Char.chr uc in
+      if c = '\"' || c = '\\' then Buffer.add_char b '\\';
+      Buffer.add_char b c
+    end
+  in
+  List.iter escape n;
+  Buffer.contents b
+
+(* is_dwarf_like indicates whether an AST meta instruction
+   prevents dead-code elimination. Elimination is forbidden,
+   if the instruction contributes to a DIE, i.e. establishes, augments
+   or closes a DWARF Tag.
+ *)
+let rec is_dwarf_like' =
+  let open Dwarf5.Meta in
+  function
+  | Tag _ | TagClose | IntAttribute _ | StringAttribute _ | OffsetAttribute _ -> true
+  | Grouped parts -> List.exists is_dwarf_like' parts
+  | StatementDelimiter _ | FutureAttribute _ -> false
+let is_dwarf_like = function
+  | Meta m -> is_dwarf_like' m
+  | _ -> false
+
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModule.ml.html b/coverage/wasm-exts/customModule.ml.html new file mode 100644 index 00000000000..7f82ba15553 --- /dev/null +++ b/coverage/wasm-exts/customModule.ml.html @@ -0,0 +1,263 @@ + + + + + customModule.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
+
(* Extend the idea of a module as defined in Wasm.Syntax
+   with custom sections that we are interested in
+*)
+
+open Ast
+
+type name_section = {
+  module_ : string option;
+  function_names : (int32 * string) list;
+  locals_names : (int32 * (int32 * string) list) list;
+  label_names : (int32 * (int32 * string) list) list;
+  type_names : (int32 * string) list;
+  table_names : (int32 * string) list;
+  memory_names : (int32 * string) list;
+  global_names : (int32 * string) list;
+  elem_segment_names : (int32 * string) list;
+  data_segment_names : (int32 * string) list;
+}
+
+let empty_name_section : name_section = {
+  module_ = None;
+  function_names = [];
+  locals_names = [];
+  label_names = [];
+  type_names = [];
+  table_names = [];
+  memory_names = [];
+  global_names = [];
+  elem_segment_names = [];
+  data_segment_names = [];
+}
+
+type dylink_section = {
+  memory_size : int32;
+  memory_alignment : int32;
+  table_size : int32;
+  table_alignment : int32;
+  needed_dynlibs : string list;
+}
+
+type motoko_sections = {
+  labels : string list;
+  stable_types : (bool * string) option;
+  compiler : (bool * string) option;
+}
+
+type candid_sections = {
+  args : (bool * string) option;
+  service : (bool * string) option;
+}
+
+let empty_motoko_sections = {
+  labels = [];
+  stable_types = None;
+  compiler = None;
+}
+
+let empty_candid_sections = {
+  args = None;
+  service = None;
+}
+
+type extended_module = {
+  (* The non-custom sections *)
+  module_ : module_';
+  (* name section *)
+  name : name_section;
+  (* dylib section *)
+  dylink : dylink_section option;
+  (* candid sections *)
+  candid : candid_sections;
+  (* motoko sections *)
+  motoko : motoko_sections;
+  (* source map section *)
+  source_mapping_url : string option;
+}
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModuleDecode.ml.html b/coverage/wasm-exts/customModuleDecode.ml.html new file mode 100644 index 00000000000..df7ec55e5ba --- /dev/null +++ b/coverage/wasm-exts/customModuleDecode.ml.html @@ -0,0 +1,2961 @@ + + + + + customModuleDecode.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+
+
(*
+This module originated as a copy of interpreter/binary/encode.ml in the
+reference implementation.
+
+The changes are:
+ * Support for additional custom sections
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+
+TODO:
+ The treatment of known custom sections is suboptimal and assumes
+ they appear once, in a fixed relative order.
+ It would be better to just rescan the whole binary for each such section,
+ re-using the original custom section decoder from the reference implementation.
+*)
+
+module Error = Wasm.Error
+module Source = Wasm.Source
+module I32 = Wasm.I32
+module I64 = Wasm.I64
+module F32 = Wasm.F32
+module F64 = Wasm.F64
+module I32_convert = Wasm.I32_convert
+module I64_convert = Wasm.I64_convert
+module Utf8 = Lib.Utf8
+open CustomModule
+
+(* Decoding stream *)
+
+type stream =
+{
+  name : string;
+  bytes : string;
+  pos : int ref;
+}
+
+exception EOS
+
+let stream name bs = {name; bytes = bs; pos = ref 0}
+
+let len s = String.length s.bytes
+let pos s = !(s.pos)
+let eos s = (pos s = len s)
+
+let check n s = if pos s + n > len s then raise EOS
+let skip n s = if n < 0 then raise EOS else check n s; s.pos := !(s.pos) + n
+
+let read s = Char.code (s.bytes.[!(s.pos)])
+let peek s = if eos s then None else Some (read s)
+let get s = check 1 s; let b = read s in skip 1 s; b
+let get_string n s = let i = pos s in skip n s; String.sub s.bytes i n
+
+let checkpoint s = let p = !(s.pos) in fun () -> s.pos := p
+
+
+(* Errors *)
+
+module Code = Error.Make ()
+exception Code = Code.Error
+
+let string_of_byte b = Printf.sprintf "%02x" b
+
+let position (s : stream) pos = Source.({file = s.name; line = -1; column = pos})
+let region s left right =
+  Source.({left = position s left; right = position s right})
+
+let error s pos msg = raise (Code (region s pos pos, msg))
+let require b s pos msg = if not b then error s pos msg
+
+let guard f s =
+  try f s with EOS -> error s (len s) "unexpected end of section or function"
+
+let get = guard get
+let get_string n = guard (get_string n)
+let skip n = guard (skip n)
+
+let expect b s msg = require (guard get s = b) s (pos s - 1) msg
+let illegal s pos b = error s pos ("illegal opcode " ^ string_of_byte b)
+
+let at f s =
+  let left = pos s in
+  let x = f s in
+  let right = pos s in
+  Source.(x @@ region s left right)
+
+
+
+(* Generic values *)
+
+let u8 s =
+  get s
+
+let u16 s =
+  let lo = u8 s in
+  let hi = u8 s in
+  hi lsl 8 + lo
+
+let u32 s =
+  let lo = Int32.of_int (u16 s) in
+  let hi = Int32.of_int (u16 s) in
+  Int32.(add lo (shift_left hi 16))
+
+let u64 s =
+  let lo = I64_convert.extend_i32_u (u32 s) in
+  let hi = I64_convert.extend_i32_u (u32 s) in
+  Int64.(add lo (shift_left hi 32))
+
+let rec vuN n s =
+  require (n > 0) s (pos s) "integer representation too long";
+  let b = u8 s in
+  require (n >= 7 || b land 0x7f < 1 lsl n) s (pos s - 1) "integer too large";
+  let x = Int64.of_int (b land 0x7f) in
+  if b land 0x80 = 0 then x else Int64.(logor x (shift_left (vuN (n - 7) s) 7))
+
+let rec vsN n s =
+  require (n > 0) s (pos s) "integer representation too long";
+  let b = u8 s in
+  let mask = (-1 lsl (n - 1)) land 0x7f in
+  require (n >= 7 || b land mask = 0 || b land mask = mask) s (pos s - 1)
+    "integer too large";
+  let x = Int64.of_int (b land 0x7f) in
+  if b land 0x80 = 0
+  then (if b land 0x40 = 0 then x else Int64.(logor x (logxor (-1L) 0x7fL)))
+  else Int64.(logor x (shift_left (vsN (n - 7) s) 7))
+
+let vu1 s = Int64.to_int (vuN 1 s)
+let vu32 s = Int64.to_int32 (vuN 32 s)
+let vs7 s = Int64.to_int (vsN 7 s)
+let vs32 s = Int64.to_int32 (vsN 32 s)
+let vs33 s = I32_convert.wrap_i64 (vsN 33 s)
+let vs64 s = vsN 64 s
+let f32 s = F32.of_bits (u32 s)
+let f64 s = F64.of_bits (u64 s)
+
+let len32 s =
+  let pos = pos s in
+  let n = vu32 s in
+  if I32.le_u n (Int32.of_int (len s)) then Int32.to_int n else
+    error s pos "length out of bounds"
+
+let bool s = (vu1 s = 1)
+let string s = let n = len32 s in get_string n s
+let rec list f n s = if n = 0 then [] else let x = f s in x :: list f (n - 1) s
+let opt f b s = if b then Some (f s) else None
+let vec f s = let n = len32 s in list f n s
+
+let name s =
+  let pos = pos s in
+  try Utf8.decode (string s) with Utf8.Utf8 ->
+    error s pos "malformed UTF-8 encoding"
+
+let sized (f : int -> stream -> 'a) (s : stream) =
+  let size = len32 s in
+  let start = pos s in
+  let x = f size s in
+  require (pos s = start + size) s start "section size mismatch";
+  x
+
+
+(* Types *)
+
+open Wasm.Types
+
+let value_type s =
+  match vs7 s with
+  | -0x01 -> I32Type
+  | -0x02 -> I64Type
+  | -0x03 -> F32Type
+  | -0x04 -> F64Type
+  | _ -> error s (pos s - 1) "malformed value type"
+
+let elem_type s =
+  match vs7 s with
+  | -0x10 -> FuncRefType
+  | _ -> error s (pos s - 1) "malformed element type"
+
+let stack_type s = vec value_type s
+let func_type s =
+  match vs7 s with
+  | -0x20 ->
+    let ins = stack_type s in
+    let out = stack_type s in
+    FuncType (ins, out)
+  | _ -> error s (pos s - 1) "malformed function type"
+
+let limits vu s =
+  let has_max = bool s in
+  let min = vu s in
+  let max = opt vu has_max s in
+  {min; max}
+
+let table_type s =
+  let t = elem_type s in
+  let lim = limits vu32 s in
+  TableType (lim, t)
+
+let memory_type s =
+  let lim = limits vu32 s in
+  MemoryType lim
+
+let mutability s =
+  match u8 s with
+  | 0 -> Immutable
+  | 1 -> Mutable
+  | _ -> error s (pos s - 1) "malformed mutability"
+
+let global_type s =
+  let t = value_type s in
+  let mut = mutability s in
+  GlobalType (t, mut)
+
+
+(* Decode instructions *)
+
+open Ast
+open Operators
+
+let var s = vu32 s
+
+let op s = u8 s
+let end_ s = expect 0x0b s "END opcode expected"
+
+let memop s =
+  let align = vu32 s in
+  require (I32.le_u align 32l) s (pos s - 1) "malformed memop flags";
+  let offset = vu32 s in
+  Int32.to_int align, offset
+
+let block_type s =
+  match peek s with
+  | Some 0x40 -> skip 1 s; ValBlockType None
+  | Some b when b land 0xc0 = 0x40 -> ValBlockType (Some (value_type s))
+  | _ -> VarBlockType (at vs33 s)
+
+let math_prefix s =
+  let pos = pos s in
+  match op s with
+  | 0x00 -> i32_trunc_sat_f32_s
+  | 0x01 -> i32_trunc_sat_f32_u
+  | 0x02 -> i32_trunc_sat_f64_s
+  | 0x03 -> i32_trunc_sat_f64_u
+  | 0x04 -> i64_trunc_sat_f32_s
+  | 0x05 -> i64_trunc_sat_f32_u
+  | 0x06 -> i64_trunc_sat_f64_s
+  | 0x07 -> i64_trunc_sat_f64_u
+  | b -> illegal s pos b
+
+let rec instr s =
+  let pos = pos s in
+  match op s with
+  | 0x00 -> unreachable
+  | 0x01 -> nop
+
+  | 0x02 ->
+    let bt = block_type s in
+    let es' = instr_block s in
+    end_ s;
+    block bt es'
+  | 0x03 ->
+    let bt = block_type s in
+    let es' = instr_block s in
+    end_ s;
+    loop bt es'
+  | 0x04 ->
+    let bt = block_type s in
+    let es1 = instr_block s in
+    if peek s = Some 0x05 then begin
+      expect 0x05 s "ELSE or END opcode expected";
+      let es2 = instr_block s in
+      end_ s;
+      if_ bt es1 es2
+    end else begin
+      end_ s;
+      if_ bt es1 []
+    end
+
+  | 0x05 -> error s pos "misplaced ELSE opcode"
+  | 0x06| 0x07 | 0x08 | 0x09 | 0x0a as b -> illegal s pos b
+  | 0x0b -> error s pos "misplaced END opcode"
+
+  | 0x0c -> br (at var s)
+  | 0x0d -> br_if (at var s)
+  | 0x0e ->
+    let xs = vec (at var) s in
+    let x = at var s in
+    br_table xs x
+  | 0x0f -> return
+
+  | 0x10 -> call (at var s)
+  | 0x11 ->
+    let x = at var s in
+    expect 0x00 s "zero flag expected";
+    call_indirect x
+
+  | 0x12 | 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 as b -> illegal s pos b
+
+  | 0x1a -> drop
+  | 0x1b -> select
+
+  | 0x1c | 0x1d | 0x1e | 0x1f as b -> illegal s pos b
+
+  | 0x20 -> local_get (at var s)
+  | 0x21 -> local_set (at var s)
+  | 0x22 -> local_tee (at var s)
+  | 0x23 -> global_get (at var s)
+  | 0x24 -> global_set (at var s)
+
+  | 0x25 | 0x26 | 0x27 as b -> illegal s pos b
+
+  | 0x28 -> let a, o = memop s in i32_load a o
+  | 0x29 -> let a, o = memop s in i64_load a o
+  | 0x2a -> let a, o = memop s in f32_load a o
+  | 0x2b -> let a, o = memop s in f64_load a o
+  | 0x2c -> let a, o = memop s in i32_load8_s a o
+  | 0x2d -> let a, o = memop s in i32_load8_u a o
+  | 0x2e -> let a, o = memop s in i32_load16_s a o
+  | 0x2f -> let a, o = memop s in i32_load16_u a o
+  | 0x30 -> let a, o = memop s in i64_load8_s a o
+  | 0x31 -> let a, o = memop s in i64_load8_u a o
+  | 0x32 -> let a, o = memop s in i64_load16_s a o
+  | 0x33 -> let a, o = memop s in i64_load16_u a o
+  | 0x34 -> let a, o = memop s in i64_load32_s a o
+  | 0x35 -> let a, o = memop s in i64_load32_u a o
+
+  | 0x36 -> let a, o = memop s in i32_store a o
+  | 0x37 -> let a, o = memop s in i64_store a o
+  | 0x38 -> let a, o = memop s in f32_store a o
+  | 0x39 -> let a, o = memop s in f64_store a o
+  | 0x3a -> let a, o = memop s in i32_store8 a o
+  | 0x3b -> let a, o = memop s in i32_store16 a o
+  | 0x3c -> let a, o = memop s in i64_store8 a o
+  | 0x3d -> let a, o = memop s in i64_store16 a o
+  | 0x3e -> let a, o = memop s in i64_store32 a o
+
+  | 0x3f ->
+    expect 0x00 s "zero flag expected";
+    memory_size
+  | 0x40 ->
+    expect 0x00 s "zero flag expected";
+    memory_grow
+
+  | 0x41 -> i32_const (at vs32 s)
+  | 0x42 -> i64_const (at vs64 s)
+  | 0x43 -> f32_const (at f32 s)
+  | 0x44 -> f64_const (at f64 s)
+
+  | 0x45 -> i32_eqz
+  | 0x46 -> i32_eq
+  | 0x47 -> i32_ne
+  | 0x48 -> i32_lt_s
+  | 0x49 -> i32_lt_u
+  | 0x4a -> i32_gt_s
+  | 0x4b -> i32_gt_u
+  | 0x4c -> i32_le_s
+  | 0x4d -> i32_le_u
+  | 0x4e -> i32_ge_s
+  | 0x4f -> i32_ge_u
+
+  | 0x50 -> i64_eqz
+  | 0x51 -> i64_eq
+  | 0x52 -> i64_ne
+  | 0x53 -> i64_lt_s
+  | 0x54 -> i64_lt_u
+  | 0x55 -> i64_gt_s
+  | 0x56 -> i64_gt_u
+  | 0x57 -> i64_le_s
+  | 0x58 -> i64_le_u
+  | 0x59 -> i64_ge_s
+  | 0x5a -> i64_ge_u
+
+  | 0x5b -> f32_eq
+  | 0x5c -> f32_ne
+  | 0x5d -> f32_lt
+  | 0x5e -> f32_gt
+  | 0x5f -> f32_le
+  | 0x60 -> f32_ge
+
+  | 0x61 -> f64_eq
+  | 0x62 -> f64_ne
+  | 0x63 -> f64_lt
+  | 0x64 -> f64_gt
+  | 0x65 -> f64_le
+  | 0x66 -> f64_ge
+
+  | 0x67 -> i32_clz
+  | 0x68 -> i32_ctz
+  | 0x69 -> i32_popcnt
+  | 0x6a -> i32_add
+  | 0x6b -> i32_sub
+  | 0x6c -> i32_mul
+  | 0x6d -> i32_div_s
+  | 0x6e -> i32_div_u
+  | 0x6f -> i32_rem_s
+  | 0x70 -> i32_rem_u
+  | 0x71 -> i32_and
+  | 0x72 -> i32_or
+  | 0x73 -> i32_xor
+  | 0x74 -> i32_shl
+  | 0x75 -> i32_shr_s
+  | 0x76 -> i32_shr_u
+  | 0x77 -> i32_rotl
+  | 0x78 -> i32_rotr
+
+  | 0x79 -> i64_clz
+  | 0x7a -> i64_ctz
+  | 0x7b -> i64_popcnt
+  | 0x7c -> i64_add
+  | 0x7d -> i64_sub
+  | 0x7e -> i64_mul
+  | 0x7f -> i64_div_s
+  | 0x80 -> i64_div_u
+  | 0x81 -> i64_rem_s
+  | 0x82 -> i64_rem_u
+  | 0x83 -> i64_and
+  | 0x84 -> i64_or
+  | 0x85 -> i64_xor
+  | 0x86 -> i64_shl
+  | 0x87 -> i64_shr_s
+  | 0x88 -> i64_shr_u
+  | 0x89 -> i64_rotl
+  | 0x8a -> i64_rotr
+
+  | 0x8b -> f32_abs
+  | 0x8c -> f32_neg
+  | 0x8d -> f32_ceil
+  | 0x8e -> f32_floor
+  | 0x8f -> f32_trunc
+  | 0x90 -> f32_nearest
+  | 0x91 -> f32_sqrt
+  | 0x92 -> f32_add
+  | 0x93 -> f32_sub
+  | 0x94 -> f32_mul
+  | 0x95 -> f32_div
+  | 0x96 -> f32_min
+  | 0x97 -> f32_max
+  | 0x98 -> f32_copysign
+
+  | 0x99 -> f64_abs
+  | 0x9a -> f64_neg
+  | 0x9b -> f64_ceil
+  | 0x9c -> f64_floor
+  | 0x9d -> f64_trunc
+  | 0x9e -> f64_nearest
+  | 0x9f -> f64_sqrt
+  | 0xa0 -> f64_add
+  | 0xa1 -> f64_sub
+  | 0xa2 -> f64_mul
+  | 0xa3 -> f64_div
+  | 0xa4 -> f64_min
+  | 0xa5 -> f64_max
+  | 0xa6 -> f64_copysign
+
+  | 0xa7 -> i32_wrap_i64
+  | 0xa8 -> i32_trunc_f32_s
+  | 0xa9 -> i32_trunc_f32_u
+  | 0xaa -> i32_trunc_f64_s
+  | 0xab -> i32_trunc_f64_u
+  | 0xac -> i64_extend_i32_s
+  | 0xad -> i64_extend_i32_u
+  | 0xae -> i64_trunc_f32_s
+  | 0xaf -> i64_trunc_f32_u
+  | 0xb0 -> i64_trunc_f64_s
+  | 0xb1 -> i64_trunc_f64_u
+  | 0xb2 -> f32_convert_i32_s
+  | 0xb3 -> f32_convert_i32_u
+  | 0xb4 -> f32_convert_i64_s
+  | 0xb5 -> f32_convert_i64_u
+  | 0xb6 -> f32_demote_f64
+  | 0xb7 -> f64_convert_i32_s
+  | 0xb8 -> f64_convert_i32_u
+  | 0xb9 -> f64_convert_i64_s
+  | 0xba -> f64_convert_i64_u
+  | 0xbb -> f64_promote_f32
+
+  | 0xbc -> i32_reinterpret_f32
+  | 0xbd -> i64_reinterpret_f64
+  | 0xbe -> f32_reinterpret_i32
+  | 0xbf -> f64_reinterpret_i64
+
+  | 0xc0 -> i32_extend8_s
+  | 0xc1 -> i32_extend16_s
+  | 0xc2 -> i64_extend8_s
+  | 0xc3 -> i64_extend16_s
+  | 0xc4 -> i64_extend32_s
+
+  | 0xfc -> math_prefix s
+
+  | b -> illegal s pos b
+
+and instr_block s = List.rev (instr_block' s [])
+and instr_block' s es =
+  match peek s with
+  | None | Some (0x05 | 0x0b) -> es
+  | _ ->
+    let pos = pos s in
+    let e' = instr s in
+    instr_block' s (Source.(e' @@ region s pos pos) :: es)
+
+let const s =
+  let c = at instr_block s in
+  end_ s;
+  c
+
+
+(* Sections *)
+
+let id s =
+  let bo = peek s in
+  Option.map
+    (function
+    | 0 -> `CustomSection
+    | 1 -> `TypeSection
+    | 2 -> `ImportSection
+    | 3 -> `FuncSection
+    | 4 -> `TableSection
+    | 5 -> `MemorySection
+    | 6 -> `GlobalSection
+    | 7 -> `ExportSection
+    | 8 -> `StartSection
+    | 9 -> `ElemSection
+    | 10 -> `CodeSection
+    | 11 -> `DataSection
+    | _ -> error s (pos s) "malformed section id"
+    ) bo
+
+let section_with_size tag f default s =
+  match id s with
+  | Some tag' when tag' = tag -> ignore (u8 s); sized f s
+  | _ -> default
+
+let section tag f default s =
+  section_with_size tag (fun _ -> f) default s
+
+
+(* Type section *)
+
+let type_ s = at func_type s
+
+let type_section s =
+  section `TypeSection (vec type_) [] s
+
+
+(* Import section *)
+
+let import_desc s =
+  match u8 s with
+  | 0x00 -> FuncImport (at var s)
+  | 0x01 -> TableImport (table_type s)
+  | 0x02 -> MemoryImport (memory_type s)
+  | 0x03 -> GlobalImport (global_type s)
+  | _ -> error s (pos s - 1) "malformed import kind"
+
+let import s =
+  let module_name = name s in
+  let item_name = name s in
+  let idesc = at import_desc s in
+  {module_name; item_name; idesc}
+
+let import_section s =
+  section `ImportSection (vec (at import)) [] s
+
+
+(* Function section *)
+
+let func_section s =
+  section `FuncSection (vec (at var)) [] s
+
+
+(* Table section *)
+
+let table s =
+  let ttype = table_type s in
+  {ttype}
+
+let table_section s =
+  section `TableSection (vec (at table)) [] s
+
+
+(* Memory section *)
+
+let memory s =
+  let mtype = memory_type s in
+  {mtype}
+
+let memory_section s =
+  section `MemorySection (vec (at memory)) [] s
+
+
+(* Global section *)
+
+let global s =
+  let gtype = global_type s in
+  let value = const s in
+  {gtype; value}
+
+let global_section s =
+  section `GlobalSection (vec (at global)) [] s
+
+
+(* Export section *)
+
+let export_desc s =
+  match u8 s with
+  | 0x00 -> FuncExport (at var s)
+  | 0x01 -> TableExport (at var s)
+  | 0x02 -> MemoryExport (at var s)
+  | 0x03 -> GlobalExport (at var s)
+  | _ -> error s (pos s - 1) "malformed export kind"
+
+let export s =
+  let name = name s in
+  let edesc = at export_desc s in
+  {name; edesc}
+
+let export_section s =
+  section `ExportSection (vec (at export)) [] s
+
+
+(* Start section *)
+
+let start_section s =
+  section `StartSection (opt (at var) true) None s
+
+
+(* Code section *)
+
+let local s =
+  let n = vu32 s in
+  let t = value_type s in
+  n, t
+
+let code _ s =
+  let pos = pos s in
+  let nts = vec local s in
+  let ns = List.map (fun (n, _) -> I64_convert.extend_i32_u n) nts in
+  require (I64.lt_u (List.fold_left I64.add 0L ns) 0x1_0000_0000L)
+    s pos "too many locals";
+  let locals = List.flatten (List.map (Lib.Fun.uncurry Lib.List32.make) nts) in
+  let body = instr_block s in
+  end_ s;
+  {locals; body; ftype = Source.((-1l) @@ Source.no_region)}
+
+let code_section s =
+  section `CodeSection (vec (at (sized code))) [] s
+
+
+(* Element section *)
+
+let segment dat s =
+  let index = at var s in
+  let offset = const s in
+  let init = dat s in
+  {index; offset; init}
+
+let table_segment s =
+  segment (vec (at var)) s
+
+let elem_section s =
+  section `ElemSection (vec (at table_segment)) [] s
+
+
+(* Data section *)
+
+let memory_segment s =
+  segment string s
+
+let data_section s =
+  section `DataSection (vec (at memory_segment)) [] s
+
+
+(* Custom sections *)
+
+let custom_section (name_pred : int list -> bool) (f : int -> stream -> 'a) (default : 'a) (s : stream) =
+  let rewind = checkpoint s in
+  match id s with
+  | Some `CustomSection ->
+    ignore (u8 s);
+    let sec_size = len32 s in
+    let sec_start = pos s in
+    let sec_end = sec_start + sec_size in
+    if name_pred (name s)
+    then (* this is the right custom section *)
+      let x = f sec_end s in
+      require (pos s = sec_end) s sec_start "custom section size mismatch";
+      x
+    else begin (* wrong custom section, rewind *)
+      rewind ();
+      default
+    end
+  | Some _ -> default
+  | _ -> default
+
+
+let icp_name suffix =
+  let public_name = Utf8.decode ("icp:public " ^ suffix) in
+  let private_name = Utf8.decode ("icp:private " ^ suffix) in
+  fun name ->
+    if public_name = name then
+      Some true
+    else if private_name = name then
+      Some false
+    else None
+
+let icp_custom_section n (f : int -> stream -> 'a) (default : (bool * 'a) option) (s : stream) =
+  let rewind = checkpoint s in
+  match id s with
+  | Some `CustomSection ->
+    ignore (u8 s);
+    let sec_size = len32 s in
+    let sec_start = pos s in
+    let sec_end = sec_start + sec_size in
+    let name = name s in
+    let opt = icp_name n name in
+    begin
+    match opt with
+    | Some b ->
+      (* this is the right custom section *)
+      let x = f sec_end s in
+      require (pos s = sec_end) s sec_start "custom section size mismatch";
+      Some (b, x)
+    | None -> begin (* wrong custom section, rewind *)
+      rewind ();
+      default
+      end
+    end
+  | Some _ -> default
+  | _ -> default
+
+(* Dylink section *)
+
+let dylink _ s =
+  let memory_size = vu32 s in
+  let memory_alignment = vu32 s in
+  let table_size = vu32 s in
+  let table_alignment = vu32 s in
+  let needed_dynlibs = vec string s in
+  Some { memory_size; memory_alignment; table_size; table_alignment; needed_dynlibs }
+
+let is_dylink n = (n = Utf8.decode "dylink")
+
+let dylink_section s =
+  custom_section is_dylink dylink None s
+
+(* Name custom section *)
+
+let repeat_until p_end s x0 f =
+  let rec go x =
+    require (pos s <= p_end) s (pos s) "repeat_until overshot";
+    if pos s = p_end then x else go (f x s)
+  in go x0
+
+let assoc_list f = vec (fun s ->
+    let i = var s in
+    let x = f s in
+    (i, x)
+  )
+let name_map = assoc_list string
+let indirect_name_map = assoc_list name_map
+
+let name_section_subsection (ns : name_section) (s : stream) : name_section =
+  match u8 s with
+  | 0 -> (* module name *)
+    let mod_name = sized (fun _ -> string) s in
+    { ns with module_ = Some mod_name }
+  | 1 -> (* function names *)
+    let func_names = sized (fun _ -> name_map) s in
+    { ns with function_names = ns.function_names @ func_names }
+  | 2 -> (* local names *)
+    let loc_names = sized (fun _ -> indirect_name_map) s in
+    { ns with locals_names = ns.locals_names @ loc_names }
+  (* The following subsections are not in the standard yet, but from the extended-name-section proposal
+     https://github.com/WebAssembly/extended-name-section/blob/master/proposals/extended-name-section/Overview.md
+  *)
+  | 3 -> (* label names *)
+    let label_names = sized (fun _ -> indirect_name_map) s in
+    { ns with label_names = ns.label_names @ label_names }
+  | 4 -> (* type names *)
+    let type_names = sized (fun _ -> name_map) s in
+    { ns with type_names = ns.type_names @ type_names }
+  | 5 -> (* table names *)
+    let table_names = sized (fun _ -> name_map) s in
+    { ns with table_names = ns.table_names @ table_names }
+  | 6 -> (* memory names *)
+    let memory_names = sized (fun _ -> name_map) s in
+    { ns with memory_names = ns.memory_names @ memory_names }
+  | 7 -> (* global names *)
+    let global_names = sized (fun _ -> name_map) s in
+    { ns with global_names = ns.global_names @ global_names }
+  | 8 -> (* elem segment names *)
+    let elem_segment_names = sized (fun _ -> name_map) s in
+    { ns with elem_segment_names = ns.elem_segment_names @ elem_segment_names }
+  | 9 -> (* data segment names *)
+    let data_segment_names = sized (fun _ -> name_map) s in
+    { ns with data_segment_names = ns.data_segment_names @ data_segment_names }
+  | i -> error s (pos s) (Printf.sprintf "unknown name section subsection id %d" i)
+
+let name_section_content p_end s =
+  repeat_until p_end s empty_name_section name_section_subsection
+
+let is_name n = (n = Utf8.decode "name")
+
+let name_section s =
+  custom_section is_name name_section_content empty_name_section s
+
+(* Motoko sections *)
+
+let motoko_section_subsection (ms : motoko_sections) s =
+  match u8 s with
+  | 0 ->
+    let labels = sized (fun _ -> vec string) s in
+    { ms with labels = ms.labels @ labels }
+  | i -> error s (pos s) (Printf.sprintf "unknown motoko section subsection id %d" i)
+
+let motoko_section_content p_end s =
+  repeat_until p_end s empty_motoko_sections motoko_section_subsection
+
+let is_motoko n = (n = Utf8.decode "motoko")
+
+let utf8 sec_end s =
+  let pos = pos s in
+  let bytes = get_string (sec_end - pos) s in
+  try
+    let _ = Utf8.decode (string s) in
+    bytes
+  with Utf8.Utf8 ->
+    error s pos "malformed UTF-8 encoding"
+
+let motoko_sections s =
+  let stable_types = icp_custom_section "motoko:stable-types" utf8 None s in
+  let compiler = icp_custom_section "motoko:compiler" utf8 None s in
+  custom_section is_motoko motoko_section_content { empty_motoko_sections with stable_types; compiler} s
+
+(* Candid sections *)
+
+let candid_sections s =
+  let service = icp_custom_section "candid:service" utf8 None s in
+  let args = icp_custom_section "candid:args" utf8 None s in
+  { service; args }
+
+(* Other custom sections *)
+
+let candid_service_name = icp_name "candid:service"
+let candid_args_name = icp_name "candid:args"
+let motoko_stable_types_name = icp_name "motoko:stable-types"
+
+let is_icp icp_name n = icp_name n <> None
+
+let is_unknown n = not (
+  is_dylink n ||
+  is_name n ||
+  is_motoko n ||
+  is_icp candid_service_name n ||
+  is_icp candid_args_name n ||
+  is_icp motoko_stable_types_name n)
+
+let skip_custom sec_end s =
+  skip (sec_end - pos s) s;
+  true
+
+let skip_custom_section s =
+  custom_section is_unknown skip_custom false s
+
+(* Modules *)
+
+let rec iterate f s = if f s then iterate f s
+
+let module_ s =
+  let magic = u32 s in
+  require (magic = 0x6d736100l) s 0 "magic header not detected";
+  let version = u32 s in
+  require (version = Wasm.Encode.version) s 4 "unknown binary version";
+  let dylink = dylink_section s in
+  iterate skip_custom_section s;
+  let types = type_section s in
+  iterate skip_custom_section s;
+  let imports = import_section s in
+  iterate skip_custom_section s;
+  let func_types = func_section s in
+  iterate skip_custom_section s;
+  let tables = table_section s in
+  iterate skip_custom_section s;
+  let memories = memory_section s in
+  iterate skip_custom_section s;
+  let globals = global_section s in
+  iterate skip_custom_section s;
+  let exports = export_section s in
+  iterate skip_custom_section s;
+  let start = start_section s in
+  iterate skip_custom_section s;
+  let elems = elem_section s in
+  iterate skip_custom_section s;
+  let func_bodies = code_section s in
+  iterate skip_custom_section s;
+  let data = data_section s in
+  iterate skip_custom_section s;
+  let name = name_section s in
+  iterate skip_custom_section s;
+  (* TODO: allow candid/motoko sections anywhere, not just here, in this order *)
+  let candid = candid_sections s in
+  iterate skip_custom_section s;
+  let motoko = motoko_sections s in
+  iterate skip_custom_section s;
+  require (pos s = len s) s (len s) "junk after last section";
+  require (List.length func_types = List.length func_bodies)
+    s (len s) "function and code section have inconsistent lengths";
+  let funcs =
+    List.map2 Source.(fun t f -> {f.it with ftype = t} @@ f.at)
+      func_types func_bodies
+  in
+  { module_ =
+     {types; tables; memories; globals; funcs; imports; exports; elems; data; start};
+    dylink;
+    name;
+    motoko;
+    candid;
+    source_mapping_url = None;
+  }
+
+
+let decode name bs = module_ (stream name bs)
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModuleEncode.ml.html b/coverage/wasm-exts/customModuleEncode.ml.html new file mode 100644 index 00000000000..15aec983956 --- /dev/null +++ b/coverage/wasm-exts/customModuleEncode.ml.html @@ -0,0 +1,4020 @@ + + + + + customModuleEncode.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+
+
(*
+This module originated as a copy of interpreter/binary/encode.ml in the
+reference implementation.
+
+The changes are:
+ * Support for writing out a source map for the Code parts
+ * Support for additional custom sections
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+ *)
+
+(* Note [funneling DIEs through Wasm.Ast]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The DWARF debugging information entry (DIE) is a simple data carrier meant
+to be transmitted in a sequential fashion. Here, DIEs are attached to
+specially crafted instructions (Meta) in the instruction stream
+that is derived from the Wasm.Ast. Since these instructions are inserted artificially
+and are not intended for execution, they will not be emitted as instructions, but
+aggregated, correlated and finally output into DWARF sections of the binary.
+DIEs are defined in Dwarf5.Meta and can be recognised via the `is_dwarf_like` predicate.
+When extracted from the instruction stream using the predicate, we can check whether
+they are a tag (pre-filled) with attributes/subtags or free-standing attributes that will
+end up in the last tag. Similarly later tags nest into open tags. The larger-scale hierarchical
+structure is finally restored when all instructions are emitted. The mechanism is described in
+the blog post http://eli.thegreenplace.net/2011/09/29/an-interesting-tree-serialization-algorithm-from-dwarf
+
+ *)
+
+
+(* Note [bubbling up types in the tag hierarchy]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Certain DIEs (precisely `DW_TAG_*`s) can be referenced from attributes
+by means of position in the `.debug_info` section. E.g. types are referenced
+from a variety of DIEs. But since we generate DIEs for types on the fly,
+they end up at the same hierarchy level as the referencing DIE. Such references
+are allocated serially by extending a mapping to promises. The promise gets
+fulfilled when the prerequisite DIE is externalised into the section.
+To have every referencable tag a fulfilled section position, on the tag closing
+trigger we move every referencable DIE out of it and into the parent, effectively
+bubbling all up to toplevel. Then, immediately before externalising the DIE tree,
+we perform a stable sort by serial number, with non-referencable DIEs trailing.
+
+ *)
+
+(* Note [placeholder promises for typedefs]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+When forming the DIE for a Motoko type synonym (`type List = ...`)
+we need to do something special. Since such typedefs are cycle-breakers
+in the type system, we will need to adopt the same property in the
+`.debug_info` section too. So, we'll output `DW_TAG_typedef` before
+even knowing which type it refers to. Instead we use a DW_FORM_ref4
+for its `DW_AT_type` attribute, which is backpatchable. The value of this
+attribute is an integer, pointing to a fulfilled promise created when the
+DIE was formed. It got fulfilled when the typedef's type became known,
+another DIE, formed shortly after the typedef's. Resolving this fulfilled
+promise in turn gives us the index (actual type ref) of an unfulfilled
+promise (the forward reference). This forward reference will be fulfilled
+to be a byte offset in the section as soon as the corresponding DIE is emitted.
+
+We keep a function that performs the patching of the section (before it is
+written to disk) by overwriting the preliminary bytes in `DW_TAG_typedef`'s
+`DW_AT_type` with the now fulfilled offset obtained from the forward reference.
+
+ *)
+
+module Promise = Lib.Promise
+
+open Dwarf5.Meta
+
+open CustomModule
+
+(* Version *)
+
+let version = 1l
+
+
+(* Errors *)
+
+module Code = Wasm.Error.Make ()
+
+(* Encoding stream *)
+
+type stream =
+{
+  buf : Buffer.t;
+  patches : (int * char) list ref
+}
+
+let stream () = {buf = Buffer.create 8192; patches = ref []}
+let pos s = Buffer.length s.buf
+let put s b = Buffer.add_char s.buf b
+let put_string s bs = Buffer.add_string s.buf bs
+let patch s pos b = s.patches := (pos, b) :: !(s.patches)
+
+let to_string s =
+  let bs = Buffer.to_bytes s.buf in
+  List.iter (fun (pos, b) -> Bytes.set bs pos b) !(s.patches);
+  Bytes.to_string bs
+
+module References = Map.Make (struct type t = int let compare = compare end)
+
+let dw_references = ref References.empty
+let num_dw_references = ref 1 (* 0 would mean: "this tag doesn't fulfill a reference" *)
+let promise_reference_slot p =
+  let have = !num_dw_references in
+  dw_references := References.add have p !dw_references;
+  num_dw_references := 1 + have;
+  have
+let allocate_reference_slot () =
+  promise_reference_slot (Promise.make ())
+
+(* Encoding *)
+
+let encode (em : extended_module) =
+  let s = stream () in
+
+  (* source map *)
+  let map = Buffer.create 0 in
+  let sources = ref [] in
+  let sourcesContent = ref [] in
+  let segs = ref 0 in
+  let prev_if = ref 0 in
+  let prev_ol = ref 0 in
+  let prev_oc = ref 0 in
+  let prev_il = ref 0 in
+  let prev_ic = ref 0 in
+
+  (* modify reference *)
+  let modif r f = r := f !r in
+
+  let rec add_source filename = function (* FIXME: use add_string *)
+    | [] ->
+      sources := !sources @ [ filename ];
+      let source_code =
+        try
+          if filename = "prelude" then Prelude.prelude else
+          if filename = "prim" then Prelude.prim_module ~timers:!Mo_config.Flags.global_timer else
+          (*
+          Here we opportunistically see if we can find the source file
+          mentioned in the source location, and if we can, include its source
+          verbatim in the source map
+          *)
+          let ic = Stdlib.open_in filename in
+          let n = in_channel_length ic in
+          let s = Bytes.create n in
+          really_input ic s 0 n;
+          close_in ic;
+          Bytes.to_string s
+        with _ -> "" in
+      sourcesContent := !sourcesContent @ [ source_code ];
+      0
+    | h :: t -> if filename = h then 0 else 1 + add_source filename t
+  in
+
+  let add_string gen strings str = (* FIXME: perform suffix compression? *)
+    let strs = !strings in
+    match List.assoc_opt str strs with
+    | Some v -> v
+    | _ ->
+      let v = gen strs in
+      let strs' = (str, v) :: strs in strings := strs'; v
+  in
+
+  let dwarf_strings = ref [] in
+
+  let add_dwarf_string =
+    add_string (function | [] -> 0 | (h, p) :: _ -> String.length h + 1 + p) dwarf_strings in
+
+  let module Instrs = Set.Make (struct type t = int * Wasm.Source.pos let compare = compare end) in
+  let statement_positions = ref Instrs.empty in
+
+  let module DW_Sequence = Set.Make (struct type t = int * Instrs.t * int let compare = compare end) in
+  let sequence_bounds = ref DW_Sequence.empty in
+
+  let dwarf_tags = ref [Tag (None, 0, [])] in
+
+  let is_closed tag =
+    let tag_of (t', _, _) = tag = t' in
+    let (_, has_children, _) = List.find tag_of Abbreviation.abbreviations in
+    not (has_children <> 0)
+  in
+
+  let code_section_start = ref 0 in
+
+  let add_dwarf_tag refi tag =
+    let position_attr =
+      if tag = Dwarf5.dw_TAG_lexical_block then
+        [IntAttribute (Dwarf5.dw_AT_low_pc, pos s - !code_section_start)]
+      else [] in
+
+    (* invariant: at most one closed tag waiting for attributes *)
+
+    dwarf_tags :=
+      match !dwarf_tags with
+      | [Tag (refi, t, viscera)] when tag = Dwarf5.dw_TAG_compile_unit && t = 0 ->
+        [Tag (refi, tag, viscera)]
+      | Tag (_, t', _) as closed :: Tag (r, t, arts) :: tail when is_closed t' ->
+        Tag (refi, tag, position_attr) :: Tag (r, t, closed :: arts) :: tail
+      | tail ->
+        Tag (refi, tag, position_attr) :: tail in
+
+  let no_tags = List.for_all (function Tag _ -> false | _ -> true) in
+  let hoistables = List.partition (function Tag (Some r, _, _) -> true | _ -> false) in
+
+  let rec close_dwarf genuine =
+    (* hoist out referencable tags,
+       see Note [bubbling up types in the tag hierarchy] *)
+    begin match !dwarf_tags with
+    | Tag (refi, t, viscera) :: Tag (refi', t', viscera') :: tail
+        when genuine && Dwarf5.(dw_TAG_subprogram = t land 0xFF || dw_TAG_lexical_block = t land 0xFF) ->
+      let hoist, stay = hoistables viscera in
+      dwarf_tags := Tag (refi, t, stay) :: Tag (refi', t', hoist @ viscera') :: tail
+    | _ -> ()
+    end;
+
+    match !dwarf_tags with
+    | Tag (_, t, viscera) :: tail when Dwarf5.dw_TAG_lexical_block = t && no_tags viscera ->
+      dwarf_tags := tail
+    | Tag (refi, t, viscera) :: tail when genuine && Dwarf5.dw_TAG_lexical_block = t ->
+      dwarf_tags := Tag (refi, t, IntAttribute (Dwarf5.dw_AT_high_pc, pos s - !code_section_start) :: viscera) :: tail;
+      close_dwarf false
+    | [] -> failwith "no open DW_TAG"
+    | [Tag (None, t, viscera)] when Dwarf5.dw_TAG_compile_unit = t ->
+      dwarf_tags := Tag (None, t, viscera) :: []
+    | [Tag _] -> failwith "TOPLEVEL: NOT NESTING"
+    | Tag (_, t', _) as closed :: Tag (r, t, arts) :: tail when is_closed t' ->
+      dwarf_tags := Tag (r, t, closed :: arts) :: tail; close_dwarf genuine
+    | Tag (_, t', _) as nested :: Tag (r, tag, arts) :: t ->
+      dwarf_tags := Tag (r, tag, nested :: arts) :: t
+    | _ -> failwith "cannot close DW_AT" in
+  let add_dwarf_attribute attr =
+    dwarf_tags := match !dwarf_tags with
+                  | Tag (r, tag, arts) :: t -> Tag (r, tag, attr :: arts) :: t
+                  | _ -> assert false
+  in
+
+  (* keeping count of the DWARF code sequence we are in *)
+  let sequence_number = ref 0 in
+  (* array of the sizes of the emitted subprograms *)
+  let subprogram_sizes = Promise.make () in
+  (* offset of the range lists section *)
+  let rangelists = Promise.make () in
+
+  let extract_dwarf refi tag =
+    let open Dwarf5 in
+    let extract = function
+      | OffsetAttribute at when at = dw_AT_low_pc && tag = dw_TAG_compile_unit ->
+        add_dwarf_attribute (IntAttribute (at, 0))
+      | OffsetAttribute at when at = dw_AT_low_pc && tag land 0xFF = dw_TAG_subprogram ->
+        add_dwarf_attribute (IntAttribute (at, !sequence_number))
+      | OffsetAttribute at when at = dw_AT_high_pc && tag land 0xFF = dw_TAG_subprogram ->
+        let s = !sequence_number in
+        let resolve () = IntAttribute (at, Array.get (Promise.value subprogram_sizes) s) in
+        add_dwarf_attribute (FutureAttribute resolve)
+      | OffsetAttribute at when at = dw_AT_ranges ->
+        let resolve () = IntAttribute (at, Promise.value rangelists) in
+        add_dwarf_attribute (FutureAttribute resolve) (* see Note [Low_pc, High_pc, Ranges are special] *)
+      | (IntAttribute _ | StringAttribute _) as attr ->
+        add_dwarf_attribute attr
+      | _ -> assert false
+    in
+    add_dwarf_tag refi tag;
+    List.iter extract
+  in
+
+  let add_to_map file il ic ol oc =
+    let il = il - 1 in
+    let if_ = add_source file !sources in
+    if ol <> !prev_ol then Buffer.add_char map ';';
+    Vlq.Base64.encode map (oc - !prev_oc);             (* output column *)
+    Vlq.Base64.encode map (if_ - !prev_if);            (* sources index *)
+    Vlq.Base64.encode map (il - !prev_il);             (* input row *)
+    Vlq.Base64.encode map (ic - !prev_ic);             (* input column *)
+    Buffer.add_char map ',';
+
+    prev_if := if_; prev_ol := ol; prev_oc := oc; prev_il := il; prev_ic := ic; incr segs
+  in
+
+  let module E = struct
+    (* Generic values *)
+
+    let u8 i = put s (Char.chr (i land 0xff))
+    let u16 i = u8 (i land 0xff); u8 (i lsr 8)
+    let u32 i =
+      Int32.(u16 (to_int (logand i 0xffffl));
+             u16 (to_int (shift_right i 16)))
+    let u64 i =
+      Int64.(u32 (to_int32 (logand i 0xffffffffL));
+             u32 (to_int32 (shift_right i 32)))
+
+    let rec vu64 i =
+      let b = Int64.(to_int (logand i 0x7fL)) in
+      if 0L <= i && i < 128L then u8 b
+      else (u8 (b lor 0x80); vu64 (Int64.shift_right_logical i 7))
+
+    let rec vs64 i =
+      let b = Int64.(to_int (logand i 0x7fL)) in
+      if -64L <= i && i < 64L then u8 b
+      else (u8 (b lor 0x80); vs64 (Int64.shift_right i 7))
+
+    let vu1 i = vu64 Int64.(logand (of_int i) 1L)
+    let vu32 i = vu64 Int64.(logand (of_int32 i) 0xffffffffL)
+    let vs7 i = vs64 (Int64.of_int i)
+    let vs32 i = vs64 (Int64.of_int32 i)
+    let vs33 i = vs64 (Wasm.I64_convert.extend_i32_s i)
+    let f32 x = u32 (Wasm.F32.to_bits x)
+    let f64 x = u64 (Wasm.F64.to_bits x)
+
+    let len i =
+      if Int32.to_int (Int32.of_int i) <> i then
+        Code.error Wasm.Source.no_region
+          "cannot encode length with more than 32 bit";
+      vu32 (Int32.of_int i)
+
+    let bool b = vu1 (if b then 1 else 0)
+    let string bs = len (String.length bs); put_string s bs
+    let name n = string (Lib.Utf8.encode n)
+    let list f xs = List.iter f xs
+    let opt f xo = Option.iter f xo
+    let vec_by l f xs = l (List.length xs); list f xs
+    let vec f xs = vec_by len f xs
+
+    let gap32 () = let p = pos s in u32 0l; u8 0; p
+    let patch_gap32 p n =
+      assert (n <= 0x0fff_ffff); (* Strings cannot excess 2G anyway *)
+      let lsb i = Char.chr (i land 0xff) in
+      patch s p (lsb (n lor 0x80));
+      patch s (p + 1) (lsb ((n lsr 7) lor 0x80));
+      patch s (p + 2) (lsb ((n lsr 14) lor 0x80));
+      patch s (p + 3) (lsb ((n lsr 21) lor 0x80));
+      patch s (p + 4) (lsb (n lsr 28))
+
+    (* Types *)
+
+    open Wasm.Types
+
+    let value_type = function
+      | I32Type -> vs7 (-0x01)
+      | I64Type -> vs7 (-0x02)
+      | F32Type -> vs7 (-0x03)
+      | F64Type -> vs7 (-0x04)
+
+    let elem_type = function
+      | FuncRefType -> vs7 (-0x10)
+
+    let stack_type = vec value_type
+    let func_type = function
+      | FuncType (ins, out) -> vs7 (-0x20); stack_type ins; stack_type out
+
+    let limits vu {min; max} =
+      bool (max <> None); vu min; opt vu max
+
+    let table_type = function
+      | TableType (lim, t) -> elem_type t; limits vu32 lim
+
+    let memory_type = function
+      | MemoryType lim -> limits vu32 lim
+
+    let mutability = function
+      | Immutable -> u8 0
+      | Mutable -> u8 1
+
+    let global_type = function
+      | GlobalType (t, mut) -> value_type t; mutability mut
+
+    (* Expressions *)
+
+    open Wasm.Source
+    open Ast
+    open Wasm.Values
+
+    let op n = u8 n
+    let end_ () = op 0x0b
+
+    let memop {align; offset; _} = vu32 (Int32.of_int align); vu32 offset
+
+    let var x = vu32 x.it
+
+    let block_type = function
+      | VarBlockType x -> vs33 x.it
+      | ValBlockType None -> vs7 (-0x40)
+      | ValBlockType (Some t) -> value_type t
+
+    let rec instr noting e =
+      if e.at <> no_region then add_to_map e.at.left.file e.at.left.line e.at.left.column 0 (pos s);
+      noting e;
+      let instr = instr noting in
+
+      match e.it with
+      | Meta TagClose -> close_dwarf true
+      | Meta (StatementDelimiter left) ->
+        modif statement_positions (Instrs.add (pos s, left))
+      | Meta (Tag (r, t, attrs_tags)) ->
+        let tags, attrs = List.partition (function Tag _ | Grouped _ -> true | _ -> false) attrs_tags in
+        extract_dwarf r t attrs;
+        List.iter (fun t -> instr { e with it = (Meta t) }) tags
+      | Meta (Grouped []) -> ()
+      | Meta (Grouped (late :: former)) ->
+        instr { e with it = Meta (Grouped former) };
+        instr { e with it = Meta late }
+      | Meta _ -> assert false
+
+      | Unreachable -> op 0x00
+      | Nop -> op 0x01
+
+      | Block (bt, es) -> op 0x02; block_type bt; list instr es; end_ ()
+      | Loop (bt, es) -> op 0x03; block_type bt; list instr es; end_ ()
+      | If (bt, es1, es2) ->
+        op 0x04; block_type bt; list instr es1;
+        if es2 <> [] then op 0x05;
+        list instr es2; end_ ()
+
+      | Br x -> op 0x0c; var x
+      | BrIf x -> op 0x0d; var x
+      | BrTable (xs, x) -> op 0x0e; vec var xs; var x
+      | Return -> op 0x0f
+      | Call x -> op 0x10; var x
+      | CallIndirect x -> op 0x11; var x; u8 0x00
+
+      | Drop -> op 0x1a
+      | Select -> op 0x1b
+
+      | LocalGet x -> op 0x20; var x
+      | LocalSet x -> op 0x21; var x
+      | LocalTee x -> op 0x22; var x
+      | GlobalGet x -> op 0x23; var x
+      | GlobalSet x -> op 0x24; var x
+
+      | Load ({ty = I32Type; sz = None; _} as mo) -> op 0x28; memop mo
+      | Load ({ty = I64Type; sz = None; _} as mo) -> op 0x29; memop mo
+      | Load ({ty = F32Type; sz = None; _} as mo) -> op 0x2a; memop mo
+      | Load ({ty = F64Type; sz = None; _} as mo) -> op 0x2b; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack8, SX); _} as mo) ->
+        op 0x2c; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack8, ZX); _} as mo) ->
+        op 0x2d; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack16, SX); _} as mo) ->
+        op 0x2e; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack16, ZX); _} as mo) ->
+        op 0x2f; memop mo
+      | Load {ty = I32Type; sz = Some (Pack32, _); _} ->
+        assert false
+      | Load ({ty = I64Type; sz = Some (Pack8, SX); _} as mo) ->
+        op 0x30; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack8, ZX); _} as mo) ->
+        op 0x31; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack16, SX); _} as mo) ->
+        op 0x32; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack16, ZX); _} as mo) ->
+        op 0x33; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack32, SX); _} as mo) ->
+        op 0x34; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack32, ZX); _} as mo) ->
+        op 0x35; memop mo
+      | Load {ty = F32Type | F64Type; sz = Some _; _} ->
+        assert false
+
+      | Store ({ty = I32Type; sz = None; _} as mo) -> op 0x36; memop mo
+      | Store ({ty = I64Type; sz = None; _} as mo) -> op 0x37; memop mo
+      | Store ({ty = F32Type; sz = None; _} as mo) -> op 0x38; memop mo
+      | Store ({ty = F64Type; sz = None; _} as mo) -> op 0x39; memop mo
+      | Store ({ty = I32Type; sz = Some Pack8; _} as mo) -> op 0x3a; memop mo
+      | Store ({ty = I32Type; sz = Some Pack16; _} as mo) -> op 0x3b; memop mo
+      | Store {ty = I32Type; sz = Some Pack32; _} -> assert false
+      | Store ({ty = I64Type; sz = Some Pack8; _} as mo) -> op 0x3c; memop mo
+      | Store ({ty = I64Type; sz = Some Pack16; _} as mo) -> op 0x3d; memop mo
+      | Store ({ty = I64Type; sz = Some Pack32; _} as mo) -> op 0x3e; memop mo
+      | Store {ty = F32Type | F64Type; sz = Some _; _} -> assert false
+
+      | MemorySize -> op 0x3f; u8 0x00
+      | MemoryGrow -> op 0x40; u8 0x00
+
+      | Const {it = I32 c; _} -> op 0x41; vs32 c
+      | Const {it = I64 c; _} -> op 0x42; vs64 c
+      | Const {it = F32 c; _} -> op 0x43; f32 c
+      | Const {it = F64 c; _} -> op 0x44; f64 c
+
+      | Test (I32 I32Op.Eqz) -> op 0x45
+      | Test (I64 I64Op.Eqz) -> op 0x50
+      | Test (F32 _) -> assert false
+      | Test (F64 _) -> assert false
+
+      | Compare (I32 I32Op.Eq) -> op 0x46
+      | Compare (I32 I32Op.Ne) -> op 0x47
+      | Compare (I32 I32Op.LtS) -> op 0x48
+      | Compare (I32 I32Op.LtU) -> op 0x49
+      | Compare (I32 I32Op.GtS) -> op 0x4a
+      | Compare (I32 I32Op.GtU) -> op 0x4b
+      | Compare (I32 I32Op.LeS) -> op 0x4c
+      | Compare (I32 I32Op.LeU) -> op 0x4d
+      | Compare (I32 I32Op.GeS) -> op 0x4e
+      | Compare (I32 I32Op.GeU) -> op 0x4f
+
+      | Compare (I64 I64Op.Eq) -> op 0x51
+      | Compare (I64 I64Op.Ne) -> op 0x52
+      | Compare (I64 I64Op.LtS) -> op 0x53
+      | Compare (I64 I64Op.LtU) -> op 0x54
+      | Compare (I64 I64Op.GtS) -> op 0x55
+      | Compare (I64 I64Op.GtU) -> op 0x56
+      | Compare (I64 I64Op.LeS) -> op 0x57
+      | Compare (I64 I64Op.LeU) -> op 0x58
+      | Compare (I64 I64Op.GeS) -> op 0x59
+      | Compare (I64 I64Op.GeU) -> op 0x5a
+
+      | Compare (F32 F32Op.Eq) -> op 0x5b
+      | Compare (F32 F32Op.Ne) -> op 0x5c
+      | Compare (F32 F32Op.Lt) -> op 0x5d
+      | Compare (F32 F32Op.Gt) -> op 0x5e
+      | Compare (F32 F32Op.Le) -> op 0x5f
+      | Compare (F32 F32Op.Ge) -> op 0x60
+
+      | Compare (F64 F64Op.Eq) -> op 0x61
+      | Compare (F64 F64Op.Ne) -> op 0x62
+      | Compare (F64 F64Op.Lt) -> op 0x63
+      | Compare (F64 F64Op.Gt) -> op 0x64
+      | Compare (F64 F64Op.Le) -> op 0x65
+      | Compare (F64 F64Op.Ge) -> op 0x66
+
+      | Unary (I32 I32Op.Clz) -> op 0x67
+      | Unary (I32 I32Op.Ctz) -> op 0x68
+      | Unary (I32 I32Op.Popcnt) -> op 0x69
+      | Unary (I32 (I32Op.ExtendS Pack8)) -> op 0xc0
+      | Unary (I32 (I32Op.ExtendS Pack16)) -> op 0xc1
+      | Unary (I32 (I32Op.ExtendS Pack32)) -> assert false
+
+      | Unary (I64 I64Op.Clz) -> op 0x79
+      | Unary (I64 I64Op.Ctz) -> op 0x7a
+      | Unary (I64 I64Op.Popcnt) -> op 0x7b
+      | Unary (I64 (I64Op.ExtendS Pack8)) -> op 0xc2
+      | Unary (I64 (I64Op.ExtendS Pack16)) -> op 0xc3
+      | Unary (I64 (I64Op.ExtendS Pack32)) -> op 0xc4
+
+      | Unary (F32 F32Op.Abs) -> op 0x8b
+      | Unary (F32 F32Op.Neg) -> op 0x8c
+      | Unary (F32 F32Op.Ceil) -> op 0x8d
+      | Unary (F32 F32Op.Floor) -> op 0x8e
+      | Unary (F32 F32Op.Trunc) -> op 0x8f
+      | Unary (F32 F32Op.Nearest) -> op 0x90
+      | Unary (F32 F32Op.Sqrt) -> op 0x91
+
+      | Unary (F64 F64Op.Abs) -> op 0x99
+      | Unary (F64 F64Op.Neg) -> op 0x9a
+      | Unary (F64 F64Op.Ceil) -> op 0x9b
+      | Unary (F64 F64Op.Floor) -> op 0x9c
+      | Unary (F64 F64Op.Trunc) -> op 0x9d
+      | Unary (F64 F64Op.Nearest) -> op 0x9e
+      | Unary (F64 F64Op.Sqrt) -> op 0x9f
+
+      | Binary (I32 I32Op.Add) -> op 0x6a
+      | Binary (I32 I32Op.Sub) -> op 0x6b
+      | Binary (I32 I32Op.Mul) -> op 0x6c
+      | Binary (I32 I32Op.DivS) -> op 0x6d
+      | Binary (I32 I32Op.DivU) -> op 0x6e
+      | Binary (I32 I32Op.RemS) -> op 0x6f
+      | Binary (I32 I32Op.RemU) -> op 0x70
+      | Binary (I32 I32Op.And) -> op 0x71
+      | Binary (I32 I32Op.Or) -> op 0x72
+      | Binary (I32 I32Op.Xor) -> op 0x73
+      | Binary (I32 I32Op.Shl) -> op 0x74
+      | Binary (I32 I32Op.ShrS) -> op 0x75
+      | Binary (I32 I32Op.ShrU) -> op 0x76
+      | Binary (I32 I32Op.Rotl) -> op 0x77
+      | Binary (I32 I32Op.Rotr) -> op 0x78
+
+      | Binary (I64 I64Op.Add) -> op 0x7c
+      | Binary (I64 I64Op.Sub) -> op 0x7d
+      | Binary (I64 I64Op.Mul) -> op 0x7e
+      | Binary (I64 I64Op.DivS) -> op 0x7f
+      | Binary (I64 I64Op.DivU) -> op 0x80
+      | Binary (I64 I64Op.RemS) -> op 0x81
+      | Binary (I64 I64Op.RemU) -> op 0x82
+      | Binary (I64 I64Op.And) -> op 0x83
+      | Binary (I64 I64Op.Or) -> op 0x84
+      | Binary (I64 I64Op.Xor) -> op 0x85
+      | Binary (I64 I64Op.Shl) -> op 0x86
+      | Binary (I64 I64Op.ShrS) -> op 0x87
+      | Binary (I64 I64Op.ShrU) -> op 0x88
+      | Binary (I64 I64Op.Rotl) -> op 0x89
+      | Binary (I64 I64Op.Rotr) -> op 0x8a
+
+      | Binary (F32 F32Op.Add) -> op 0x92
+      | Binary (F32 F32Op.Sub) -> op 0x93
+      | Binary (F32 F32Op.Mul) -> op 0x94
+      | Binary (F32 F32Op.Div) -> op 0x95
+      | Binary (F32 F32Op.Min) -> op 0x96
+      | Binary (F32 F32Op.Max) -> op 0x97
+      | Binary (F32 F32Op.CopySign) -> op 0x98
+
+      | Binary (F64 F64Op.Add) -> op 0xa0
+      | Binary (F64 F64Op.Sub) -> op 0xa1
+      | Binary (F64 F64Op.Mul) -> op 0xa2
+      | Binary (F64 F64Op.Div) -> op 0xa3
+      | Binary (F64 F64Op.Min) -> op 0xa4
+      | Binary (F64 F64Op.Max) -> op 0xa5
+      | Binary (F64 F64Op.CopySign) -> op 0xa6
+
+      | Convert (I32 I32Op.ExtendSI32) -> assert false
+      | Convert (I32 I32Op.ExtendUI32) -> assert false
+      | Convert (I32 I32Op.WrapI64) -> op 0xa7
+      | Convert (I32 I32Op.TruncSF32) -> op 0xa8
+      | Convert (I32 I32Op.TruncUF32) -> op 0xa9
+      | Convert (I32 I32Op.TruncSF64) -> op 0xaa
+      | Convert (I32 I32Op.TruncUF64) -> op 0xab
+      | Convert (I32 I32Op.TruncSatSF32) -> op 0xfc; op 0x00
+      | Convert (I32 I32Op.TruncSatUF32) -> op 0xfc; op 0x01
+      | Convert (I32 I32Op.TruncSatSF64) -> op 0xfc; op 0x02
+      | Convert (I32 I32Op.TruncSatUF64) -> op 0xfc; op 0x03
+      | Convert (I32 I32Op.ReinterpretFloat) -> op 0xbc
+
+      | Convert (I64 I64Op.ExtendSI32) -> op 0xac
+      | Convert (I64 I64Op.ExtendUI32) -> op 0xad
+      | Convert (I64 I64Op.WrapI64) -> assert false
+      | Convert (I64 I64Op.TruncSF32) -> op 0xae
+      | Convert (I64 I64Op.TruncUF32) -> op 0xaf
+      | Convert (I64 I64Op.TruncSF64) -> op 0xb0
+      | Convert (I64 I64Op.TruncUF64) -> op 0xb1
+      | Convert (I64 I64Op.TruncSatSF32) -> op 0xfc; op 0x04
+      | Convert (I64 I64Op.TruncSatUF32) -> op 0xfc; op 0x05
+      | Convert (I64 I64Op.TruncSatSF64) -> op 0xfc; op 0x06
+      | Convert (I64 I64Op.TruncSatUF64) -> op 0xfc; op 0x07
+      | Convert (I64 I64Op.ReinterpretFloat) -> op 0xbd
+
+      | Convert (F32 F32Op.ConvertSI32) -> op 0xb2
+      | Convert (F32 F32Op.ConvertUI32) -> op 0xb3
+      | Convert (F32 F32Op.ConvertSI64) -> op 0xb4
+      | Convert (F32 F32Op.ConvertUI64) -> op 0xb5
+      | Convert (F32 F32Op.PromoteF32) -> assert false
+      | Convert (F32 F32Op.DemoteF64) -> op 0xb6
+      | Convert (F32 F32Op.ReinterpretInt) -> op 0xbe
+
+      | Convert (F64 F64Op.ConvertSI32) -> op 0xb7
+      | Convert (F64 F64Op.ConvertUI32) -> op 0xb8
+      | Convert (F64 F64Op.ConvertSI64) -> op 0xb9
+      | Convert (F64 F64Op.ConvertUI64) -> op 0xba
+      | Convert (F64 F64Op.PromoteF32) -> op 0xbb
+      | Convert (F64 F64Op.DemoteF64) -> assert false
+      | Convert (F64 F64Op.ReinterpretInt) -> op 0xbf
+
+    let const c =
+      list (instr ignore) c.it; end_ ()
+
+    (* Sections *)
+
+    let section id f x needed =
+      if needed then begin
+        u8 id;
+        let g = gap32 () in
+        let p = pos s in
+        f x;
+        patch_gap32 g (pos s - p)
+      end
+
+    let custom_section name f x needed =
+      section 0 (fun x ->
+        string name;
+        f x
+      ) x needed
+
+    (* Type section *)
+    let type_ t = func_type t.it
+
+    let type_section ts =
+      section 1 (vec type_) ts (ts <> [])
+
+    (* Import section *)
+    let import_desc d =
+      match d.it with
+      | FuncImport x -> u8 0x00; var x
+      | TableImport t -> u8 0x01; table_type t
+      | MemoryImport t -> u8 0x02; memory_type t
+      | GlobalImport t -> u8 0x03; global_type t
+
+    let import im =
+      let {module_name; item_name; idesc} = im.it in
+      name module_name; name item_name; import_desc idesc
+
+    let import_section ims =
+      section 2 (vec import) ims (ims <> [])
+
+    (* Function section *)
+    let func f = var f.it.ftype
+
+    let func_section fs =
+      section 3 (vec func) fs (fs <> [])
+
+    (* Table section *)
+    let table tab =
+      let {ttype} = tab.it in
+      table_type ttype
+
+    let table_section tabs =
+      section 4 (vec table) tabs (tabs <> [])
+
+    (* Memory section *)
+    let memory mem =
+      let {mtype} = mem.it in
+      memory_type mtype
+
+    let memory_section mems =
+      section 5 (vec memory) mems (mems <> [])
+
+    (* Global section *)
+    let global g =
+      let {gtype; value} = g.it in
+      global_type gtype; const value
+
+    let global_section gs =
+      section 6 (vec global) gs (gs <> [])
+
+    (* Export section *)
+    let export_desc d =
+      match d.it with
+      | FuncExport x -> u8 0; var x
+      | TableExport x -> u8 1; var x
+      | MemoryExport x -> u8 2; var x
+      | GlobalExport x -> u8 3; var x
+
+    let export ex =
+      let {name = n; edesc} = ex.it in
+      name n; export_desc edesc
+
+    let export_section exs =
+      section 7 (vec export) exs (exs <> [])
+
+    (* Start section *)
+    let start_section xo =
+      section 8 (opt var) xo (xo <> None)
+
+    (* Code section *)
+    let compress ts =
+      let combine t = function
+        | (t', n) :: ts when t = t' -> (t, n + 1) :: ts
+        | ts -> (t, 1) :: ts
+      in List.fold_right combine ts []
+
+    let local (t, n) = len n; value_type t
+
+    let (here_dir, asset_dir) = (0, 1) (* reversed indices in dir_names, below *)
+    let source_names =
+      ref [ "prelude", (Promise.make (), asset_dir)
+          ; "prim", (Promise.make (), asset_dir)
+          ; "rts.wasm", (Promise.make (), asset_dir) ] (* make these appear last in .debug_line file_name_entries *)
+    let dir_names = (* ditto, but reversed: 6.2.4.1 Standard Content Descriptions *)
+      ref [ "<moc-asset>", (Promise.make (), asset_dir)
+          ; Filename.dirname "", (Promise.make (), here_dir) ]
+    let source_path_indices = ref (List.map (fun (p, (_, i)) -> p, i) !source_names)
+    let add_source_name =
+      let source_adder dir_index _ = Promise.make (), dir_index in
+      let add_source_path_index (_, _) = function
+        | "" -> assert false
+        | str ->
+          ignore (add_string (function [] -> assert false | (_, i) :: _ -> i + 1) source_path_indices str) in
+      function
+      | "" -> ()
+      | ("prelude" | "prim" | "rts.wasm") as asset ->
+        add_source_path_index (add_string (source_adder asset_dir) source_names asset) asset
+      | path ->
+        let dir, basename = Filename.(dirname path, basename path) in
+        let _, dir_index = add_string (function [] -> assert false | (_, (_, i)) :: _ -> Promise.make (), i + 1) dir_names dir in
+        let promise = add_string (source_adder dir_index) source_names basename in
+        add_source_path_index promise path
+
+    let code f =
+      let {locals; body; _} = f.it in
+      let g = gap32 () in
+      let p = pos s in
+      vec local (compress locals);
+      let instr_notes = ref Instrs.empty in
+      let note i =
+        if not (is_dwarf_like i.it) then
+          (modif instr_notes (Instrs.add (pos s, i.at.left));
+           ignore (add_source_name i.at.left.file)
+          ) in
+      list (instr note) body;
+      modif instr_notes (Instrs.add (pos s, f.at.right));
+      ignore (add_source_name f.at.right.file);
+      end_ ();
+      incr sequence_number;
+      let sequence_end = pos s in
+      patch_gap32 g (sequence_end - p);
+      modif sequence_bounds (DW_Sequence.add (p, !instr_notes, sequence_end))
+
+    let code_section fs =
+      section 10 (fun fs -> code_section_start := pos s; vec code fs) fs (fs <> [])
+
+    (* Element section *)
+    let segment dat seg =
+      let {index; offset; init} = seg.it in
+      var index; const offset; dat init
+
+    let table_segment seg =
+      segment (vec var) seg
+
+    let elem_section elems =
+      section 9 (vec table_segment) elems (elems <> [])
+
+    (* Data section *)
+    let memory_segment seg =
+      segment string seg
+
+    let data_section data =
+      section 11 (vec memory_segment) data (data <> [])
+
+    (* sourceMappingURL section *)
+
+    let source_mapping_url_section smu =
+      match smu with
+      | Some smu -> custom_section "sourceMappingURL" string smu true
+      | None -> ()
+
+    (* Name section *)
+
+    let assoc_list : 'a. ('a -> unit) -> (int32 * 'a) list -> unit = fun f xs ->
+      vec (fun (li, x) -> vu32 li; f x)
+          (List.sort (fun (i1,_) (i2,_) -> compare i1 i2) xs)
+
+    let name_section ns =
+      let name_section_body (ns : name_section) =
+        (* module name section *)
+        section 0 (opt string) ns.module_ (ns.module_ <> None);
+        (* function names section *)
+        section 1 (assoc_list string) ns.function_names  (ns.function_names <> []);
+        (* locals names section *)
+        section 2 (assoc_list (assoc_list string)) ns.locals_names  (ns.locals_names <> []) in
+
+      custom_section "name" name_section_body ns
+        (ns.module_ <> None || ns.function_names <> [] || ns.locals_names <> [])
+
+    let icp_custom_section name f opt =
+      match opt with
+      | None -> ()
+      | Some (is_public, x) ->
+        section 0 (fun x ->
+          string ("icp:"^ (if is_public then "public " else "private ") ^ name);
+          f x
+        ) x true
+
+    (* Motoko custom section *)
+
+    let motoko_section_body labels =
+      section 0 (vec string) labels (labels <> [])
+
+    let utf8 bs =
+      ignore (Lib.Utf8.decode bs);  (* assert well-formedness *)
+      put_string s bs
+
+    let motoko_sections motoko =
+      icp_custom_section "motoko:stable-types" utf8 motoko.stable_types;
+      icp_custom_section "motoko:compiler" utf8 motoko.compiler;
+      custom_section "motoko" motoko_section_body motoko.labels (motoko.labels <> []) (* TODO: make an icp_section *)
+
+    let candid_sections candid =
+      icp_custom_section "candid:service" utf8 candid.service;
+      icp_custom_section "candid:args" utf8 candid.args
+
+    let uleb128 n = vu64 (Int64.of_int n)
+    let sleb128 n = vs64 (Int64.of_int n)
+    let close_section () = u8 0x00
+    let write16 = Buffer.add_int16_le s.buf
+    let write32 i = Buffer.add_int32_le s.buf (Int32.of_int i)
+    let zero_terminated str = put_string s str; u8 0
+    let vec_uleb128 el = vec_by uleb128 el
+    let writeBlock1 str = let len = String.length str in assert (len < 256); u8 len; put_string s str
+    let writeBlockLEB str = uleb128 (String.length str); put_string s str
+    let dw_gap32 () = let p = pos s in write32 0x0; p
+    let dw_patch_gap32 p n =
+      let lsb i = Char.chr (i land 0xff) in
+      patch s p (lsb n);
+      patch s (p + 1) (lsb (n lsr 8));
+      patch s (p + 2) (lsb (n lsr 16));
+      patch s (p + 3) (lsb (n lsr 24))
+    let dw_patches = ref (fun i -> i)
+
+    let debug_abbrev_section () =
+      let tag (t, ch, kvs) =
+        uleb128 (t land 0xFFFF); u8 ch;
+        assert (kvs <> []); (* these run risk of dead-code elimination *)
+        List.iter (fun (k, v) -> uleb128 k; uleb128 v) kvs in
+      let abbrev i abs = uleb128 (i + 1); tag abs; close_section (); close_section () in
+      let section_body abs = List.iteri abbrev abs; close_section () in
+      custom_section ".debug_abbrev" section_body Abbreviation.abbreviations true
+
+    (* dw_FORM writers *)
+    let writeForm : int -> die -> unit =
+      let open Dwarf5 in
+      function
+      | f when dw_FORM_strp = f ->
+        begin function
+          | StringAttribute (attr, str) -> write32 (add_dwarf_string str)
+          | _ -> failwith "dw_FORM_strp"
+        end
+      | f when dw_FORM_data1 = f ->
+        begin function
+          | IntAttribute (attr, i) -> u8 i
+          | _ -> failwith "dw_FORM_data1"
+        end
+      | f when dw_FORM_data2 = f ->
+        begin function
+          | IntAttribute (attr, i) -> write16 i
+          | _ -> failwith "dw_FORM_data2"
+        end
+      | f when dw_FORM_data4 = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_data4"
+        end
+      | f when dw_FORM_addr = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_addr"
+        end
+      | f when dw_FORM_addrx = f ->
+        begin function
+          | IntAttribute (attr, i) -> uleb128 i
+          | _ -> failwith "dw_FORM_addrx"
+        end
+      | f when dw_FORM_ref4 = f ->
+        begin function
+          | IntAttribute (attr, i) ->
+            (* See Note [placeholder promises for typedefs] *)
+            let placeholder_promise = References.find i !dw_references in
+            assert (Promise.is_fulfilled placeholder_promise);
+            let forward_ref = Promise.value placeholder_promise in
+            let offset_promise = References.find forward_ref !dw_references in
+            if Promise.is_fulfilled offset_promise
+            then write32 (Promise.value offset_promise)
+            else dw_patches :=
+                   (fun gap ps () ->
+                     ps ();
+                     dw_patch_gap32 gap (Promise.value offset_promise)
+                   ) (dw_gap32 ()) !dw_patches
+          | _ -> failwith "dw_FORM_ref_ref4"
+        end
+      | f when dw_FORM_ref_udata = f ->
+        begin function
+          | IntAttribute (attr, i) ->
+            uleb128 (Promise.value (References.find i !dw_references))
+          | _ -> failwith "dw_FORM_ref_udata"
+        end
+      | f when dw_FORM_sec_offset = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_sec_offset"
+        end
+      | f when dw_FORM_block1 = f ->
+        begin function
+          | StringAttribute (attr, str) -> writeBlock1 str
+          | _ -> failwith "dw_FORM_block1"
+        end
+      | f when dw_FORM_exprloc = f ->
+        begin function
+          | StringAttribute (attr, str) -> writeBlockLEB str
+          | _ -> failwith "dw_FORM_exprloc"
+        end
+      | f when dw_FORM_flag = f ->
+        begin function
+          | IntAttribute (attr, b) -> u8 b
+          | _ -> failwith "dw_FORM_flag"
+        end
+      | f when dw_FORM_flag_present = f ->
+        begin function
+          | IntAttribute (attr, 0) -> failwith "dw_FORM_flag_present with false"
+          | IntAttribute (attr, _) -> ()
+          | _ -> failwith "dw_FORM_flag_present"
+        end
+      | _ -> failwith "cannot write form"
+
+    let info_section_start = ref 0
+
+    let rec writeTag at_toplevel = function
+      | Tag (r, t, contentsRevd) ->
+        begin match r with
+        | Some refi ->
+          Promise.fulfill (References.find refi !dw_references) (pos s - !info_section_start)
+        | None -> assert (t <> Dwarf5.dw_TAG_base_type)
+        end;
+
+        (* we have to be careful to only reference tags already written,
+           so maintain creation order *)
+        let ref_priority a b = match a, b with
+          | Tag (Some m, _, _), Tag (Some n, _, _) -> compare n m
+          | _, Tag (Some _, _, _) -> -1
+          | Tag (Some _, _, _), _ -> 1
+          | _ -> 0 in
+
+        let contents = List.rev (if at_toplevel then List.stable_sort ref_priority contentsRevd else contentsRevd) in
+        let wanted_tag (t', _, _) = t = t' in
+        let (_, has_children, forms) = List.find wanted_tag Abbreviation.abbreviations in
+        let rec pairing (attr, form) = function
+          | Tag _ | TagClose | StatementDelimiter _ | Grouped _ -> failwith "Attribute expected"
+          | FutureAttribute f ->
+            pairing (attr, form) (f ())
+          | StringAttribute (a, path0) when a = Dwarf5.dw_AT_decl_file ->
+            let path = if path0 = "" then "prim" else path0 in
+            if attr <> a then Printf.printf "DATA1 attr: 0x%x = a: 0x%x (in TAG 0x%x) PATH: %s  ULT: (%s, %d)\n" attr a t path    (fst (List.hd !source_path_indices)) (snd (List.hd !source_path_indices));
+            assert (attr = a);
+            writeForm form (IntAttribute (a, List.(snd (hd !source_path_indices) - assoc path !source_path_indices)))
+          | IntAttribute (a, _) as art ->
+            if attr <> a then Printf.printf "attr: 0x%x = a: 0x%x (in TAG 0x%x)\n" attr a t;
+            assert (attr = a);
+            writeForm form art
+          | StringAttribute (a, _) as art -> assert (attr = a); writeForm form art
+          | OffsetAttribute _ -> failwith "too late to resolve OffsetAttribute" in
+        let rec indexOf cnt = function
+          | h :: t when wanted_tag h -> cnt
+          | _ :: t -> indexOf (cnt + 1) t
+          | _ -> failwith "not encountered" in
+        uleb128 (indexOf 1 Abbreviation.abbreviations);
+        let nested_tags, attrs = List.partition (function Tag _ -> true | _ -> false) contents in
+
+        List.iter2 pairing forms attrs;
+        List.iter (writeTag false) nested_tags;
+        if has_children <> 0 then close_section ()
+      | _ -> failwith "Tag expected"
+
+    let unit f =
+      let g = dw_gap32 () in (* unit_length *)
+      let p = pos s in
+      f g; dw_patch_gap32 g (pos s - p)
+
+    let debug_info_section () =
+      let section_body abs =
+        unit(fun info_start ->
+            write16 0x0005; (* version *)
+            u8 Dwarf5.dw_UT_compile; (* unit_type *)
+            u8 4; (* address_size *)
+            write32 0x0000; (* debug_abbrev_offset *)
+            info_section_start := info_start;
+
+            match !dwarf_tags with
+            | [toplevel] -> writeTag true toplevel
+            | _ -> failwith "expected one toplevel tag"
+        );
+        !dw_patches () in
+      let relevant ts = ts <> [Tag (None, 0, [])] in
+      custom_section ".debug_info" section_body dwarf_tags (relevant !dwarf_tags)
+
+    let debug_strings_section dss =
+      let rec debug_strings_section_body = function
+        | [] -> ()
+        | (h, _) :: t -> debug_strings_section_body t; zero_terminated h
+      in
+      custom_section ".debug_str" debug_strings_section_body dss (dss <> [])
+
+
+    let debug_addr_section seqs =
+      let debug_addr_section_body seqs =
+        unit(fun start ->
+            write16 0x0005; (* version *)
+            u8 4; (* addr_size *)
+            u8 0; (* segment_selector_size *)
+            let write_addr (st, _, _) =
+              let rel addr = addr - !code_section_start in
+              write32 (rel st)
+            in
+            DW_Sequence.iter write_addr seqs;
+        )
+      in
+      custom_section ".debug_addr" debug_addr_section_body seqs (not (DW_Sequence.is_empty seqs))
+
+
+    (* 7.28 Range List Table *)
+    let debug_rnglists_section sequence_bounds =
+      let index = ref 0 in
+      let debug_rnglists_section_body () =
+        unit(fun start ->
+            write16 0x0005; (* version *)
+            u8 4; (* address_size *)
+            u8 0; (* segment_selector_size *)
+            write32 0; (* offset_entry_count *)
+
+            Promise.fulfill rangelists (pos s - start);
+            DW_Sequence.iter (fun (st, _, en) ->
+                u8 Dwarf5.dw_RLE_startx_length;
+                uleb128 !index;
+                incr index;
+                uleb128 (en - st))
+              sequence_bounds;
+            u8 Dwarf5.dw_RLE_end_of_list;
+
+            (* extract the subprogram sizes to an array *)
+            Promise.fulfill subprogram_sizes (Array.of_seq (Seq.map (fun (st, _, en) -> en - st) (DW_Sequence.to_seq sequence_bounds)))
+        );
+
+        in
+      custom_section ".debug_rnglists" debug_rnglists_section_body () true
+
+    (* Debug strings for line machine section, used by DWARF5: "6.2.4 The Line Number Program Header" *)
+
+    let debug_line_str_section () =
+      let debug_line_strings_section_body (dirs, sources) =
+        let start = pos s in
+        let rec strings = function
+          | [] -> ()
+          | (h, (p, _)) :: t ->
+            Promise.fulfill p (pos s - start);
+            zero_terminated h;
+            strings t in
+        strings dirs;
+        strings sources in
+      custom_section ".debug_line_str" debug_line_strings_section_body (!dir_names, !source_names) true
+
+    (* Debug line machine section, see DWARF5: "6.2 Line Number Information" *)
+
+    let debug_line_section fs =
+      let debug_line_section_body () =
+
+        unit(fun start ->
+            (* see "6.2.4 The Line Number Program Header" *)
+            write16 0x0005;
+            u8 4;
+            u8 0; (* segment_selector_size *)
+            unit(fun _ ->
+                u8 1; (* min_inst_length *)
+                u8 1; (* max_ops_per_inst *)
+                u8 (if Dwarf5.Machine.default_is_stmt then 1 else 0); (* default_is_stmt *)
+                u8 0; (* line_base *)
+                u8 12; (* line_range *)
+                u8 13; (* opcode_base *)
+                let open List in
+                (* DW_LNS_copy .. DW_LNS_set_isa usage *)
+                iter u8 [0; 1; 1; 1; 1; 0; 0; 0; 1; 0; 0; 1];
+
+                let format (l, f) = uleb128 l; uleb128 f in
+                let vec_format = vec_by u8 format in
+
+                (* directory_entry_format_count, directory_entry_formats *)
+                vec_format Dwarf5.[dw_LNCT_path, dw_FORM_line_strp];
+
+                (* directories_count, directories *)
+                vec_uleb128 write32 (rev_map (fun (_, (p, _)) -> Promise.value p) !dir_names);
+
+                (* file_name_entry_format_count, file_name_entry_formats *)
+                vec_format Dwarf5.[dw_LNCT_path, dw_FORM_line_strp; dw_LNCT_directory_index, dw_FORM_udata];
+
+                (* The first entry in the sequence is the primary source file whose file name exactly
+                   matches that given in the DW_AT_name attribute in the compilation unit debugging
+                   information entry. This is ensured by the heuristics, that the last noted source file
+                   will be placed at position 0 in the table *)
+                vec_uleb128
+                  (fun (pos, indx) -> write32 pos; uleb128 indx)
+                  (map (fun (_, (p, dir_indx)) -> Promise.value p, dir_indx) !source_names);
+            );
+
+            (* build the statement loc -> addr map *)
+            let statement_positions = !statement_positions in
+            let module StmtsAt = Map.Make (struct type t = Wasm.Source.pos let compare = compare end) in
+            let statements_at = StmtsAt.of_seq (Seq.map (fun (k, v) -> v, k) (Instrs.to_seq statement_positions)) in
+            let is_statement_at (addr, loc) =
+              match StmtsAt.find_opt loc statements_at with
+              | Some addr' when addr = addr' -> true
+              | _ -> false in
+
+            (* generate the line section *)
+            let code_start = !code_section_start in
+            let rel addr = addr - code_start in
+            let source_indices = !source_path_indices in
+
+            let mapping epi (addr, {file; line; column} as loc) : Dwarf5.Machine.state =
+              let file' = List.(snd (hd source_indices) - assoc (if file = "" then "prim" else file) source_indices) in
+              let stmt = Instrs.mem loc statement_positions || is_statement_at loc (* FIXME TODO: why ||? *) in
+              let addr' = rel addr in
+              Dwarf5.Machine.{ ip = addr'; loc = { file = file'; line; col = column + 1 }; disc = 0; stmt; bb = false; mode = if addr' = epi then Epilogue else Regular }
+            in
+
+            let joining (prg, state) state' : int list list * Dwarf5.Machine.state =
+              (* to avoid quadratic runtime, just collect (cons up) the partial lists here;
+                 later we'll bring it in the right order and flatten *)
+              Dwarf5.Machine.infer state state' :: prg, state'
+            in
+
+            let sequence (sta, notes, en) =
+              let start, ending = rel sta, rel en in
+              let notes_seq = Instrs.to_seq notes in
+              let open Dwarf5.Machine in
+              (* Decorate first instr, and prepend start address, non-statement (FIXME: clang says it *is* a statement) *)
+              let seq_start_state = { start_state with ip = start; stmt = false } in
+              let states_seq () =
+                let open Seq in
+                match map (mapping (ending - 1)) notes_seq () with
+                | Nil -> failwith "there should be an 'end' instruction!"
+                | Cons ({ip; _}, _) when ip = start -> failwith "at start already an instruction?"
+                | Cons (state, _) as front ->
+                  (* override default location from `start_state` *)
+                  let start_state' = { seq_start_state with loc = state.loc } in
+                  (* FIXME (4.11) use `cons` *)
+                  Cons (start_state', fun () -> front)
+              in
+
+              let prg0, _ = Seq.fold_left joining ([], start_state) states_seq in
+              let prg = List.fold_left (Fun.flip (@)) Dwarf5.[dw_LNS_advance_pc; 1; dw_LNE_end_sequence] prg0 in
+              write_opcodes u8 uleb128 sleb128 write32 prg
+            in
+            DW_Sequence.iter sequence !sequence_bounds
+        )
+      in
+      custom_section ".debug_line" debug_line_section_body () (fs <> [])
+
+
+    (* Module *)
+
+    let module_ (em : extended_module) =
+      let m = em.module_ in
+
+      u32 0x6d736100l;
+      u32 version;
+      (* no use-case for encoding dylink section yet, but here would be the place *)
+      assert (em.dylink = None);
+      type_section m.types;
+      import_section m.imports;
+      func_section m.funcs;
+      table_section m.tables;
+      memory_section m.memories;
+      global_section m.globals;
+      export_section m.exports;
+      start_section m.start;
+      elem_section m.elems;
+      code_section m.funcs;
+      data_section m.data;
+      (* other optional sections *)
+      name_section em.name;
+      candid_sections em.candid;
+      motoko_sections em.motoko;
+      source_mapping_url_section em.source_mapping_url;
+      if !Mo_config.Flags.debug_info then
+        begin
+          debug_abbrev_section ();
+          debug_addr_section !sequence_bounds;
+          debug_rnglists_section !sequence_bounds;
+          debug_line_str_section ();
+          debug_line_section m.funcs;
+          debug_info_section ();
+          debug_strings_section !dwarf_strings
+        end
+  end
+  in E.module_ em;
+
+  let mappings = Buffer.contents map in
+  let n = max 0 ((String.length mappings) - 1) in
+  let json : Yojson.Basic.t = `Assoc [
+    ("version", `Int 3);
+    ("sources", `List ( List.map (fun x -> `String x) !sources ) );
+    ("sourcesContent", `List ( List.map (fun x -> if x = "" then `Null else `String x) !sourcesContent ) );
+    ("mappings", `String (String.sub mappings 0 n) )
+  ] in
+
+  (Yojson.Basic.to_string json, to_string s)
+
+
+
+ + + diff --git a/coverage/wasm-exts/dwarf5.ml.html b/coverage/wasm-exts/dwarf5.ml.html new file mode 100644 index 00000000000..76d13037420 --- /dev/null +++ b/coverage/wasm-exts/dwarf5.ml.html @@ -0,0 +1,2104 @@ + + + + + dwarf5.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+
+
(* DWARF 5 constants *)
+
+let dw_CHILDREN_no = 0x00
+let dw_CHILDREN_yes = 0x01
+
+let dw_TAG_array_type = 0x01
+let dw_TAG_class_type = 0x02
+let dw_TAG_entry_point = 0x03
+let dw_TAG_enumeration_type = 0x04
+let dw_TAG_formal_parameter = 0x05
+(* let Reserved = 0x06 *)
+(* let Reserved = 0x07 *)
+let dw_TAG_imported_declaration = 0x08
+(* let Reserved = 0x09 *)
+let dw_TAG_label = 0x0a
+let dw_TAG_lexical_block = 0x0b
+(* let Reserved = 0x0c *)
+let dw_TAG_member = 0x0d
+(* let Reserved = 0x0e *)
+let dw_TAG_pointer_type = 0x0f
+let dw_TAG_reference_type = 0x10
+let dw_TAG_compile_unit = 0x11
+let dw_TAG_string_type = 0x12
+let dw_TAG_structure_type = 0x13
+(* let Reserved = 0x14 *)
+let dw_TAG_subroutine_type = 0x15
+let dw_TAG_typedef = 0x16
+let dw_TAG_union_type = 0x17
+let dw_TAG_unspecified_parameters = 0x18
+let dw_TAG_variant = 0x19
+let dw_TAG_common_block = 0x1a
+let dw_TAG_common_inclusion = 0x1b
+let dw_TAG_inheritance = 0x1c
+let dw_TAG_inlined_subroutine = 0x1d
+let dw_TAG_module = 0x1e
+let dw_TAG_ptr_to_member_type = 0x1f
+let dw_TAG_set_type = 0x20
+let dw_TAG_subrange_type = 0x21
+let dw_TAG_with_stmt = 0x22
+let dw_TAG_access_declaration = 0x23
+let dw_TAG_base_type = 0x24
+let dw_TAG_catch_block = 0x25
+let dw_TAG_const_type = 0x26
+let dw_TAG_constant = 0x27
+let dw_TAG_enumerator = 0x28
+let dw_TAG_file_type = 0x29
+let dw_TAG_friend = 0x2a
+let dw_TAG_namelist = 0x2b
+let dw_TAG_namelist_item = 0x2c
+let dw_TAG_packed_type = 0x2d
+let dw_TAG_subprogram = 0x2e
+let dw_TAG_template_type_parameter = 0x2f
+let dw_TAG_template_value_parameter = 0x30
+let dw_TAG_thrown_type = 0x31
+let dw_TAG_try_block = 0x32
+let dw_TAG_variant_part = 0x33
+let dw_TAG_variable = 0x34
+let dw_TAG_volatile_type = 0x35
+let dw_TAG_dwarf_procedure = 0x36
+let dw_TAG_restrict_type = 0x37
+let dw_TAG_interface_type = 0x38
+let dw_TAG_namespace = 0x39
+let dw_TAG_imported_module = 0x3a
+let dw_TAG_unspecified_type = 0x3b
+let dw_TAG_partial_unit = 0x3c
+let dw_TAG_imported_unit = 0x3d
+(* let Reserved = 0x3e *)
+let dw_TAG_condition = 0x3f
+let dw_TAG_shared_type = 0x40
+let dw_TAG_type_unit = 0x41
+let dw_TAG_rvalue_reference_type = 0x42
+let dw_TAG_template_alias = 0x43
+let dw_TAG_coarray_type = 0x44
+let dw_TAG_generic_subrange = 0x45
+let dw_TAG_dynamic_type = 0x46
+let dw_TAG_atomic_type = 0x47
+let dw_TAG_call_site = 0x48
+let dw_TAG_call_site_parameter = 0x49
+let dw_TAG_skeleton_unit = 0x4a
+let dw_TAG_immutable_type = 0x4b
+let dw_TAG_lo_user = 0x4080
+let dw_TAG_hi_user = 0xffff
+
+
+let dw_AT_sibling = 0x01
+let dw_AT_location = 0x02
+let dw_AT_name = 0x03
+(* let Reserved = 0x04 *)
+(* let Reserved = 0x05 *)
+(* let Reserved = 0x06 *)
+(* let Reserved = 0x07 *)
+(* let Reserved = 0x08 *)
+let dw_AT_ordering = 0x09
+(* let Reserved = 0x0a *)
+let dw_AT_byte_size = 0x0b
+(* let Reserved = 0x0c *)
+let dw_AT_bit_size = 0x0d
+(* let Reserved = 0x0e *)
+(* let Reserved = 0x0f *)
+let dw_AT_stmt_list = 0x10
+let dw_AT_low_pc = 0x11
+let dw_AT_high_pc = 0x12
+let dw_AT_language = 0x13
+(* let Reserved = 0x14 *)
+let dw_AT_discr = 0x15
+let dw_AT_discr_value = 0x16
+let dw_AT_visibility = 0x17
+let dw_AT_import = 0x18
+let dw_AT_string_length = 0x19
+let dw_AT_common_reference = 0x1a
+let dw_AT_comp_dir = 0x1b
+let dw_AT_const_value = 0x1c
+let dw_AT_containing_type = 0x1d
+let dw_AT_default_value = 0x1e
+(* let Reserved = 0x1f *)
+let dw_AT_inline = 0x20
+let dw_AT_is_optional = 0x21
+let dw_AT_lower_bound = 0x22
+(* let Reserved = 0x23 *)
+(* let Reserved = 0x24 *)
+let dw_AT_producer = 0x25
+(* let Reserved = 0x26 *)
+let dw_AT_prototyped = 0x27
+(* let Reserved = 0x28 *)
+(* let Reserved = 0x29 *)
+let dw_AT_return_addr = 0x2a
+(* let Reserved = 0x2b *)
+let dw_AT_start_scope = 0x2c
+(* let Reserved = 0x2d *)
+let dw_AT_bit_stride = 0x2e
+let dw_AT_upper_bound = 0x2f
+(* let Reserved = 0x30 *)
+let dw_AT_abstract_origin = 0x31
+let dw_AT_accessibility = 0x32
+let dw_AT_address_class = 0x33
+let dw_AT_artificial = 0x34
+let dw_AT_base_types = 0x35
+let dw_AT_calling_convention = 0x36
+let dw_AT_count = 0x37
+let dw_AT_data_member_location = 0x38
+let dw_AT_decl_column = 0x39
+let dw_AT_decl_file = 0x3a
+let dw_AT_decl_line = 0x3b
+let dw_AT_declaration = 0x3c
+let dw_AT_discr_list = 0x3d
+let dw_AT_encoding = 0x3e
+let dw_AT_external = 0x3f
+let dw_AT_frame_base = 0x40
+let dw_AT_friend = 0x41
+let dw_AT_identifier_case = 0x42
+(* let Reserved = 0x43 *)
+let dw_AT_namelist_item = 0x44
+let dw_AT_priority = 0x45
+let dw_AT_segment = 0x46
+let dw_AT_specification = 0x47
+let dw_AT_static_link = 0x48
+let dw_AT_type = 0x49
+let dw_AT_use_location = 0x4a
+let dw_AT_variable_parameter = 0x4b
+let dw_AT_virtuality = 0x4c
+let dw_AT_vtable_elem_location = 0x4d
+let dw_AT_allocated = 0x4e
+let dw_AT_associated = 0x4f
+let dw_AT_data_location = 0x50
+let dw_AT_byte_stride = 0x51
+let dw_AT_entry_pc = 0x52
+let dw_AT_use_UTF8 = 0x53
+let dw_AT_extension = 0x54
+let dw_AT_ranges = 0x55
+let dw_AT_trampoline = 0x56
+let dw_AT_call_column = 0x57
+let dw_AT_call_file = 0x58
+let dw_AT_call_line = 0x59
+let dw_AT_description = 0x5a
+let dw_AT_binary_scale = 0x5b
+let dw_AT_decimal_scale = 0x5c
+let dw_AT_small = 0x5d
+let dw_AT_decimal_sign = 0x5e
+let dw_AT_digit_count = 0x5f
+let dw_AT_picture_string = 0x60
+let dw_AT_mutable = 0x61
+let dw_AT_threads_scaled = 0x62
+let dw_AT_explicit = 0x63
+let dw_AT_object_pointer = 0x64
+let dw_AT_endianity = 0x65
+let dw_AT_elemental = 0x66
+let dw_AT_pure = 0x67
+let dw_AT_recursive = 0x68
+let dw_AT_signature = 0x69
+let dw_AT_main_subprogram = 0x6a
+let dw_AT_data_bit_offset = 0x6b
+let dw_AT_const_expr = 0x6c
+let dw_AT_enum_class = 0x6d
+let dw_AT_linkage_name = 0x6e
+let dw_AT_string_length_bit_size = 0x6f
+let dw_AT_string_length_byte_size = 0x70
+let dw_AT_rank = 0x71
+let dw_AT_str_offsets_base = 0x72
+let dw_AT_addr_base = 0x73
+let dw_AT_rnglists_base = 0x74
+(* let Reserved = 0x75 *)
+let dw_AT_dwo_name = 0x76
+let dw_AT_reference = 0x77
+let dw_AT_rvalue_reference = 0x78
+let dw_AT_macros = 0x79
+let dw_AT_call_all_calls = 0x7a
+let dw_AT_call_all_source_calls = 0x7b
+let dw_AT_call_all_tail_calls = 0x7c
+let dw_AT_call_return_pc = 0x7d
+let dw_AT_call_value = 0x7e
+let dw_AT_call_origin = 0x7f
+let dw_AT_call_parameter = 0x80
+let dw_AT_call_pc = 0x81
+let dw_AT_call_tail_call = 0x82
+let dw_AT_call_target = 0x83
+let dw_AT_call_target_clobbered = 0x84
+let dw_AT_call_data_location = 0x85
+let dw_AT_call_data_value = 0x86
+let dw_AT_noreturn = 0x87
+let dw_AT_alignment = 0x88
+let dw_AT_export_symbols = 0x89
+let dw_AT_deleted = 0x8a
+let dw_AT_defaulted = 0x8b
+let dw_AT_loclists_base = 0x8c
+let dw_AT_lo_user = 0x2000
+let dw_AT_hi_user = 0x3fff
+
+let dw_ATE_address = 0x01
+let dw_ATE_boolean = 0x02
+let dw_ATE_complex_float = 0x03
+let dw_ATE_float = 0x04
+let dw_ATE_signed = 0x05
+let dw_ATE_signed_char = 0x06
+let dw_ATE_unsigned = 0x07
+let dw_ATE_unsigned_char = 0x08
+let dw_ATE_imaginary_float = 0x09
+let dw_ATE_packed_decimal = 0x0a
+let dw_ATE_numeric_string = 0x0b
+let dw_ATE_edited = 0x0c
+let dw_ATE_signed_fixed = 0x0d
+let dw_ATE_unsigned_fixed = 0x0e
+let dw_ATE_decimal_float = 0x0f
+let dw_ATE_UTF = 0x10
+let dw_ATE_UCS = 0x11
+let dw_ATE_ASCII = 0x12
+let dw_ATE_lo_user = 0x80
+let dw_ATE_hi_user = 0xff
+
+let dw_DS_unsigned = 0x01
+let dw_DS_leading_overpunch = 0x02
+let dw_DS_trailing_overpunch = 0x03
+let dw_DS_leading_separate = 0x04
+let dw_DS_trailing_separate = 0x05
+
+let dw_END_default = 0x00
+let dw_END_big = 0x01
+let dw_END_little = 0x02
+let dw_END_lo_user = 0x40
+let dw_END_hi_user = 0xff
+  
+let dw_FORM_addr = 0x01
+(* Reserved = 0x02 *)
+let dw_FORM_block2 = 0x03
+let dw_FORM_block4 = 0x04
+let dw_FORM_data2 = 0x05
+let dw_FORM_data4 = 0x06
+let dw_FORM_data8 = 0x07
+let dw_FORM_string = 0x08
+let dw_FORM_block = 0x09
+let dw_FORM_block1 = 0x0a
+let dw_FORM_data1 = 0x0b
+let dw_FORM_flag = 0x0c
+let dw_FORM_sdata = 0x0d
+let dw_FORM_strp = 0x0e
+let dw_FORM_udata = 0x0f
+let dw_FORM_ref_addr = 0x10
+let dw_FORM_ref1 = 0x11
+let dw_FORM_ref2 = 0x12
+let dw_FORM_ref4 = 0x13
+let dw_FORM_ref8 = 0x14
+let dw_FORM_ref_udata = 0x15
+let dw_FORM_indirect = 0x16
+let dw_FORM_sec_offset = 0x17
+let dw_FORM_exprloc = 0x18
+let dw_FORM_flag_present = 0x19
+let dw_FORM_strx = 0x1a
+let dw_FORM_addrx = 0x1b
+let dw_FORM_ref_sup4 = 0x1c
+let dw_FORM_strp_sup = 0x1d
+let dw_FORM_data16 = 0x1e
+let dw_FORM_line_strp = 0x1f
+let dw_FORM_ref_sig8 = 0x20
+let dw_FORM_implicit_const = 0x21
+let dw_FORM_loclistx = 0x22
+let dw_FORM_rnglistx = 0x23
+let dw_FORM_ref_sup8 = 0x24
+let dw_FORM_strx1 = 0x25
+let dw_FORM_strx2 = 0x26
+let dw_FORM_strx3 = 0x27
+let dw_FORM_strx4 = 0x28
+let dw_FORM_addrx1 = 0x29
+let dw_FORM_addrx2 = 0x2a
+let dw_FORM_addrx3 = 0x2b
+let dw_FORM_addrx4 = 0x2c
+
+(* FIXME: we cheat for now *)
+let dw_LANG_C99 = 0x000c
+let dw_LANG_Swift = 0x001e
+let dw_LANG_Motoko = 0x0027
+
+
+let dw_UT_compile = 0x01
+let dw_UT_type = 0x02
+let dw_UT_partial = 0x03
+let dw_UT_skeleton = 0x04
+let dw_UT_split_compile = 0x05
+let dw_UT_split_type = 0x06
+let dw_UT_lo_user = 0x80
+let dw_UT_hi_user = 0xff
+
+let dw_RLE_end_of_list = 0x00
+let dw_RLE_base_addressx = 0x01
+let dw_RLE_startx_endx = 0x02
+let dw_RLE_startx_length = 0x03
+let dw_RLE_offset_pair = 0x04
+let dw_RLE_base_address = 0x05
+let dw_RLE_start_end = 0x06
+let dw_RLE_start_length = 0x07
+
+(* Line number header entry format name *)
+let dw_LNCT_path = 0x1
+let dw_LNCT_directory_index = 0x2
+let dw_LNCT_timestamp = 0x3
+let dw_LNCT_size = 0x4
+let dw_LNCT_MD5 = 0x5
+let dw_LNCT_lo_user = 0x2000
+let dw_LNCT_hi_user = 0x3fff
+
+(* Line number standard opcode encodings *)
+let dw_LNS_copy = 0x01
+let dw_LNS_advance_pc = 0x02
+let dw_LNS_advance_line = 0x03
+let dw_LNS_set_file = 0x04
+let dw_LNS_set_column = 0x05
+let dw_LNS_negate_stmt = 0x06
+let dw_LNS_set_basic_block = 0x07
+let dw_LNS_const_add_pc = 0x08
+let dw_LNS_fixed_advance_pc = 0x09
+let dw_LNS_set_prologue_end = 0x0a
+let dw_LNS_set_epilogue_begin = 0x0b
+let dw_LNS_set_isa = 0x0c
+
+(* Line number extended opcode encodings
+   Note: these are negative, so they don't overlap
+         with the `dw_LNS_*` above
+ *)
+let dw_LNE_end_sequence = -0x01
+let dw_LNE_set_address = -0x02
+(* let Reserved 0x03 *)
+let dw_LNE_set_discriminator = -0x04
+let dw_LNE_lo_user = 0x80
+let dw_LNE_hi_user = 0xff
+
+(* DWARF expression opcode encodings *)
+let dw_OP_addr = 0x03
+let dw_OP_deref = 0x06
+let dw_OP_const1u = 0x08
+let dw_OP_const1s = 0x09
+let dw_OP_const2u = 0x0a
+let dw_OP_const2s = 0x0b
+let dw_OP_const4u = 0x0c
+let dw_OP_const4s = 0x0d
+let dw_OP_const8u = 0x0e
+let dw_OP_const8s = 0x0f
+let dw_OP_constu = 0x10
+let dw_OP_consts = 0x11
+let dw_OP_dup = 0x12
+let dw_OP_drop = 0x13
+let dw_OP_over = 0x14
+let dw_OP_pick = 0x15
+let dw_OP_swap = 0x16
+let dw_OP_rot = 0x17
+let dw_OP_xderef = 0x18
+let dw_OP_abs = 0x19
+let dw_OP_and = 0x1a
+let dw_OP_div = 0x1b
+let dw_OP_minus = 0x1c
+let dw_OP_mod = 0x1d
+let dw_OP_mul = 0x1e
+let dw_OP_neg = 0x1f
+let dw_OP_not = 0x20
+let dw_OP_or = 0x21
+let dw_OP_plus = 0x22
+let dw_OP_plus_uconst = 0x23
+let dw_OP_shl = 0x24
+let dw_OP_shr = 0x25
+let dw_OP_shra = 0x26
+let dw_OP_xor = 0x27
+let dw_OP_skip = 0x2f
+let dw_OP_bra = 0x28
+let dw_OP_eq = 0x29
+let dw_OP_ge = 0x2a
+let dw_OP_gt = 0x2b
+let dw_OP_le = 0x2c
+let dw_OP_lt = 0x2d
+let dw_OP_ne = 0x2e
+let dw_OP_lit0 = 0x30
+let dw_OP_lit1 = 0x31
+let dw_OP_lit2 = 0x32
+let dw_OP_lit3 = 0x33
+let dw_OP_lit4 = 0x34
+let dw_OP_lit5 = 0x35
+let dw_OP_lit6 = 0x36
+let dw_OP_lit7 = 0x37
+let dw_OP_lit8 = 0x38
+let dw_OP_lit9 = 0x39
+let dw_OP_lit10 = 0x3a
+let dw_OP_lit11 = 0x3b
+let dw_OP_lit12 = 0x3c
+let dw_OP_lit13 = 0x3d
+let dw_OP_lit14 = 0x3e
+let dw_OP_lit15 = 0x3f
+let dw_OP_lit16 = 0x40
+let dw_OP_lit17 = 0x41
+let dw_OP_lit18 = 0x42
+let dw_OP_lit19 = 0x43
+let dw_OP_lit20 = 0x44
+let dw_OP_lit21 = 0x45
+let dw_OP_lit22 = 0x46
+let dw_OP_lit23 = 0x47
+let dw_OP_lit24 = 0x48
+let dw_OP_lit25 = 0x49
+let dw_OP_lit26 = 0x4a
+let dw_OP_lit27 = 0x4b
+let dw_OP_lit28 = 0x4c
+let dw_OP_lit29 = 0x4d
+let dw_OP_lit30 = 0x4e
+let dw_OP_lit31 = 0x4f
+let dw_OP_reg0 = 0x50
+let dw_OP_reg1 = 0x51
+let dw_OP_reg2 = 0x52
+let dw_OP_reg3 = 0x53
+let dw_OP_reg4 = 0x54
+let dw_OP_reg5 = 0x55
+let dw_OP_reg6 = 0x56
+let dw_OP_reg7 = 0x57
+let dw_OP_reg8 = 0x58
+let dw_OP_reg9 = 0x59
+let dw_OP_reg10 = 0x5a
+let dw_OP_reg11 = 0x5b
+let dw_OP_reg12 = 0x5c
+let dw_OP_reg13 = 0x5d
+let dw_OP_reg14 = 0x5e
+let dw_OP_reg15 = 0x5f
+let dw_OP_reg16 = 0x60
+let dw_OP_reg17 = 0x61
+let dw_OP_reg18 = 0x62
+let dw_OP_reg19 = 0x63
+let dw_OP_reg20 = 0x64
+let dw_OP_reg21 = 0x65
+let dw_OP_reg22 = 0x66
+let dw_OP_reg23 = 0x67
+let dw_OP_reg24 = 0x68
+let dw_OP_reg25 = 0x69
+let dw_OP_reg26 = 0x6a
+let dw_OP_reg27 = 0x6b
+let dw_OP_reg28 = 0x6c
+let dw_OP_reg29 = 0x6d
+let dw_OP_reg30 = 0x6e
+let dw_OP_reg31 = 0x6f
+let dw_OP_breg0 = 0x70
+let dw_OP_breg1 = 0x71
+let dw_OP_breg2 = 0x72
+let dw_OP_breg3 = 0x73
+let dw_OP_breg4 = 0x74
+let dw_OP_breg5 = 0x75
+let dw_OP_breg6 = 0x76
+let dw_OP_breg7 = 0x77
+let dw_OP_breg8 = 0x78
+let dw_OP_breg9 = 0x79
+let dw_OP_breg10 = 0x7a
+let dw_OP_breg11 = 0x7b
+let dw_OP_breg12 = 0x7c
+let dw_OP_breg13 = 0x7d
+let dw_OP_breg14 = 0x7e
+let dw_OP_breg15 = 0x7f
+let dw_OP_breg16 = 0x80
+let dw_OP_breg17 = 0x81
+let dw_OP_breg18 = 0x82
+let dw_OP_breg19 = 0x83
+let dw_OP_breg20 = 0x84
+let dw_OP_breg21 = 0x85
+let dw_OP_breg22 = 0x86
+let dw_OP_breg23 = 0x87
+let dw_OP_breg24 = 0x88
+let dw_OP_breg25 = 0x89
+let dw_OP_breg26 = 0x8a
+let dw_OP_breg27 = 0x8b
+let dw_OP_breg28 = 0x8c
+let dw_OP_breg29 = 0x8d
+let dw_OP_breg30 = 0x8e
+let dw_OP_breg31 = 0x8f
+let dw_OP_regx = 0x90
+let dw_OP_fbreg = 0x91
+let dw_OP_bregx = 0x92
+let dw_OP_piece = 0x93
+let dw_OP_deref_size = 0x94
+let dw_OP_xderef_size = 0x95
+let dw_OP_nop = 0x96
+let dw_OP_push_object_address = 0x97
+let dw_OP_call2 = 0x98
+let dw_OP_call4 = 0x99
+let dw_OP_call_ref = 0x9a
+let dw_OP_form_tls_address = 0x9b
+let dw_OP_call_frame_cfa = 0x9c
+let dw_OP_bit_piece = 0x9d
+let dw_OP_implicit_value = 0x9e
+let dw_OP_stack_value = 0x9f
+let dw_OP_implicit_pointer = 0xa0
+let dw_OP_addrx = 0xa1
+let dw_OP_constx = 0xa2
+let dw_OP_entry_value = 0xa3
+let dw_OP_const_type = 0xa4
+let dw_OP_regval_type = 0xa5
+let dw_OP_deref_type = 0xa6
+let dw_OP_xderef_type = 0xa7
+let dw_OP_convert = 0xa8
+let dw_OP_reinterpret = 0xa9
+
+let dw_OP_lo_user = 0xe0
+let dw_OP_hi_user = 0xff
+
+let dw_OP_WASM_location = 0xed (* see module Location, below *)
+
+module Machine =
+struct
+
+(* Assumptions:
+- op_index = 0 (const)
+- maximum_operations_per_instruction = 1 (non-VLIW)
+- minimum_instruction_length = 1 (bytecode)
+ *)
+
+let default_is_stmt = true
+let line_base = 0
+let line_range = 7
+let opcode_base = dw_LNS_set_isa
+
+type instr_mode = Regular | Prologue | Epilogue
+type loc = { file : int; line : int; col : int }
+
+type state = { ip : int
+             ; loc : loc
+             ; disc : int
+             ; stmt : bool
+             ; bb : bool
+             ; mode : instr_mode }
+
+(*
+Legend:
+-------
+ip: instruction pointer (Wasm bytecode offset in CODE section)
+loc: source location, file encoded as an index
+disc(riminator): instance of inlined code fragment (not relevant yet)
+--flags actionable (by debugger) bits of information (regarding stopping)
+stmt: statement
+bb: basic block
+mode: how the instruction should be treated
+
+See "6.2 Line Number Information" for details.
+*)
+let default_loc = { file = 1; line = 1; col = 0 }
+let default_flags = default_is_stmt, false, Prologue
+(* Table 6.4: Line number program initial state *)
+let start_state = { ip = 0; loc = default_loc; disc = 0; stmt = default_is_stmt; bb = false; mode = Prologue }
+
+
+(* Infers a list of opcodes for the line number program
+   ("6.2.5 The Line Number Program") that, when run, would
+   transition the machine from a certain intermediate state
+   to a following state. This is intended to be used in a loop
+   (fold) to obtain all the opcodes for a list of states.
+*)
+let rec infer from toward = match from, toward with
+  | f, {ip; _} when ip < f.ip -> failwith "can't go backwards"
+  | {ip=0; _}, t when t.ip > 0 ->
+    dw_LNE_set_address :: t.ip :: infer {from with ip = t.ip} t
+  | {ip; _}, t when t.ip > ip ->
+    dw_LNS_advance_pc :: t.ip - ip :: infer {from with ip = t.ip} t
+  | {loc; _}, {loc = {file; _}; _} when file <> loc.file ->
+    dw_LNS_set_file :: file :: infer {from with loc = {loc with file}} toward
+  | {loc; _}, {loc = {line; _}; _} when line <> loc.line ->
+    dw_LNS_advance_line :: line - loc.line :: infer {from with loc = {loc with line}} toward
+  | {loc; _}, {loc = {col; _}; _} when col <> loc.col ->
+    dw_LNS_set_column :: col :: infer {from with loc = {loc with col}} toward
+  | {disc; _}, _ when disc <> toward.disc -> failwith "cannot do disc yet"
+  | {stmt; _}, _ when stmt <> toward.stmt ->
+    dw_LNS_negate_stmt :: infer {from with stmt = toward.stmt} toward
+  | {bb; _}, _ when bb <> toward.bb -> failwith "cannot do bb yet"
+  | {mode = Prologue; _}, {mode = Regular; _} ->
+    dw_LNS_set_prologue_end :: infer toward toward
+  | {mode = Regular; _}, {mode = Epilogue; _} ->
+    dw_LNS_set_epilogue_begin :: infer toward toward
+  | {mode = Prologue; _}, {mode = Epilogue; _} ->
+    dw_LNS_set_prologue_end :: dw_LNS_set_epilogue_begin :: infer toward toward
+  | state, state' when state = state' -> [dw_LNS_copy]
+  | _ -> failwith "not covered"
+
+(* Given a few formatted outputter functions, dump the contents
+   of a line program (essentially a list of `DW_LNS/E_*` opcodes with
+   arguments). The bottleneck functions are expected to close over
+   the output buffer/stream.
+*)
+let write_opcodes u8 uleb sleb u32 : int list -> unit =
+  let standard lns = u8 lns in
+  let extended1 lne = u8 0; u8 1; u8 (- lne) in
+  let extended5 lne = u8 0; u8 5; u8 (- lne) in
+  let rec chase = function
+  | [] -> ()
+  | op :: tail when dw_LNS_copy = op -> standard op; chase tail
+  | op :: offs :: tail when dw_LNS_advance_pc = op -> standard op; uleb offs; chase tail
+  | op :: delta :: tail when dw_LNS_advance_line = op -> standard op; sleb delta; chase tail
+  | op :: file :: tail when dw_LNS_set_file = op -> standard op; uleb file; chase tail
+  | op :: col :: tail when dw_LNS_set_column = op -> standard op; uleb col; chase tail
+  | op :: tail when dw_LNS_negate_stmt = op -> standard op; chase tail
+  | op :: tail when dw_LNS_set_prologue_end = op -> standard op; chase tail
+  | op :: tail when dw_LNS_set_epilogue_begin = op -> standard op; chase tail
+  | op :: tail when dw_LNE_end_sequence = op -> extended1 op; chase tail
+  | op :: addr :: tail when dw_LNE_set_address = op -> extended5 op; u32 addr; chase tail
+  | op :: _ -> failwith (Printf.sprintf "opcode not covered: %d" op)
+  in chase
+
+end
+
+module Location =
+struct
+(* Wasm extensions for DWARF expressions are currently defined
+
+in https://yurydelendik.github.io/webassembly-dwarf/#DWARF-expressions-and-location-descriptions
+
+DW_OP_WASM_location := 0xED ;; available DWARF extension code
+
+wasm-op := wasm-local | wasm-global | wasm-operand-stack
+
+wasm-local := 0x00 i:uleb128
+wasm-global := 0x01 i:uleb128
+wasm-operand-stack := 0x02
+*)
+
+(* Difference-lists-based builder for location programs
+   ("2.5 DWARF Expressions") consisting from `DW_OP_*` opcodes
+   and their arguments. Since the final output is bytecode
+   (i.e. list of 0..255), we use the convention that negative
+   integers (`-i`) in the list externalise as ULEB128-encoded
+   bytes  of `i`.
+*)
+
+let local slot (rest : int list) : int list =
+  dw_OP_WASM_location :: 0x00 :: -slot :: rest
+
+(* below two expressions are not supported yet *)
+
+let global slot rest =
+  dw_OP_WASM_location :: 0x01 :: -slot :: rest
+
+let operand_stack slot rest =
+  dw_OP_WASM_location :: 0x02 :: -slot :: rest
+
+end
+
+
+module Meta =
+struct
+
+type die
+  = StatementDelimiter of Wasm.Source.pos
+  | Tag of int option * int * die list
+  | TagClose
+  | OffsetAttribute of int
+  | IntAttribute of int * int
+  | StringAttribute of int * string
+  (* below is after peephole optimisation only, snoc-like *)
+  | Grouped of die list
+  (* below is encoding-time only *)
+  | FutureAttribute of (unit -> die)
+
+end
+
+
+
+ + + diff --git a/coverage/wasm-exts/operators.ml.html b/coverage/wasm-exts/operators.ml.html new file mode 100644 index 00000000000..19721ac0633 --- /dev/null +++ b/coverage/wasm-exts/operators.ml.html @@ -0,0 +1,737 @@ + + + + + operators.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+
+
(*
+This module originated as a copy of interpreter/syntax/operators.ml in the
+reference implementation. It is pulled in by the strong cohesion between
+the operators and the AST. Not having this source file locally would mean
+that it got basically replicated into the customModuleDecode.ml file.
+
+Base revision: WebAssembly/spec@a7a1856.
+
+The changes are:
+ * None for now
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+*)
+
+open Wasm.Source
+open Wasm.Types
+open Wasm.Values
+open Ast
+
+
+let i32_const n = Const (I32 n.it @@ n.at)
+let i64_const n = Const (I64 n.it @@ n.at)
+let f32_const n = Const (F32 n.it @@ n.at)
+let f64_const n = Const (F64 n.it @@ n.at)
+
+let unreachable = Unreachable
+let nop = Nop
+let drop = Drop
+let select = Select
+let block bt es = Block (bt, es)
+let loop bt es = Loop (bt, es)
+let if_ bt es1 es2 = If (bt, es1, es2)
+let br x = Br x
+let br_if x = BrIf x
+let br_table xs x = BrTable (xs, x)
+
+let return = Return
+let call x = Call x
+let call_indirect x = CallIndirect x
+
+let local_get x = LocalGet x
+let local_set x = LocalSet x
+let local_tee x = LocalTee x
+let global_get x = GlobalGet x
+let global_set x = GlobalSet x
+
+let i32_load align offset = Load {ty = I32Type; align; offset; sz = None}
+let i64_load align offset = Load {ty = I64Type; align; offset; sz = None}
+let f32_load align offset = Load {ty = F32Type; align; offset; sz = None}
+let f64_load align offset = Load {ty = F64Type; align; offset; sz = None}
+let i32_load8_s align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack8, SX)}
+let i32_load8_u align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack8, ZX)}
+let i32_load16_s align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack16, SX)}
+let i32_load16_u align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack16, ZX)}
+let i64_load8_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack8, SX)}
+let i64_load8_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack8, ZX)}
+let i64_load16_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack16, SX)}
+let i64_load16_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack16, ZX)}
+let i64_load32_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack32, SX)}
+let i64_load32_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack32, ZX)}
+
+let i32_store align offset = Store {ty = I32Type; align; offset; sz = None}
+let i64_store align offset = Store {ty = I64Type; align; offset; sz = None}
+let f32_store align offset = Store {ty = F32Type; align; offset; sz = None}
+let f64_store align offset = Store {ty = F64Type; align; offset; sz = None}
+let i32_store8 align offset =
+  Store {ty = I32Type; align; offset; sz = Some Pack8}
+let i32_store16 align offset =
+  Store {ty = I32Type; align; offset; sz = Some Pack16}
+let i64_store8 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack8}
+let i64_store16 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack16}
+let i64_store32 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack32}
+
+let i32_clz = Unary (I32 I32Op.Clz)
+let i32_ctz = Unary (I32 I32Op.Ctz)
+let i32_popcnt = Unary (I32 I32Op.Popcnt)
+let i64_clz = Unary (I64 I64Op.Clz)
+let i64_ctz = Unary (I64 I64Op.Ctz)
+let i64_popcnt = Unary (I64 I64Op.Popcnt)
+let f32_neg = Unary (F32 F32Op.Neg)
+let f32_abs = Unary (F32 F32Op.Abs)
+let f32_sqrt = Unary (F32 F32Op.Sqrt)
+let f32_ceil = Unary (F32 F32Op.Ceil)
+let f32_floor = Unary (F32 F32Op.Floor)
+let f32_trunc = Unary (F32 F32Op.Trunc)
+let f32_nearest = Unary (F32 F32Op.Nearest)
+let f64_neg = Unary (F64 F64Op.Neg)
+let f64_abs = Unary (F64 F64Op.Abs)
+let f64_sqrt = Unary (F64 F64Op.Sqrt)
+let f64_ceil = Unary (F64 F64Op.Ceil)
+let f64_floor = Unary (F64 F64Op.Floor)
+let f64_trunc = Unary (F64 F64Op.Trunc)
+let f64_nearest = Unary (F64 F64Op.Nearest)
+
+let i32_add = Binary (I32 I32Op.Add)
+let i32_sub = Binary (I32 I32Op.Sub)
+let i32_mul = Binary (I32 I32Op.Mul)
+let i32_div_s = Binary (I32 I32Op.DivS)
+let i32_div_u = Binary (I32 I32Op.DivU)
+let i32_rem_s = Binary (I32 I32Op.RemS)
+let i32_rem_u = Binary (I32 I32Op.RemU)
+let i32_and = Binary (I32 I32Op.And)
+let i32_or = Binary (I32 I32Op.Or)
+let i32_xor = Binary (I32 I32Op.Xor)
+let i32_shl = Binary (I32 I32Op.Shl)
+let i32_shr_s = Binary (I32 I32Op.ShrS)
+let i32_shr_u = Binary (I32 I32Op.ShrU)
+let i32_rotl = Binary (I32 I32Op.Rotl)
+let i32_rotr = Binary (I32 I32Op.Rotr)
+let i64_add = Binary (I64 I64Op.Add)
+let i64_sub = Binary (I64 I64Op.Sub)
+let i64_mul = Binary (I64 I64Op.Mul)
+let i64_div_s = Binary (I64 I64Op.DivS)
+let i64_div_u = Binary (I64 I64Op.DivU)
+let i64_rem_s = Binary (I64 I64Op.RemS)
+let i64_rem_u = Binary (I64 I64Op.RemU)
+let i64_and = Binary (I64 I64Op.And)
+let i64_or = Binary (I64 I64Op.Or)
+let i64_xor = Binary (I64 I64Op.Xor)
+let i64_shl = Binary (I64 I64Op.Shl)
+let i64_shr_s = Binary (I64 I64Op.ShrS)
+let i64_shr_u = Binary (I64 I64Op.ShrU)
+let i64_rotl = Binary (I64 I64Op.Rotl)
+let i64_rotr = Binary (I64 I64Op.Rotr)
+let f32_add = Binary (F32 F32Op.Add)
+let f32_sub = Binary (F32 F32Op.Sub)
+let f32_mul = Binary (F32 F32Op.Mul)
+let f32_div = Binary (F32 F32Op.Div)
+let f32_min = Binary (F32 F32Op.Min)
+let f32_max = Binary (F32 F32Op.Max)
+let f32_copysign = Binary (F32 F32Op.CopySign)
+let f64_add = Binary (F64 F64Op.Add)
+let f64_sub = Binary (F64 F64Op.Sub)
+let f64_mul = Binary (F64 F64Op.Mul)
+let f64_div = Binary (F64 F64Op.Div)
+let f64_min = Binary (F64 F64Op.Min)
+let f64_max = Binary (F64 F64Op.Max)
+let f64_copysign = Binary (F64 F64Op.CopySign)
+
+let i32_eqz = Test (I32 I32Op.Eqz)
+let i64_eqz = Test (I64 I64Op.Eqz)
+
+let i32_eq = Compare (I32 I32Op.Eq)
+let i32_ne = Compare (I32 I32Op.Ne)
+let i32_lt_s = Compare (I32 I32Op.LtS)
+let i32_lt_u = Compare (I32 I32Op.LtU)
+let i32_le_s = Compare (I32 I32Op.LeS)
+let i32_le_u = Compare (I32 I32Op.LeU)
+let i32_gt_s = Compare (I32 I32Op.GtS)
+let i32_gt_u = Compare (I32 I32Op.GtU)
+let i32_ge_s = Compare (I32 I32Op.GeS)
+let i32_ge_u = Compare (I32 I32Op.GeU)
+let i64_eq = Compare (I64 I64Op.Eq)
+let i64_ne = Compare (I64 I64Op.Ne)
+let i64_lt_s = Compare (I64 I64Op.LtS)
+let i64_lt_u = Compare (I64 I64Op.LtU)
+let i64_le_s = Compare (I64 I64Op.LeS)
+let i64_le_u = Compare (I64 I64Op.LeU)
+let i64_gt_s = Compare (I64 I64Op.GtS)
+let i64_gt_u = Compare (I64 I64Op.GtU)
+let i64_ge_s = Compare (I64 I64Op.GeS)
+let i64_ge_u = Compare (I64 I64Op.GeU)
+let f32_eq = Compare (F32 F32Op.Eq)
+let f32_ne = Compare (F32 F32Op.Ne)
+let f32_lt = Compare (F32 F32Op.Lt)
+let f32_le = Compare (F32 F32Op.Le)
+let f32_gt = Compare (F32 F32Op.Gt)
+let f32_ge = Compare (F32 F32Op.Ge)
+let f64_eq = Compare (F64 F64Op.Eq)
+let f64_ne = Compare (F64 F64Op.Ne)
+let f64_lt = Compare (F64 F64Op.Lt)
+let f64_le = Compare (F64 F64Op.Le)
+let f64_gt = Compare (F64 F64Op.Gt)
+let f64_ge = Compare (F64 F64Op.Ge)
+
+let i32_extend8_s = Unary (I32 (I32Op.ExtendS Pack8))
+let i32_extend16_s = Unary (I32 (I32Op.ExtendS Pack16))
+let i64_extend8_s = Unary (I64 (I64Op.ExtendS Pack8))
+let i64_extend16_s = Unary (I64 (I64Op.ExtendS Pack16))
+let i64_extend32_s = Unary (I64 (I64Op.ExtendS Pack32))
+
+let i32_wrap_i64 = Convert (I32 I32Op.WrapI64)
+let i32_trunc_f32_s = Convert (I32 I32Op.TruncSF32)
+let i32_trunc_f32_u = Convert (I32 I32Op.TruncUF32)
+let i32_trunc_f64_s = Convert (I32 I32Op.TruncSF64)
+let i32_trunc_f64_u = Convert (I32 I32Op.TruncUF64)
+let i32_trunc_sat_f32_s = Convert (I32 I32Op.TruncSatSF32)
+let i32_trunc_sat_f32_u = Convert (I32 I32Op.TruncSatUF32)
+let i32_trunc_sat_f64_s = Convert (I32 I32Op.TruncSatSF64)
+let i32_trunc_sat_f64_u = Convert (I32 I32Op.TruncSatUF64)
+let i64_extend_i32_s = Convert (I64 I64Op.ExtendSI32)
+let i64_extend_i32_u = Convert (I64 I64Op.ExtendUI32)
+let i64_trunc_f32_s = Convert (I64 I64Op.TruncSF32)
+let i64_trunc_f32_u = Convert (I64 I64Op.TruncUF32)
+let i64_trunc_f64_s = Convert (I64 I64Op.TruncSF64)
+let i64_trunc_f64_u = Convert (I64 I64Op.TruncUF64)
+let f32_convert_i32_s = Convert (F32 F32Op.ConvertSI32)
+let f32_convert_i32_u = Convert (F32 F32Op.ConvertUI32)
+let f32_convert_i64_s = Convert (F32 F32Op.ConvertSI64)
+let f32_convert_i64_u = Convert (F32 F32Op.ConvertUI64)
+let i64_trunc_sat_f32_s = Convert (I64 I64Op.TruncSatSF32)
+let i64_trunc_sat_f32_u = Convert (I64 I64Op.TruncSatUF32)
+let i64_trunc_sat_f64_s = Convert (I64 I64Op.TruncSatSF64)
+let i64_trunc_sat_f64_u = Convert (I64 I64Op.TruncSatUF64)
+let f32_demote_f64 = Convert (F32 F32Op.DemoteF64)
+let f64_convert_i32_s = Convert (F64 F64Op.ConvertSI32)
+let f64_convert_i32_u = Convert (F64 F64Op.ConvertUI32)
+let f64_convert_i64_s = Convert (F64 F64Op.ConvertSI64)
+let f64_convert_i64_u = Convert (F64 F64Op.ConvertUI64)
+let f64_promote_f32 = Convert (F64 F64Op.PromoteF32)
+let i32_reinterpret_f32 = Convert (I32 I32Op.ReinterpretFloat)
+let i64_reinterpret_f64 = Convert (I64 I64Op.ReinterpretFloat)
+let f32_reinterpret_i32 = Convert (F32 F32Op.ReinterpretInt)
+let f64_reinterpret_i64 = Convert (F64 F64Op.ReinterpretInt)
+
+let memory_size = MemorySize
+let memory_grow = MemoryGrow
+
+
+
+
+ + + diff --git a/docs/html/about-this-guide.html b/docs/html/about-this-guide.html new file mode 100644 index 00000000000..469e0723871 --- /dev/null +++ b/docs/html/about-this-guide.html @@ -0,0 +1,372 @@ + + + + + + + md/about-this-guide.md + + + + +
+

md/about-this-guide.md

+
+ +

Motoko Programming Language +Guide

+

About this guide

+

The Motoko Programming Language Guide introduces key +features of the general-purpose Motoko programming language and provides +examples and reference information to help you learn the nuances of the +language and the practical implications of how to apply it.

+

The Motoko programming language is optimized for developing programs +that run on the Internet Computer blockchain network and to work with +the IC +SDK. You could, in principle, also write programs using Motoko for +more traditional platforms and to run in other contexts, though support +for this is currently best-effort and incomplete. This guide attempts to +strike a balance between highlighting features that are uniquely suited +to running on the Internet Computer and features that are +generally-applicable or well-suited for programs running on all +targets.

+

Intended audience

+

This guide provides reference information and examples for +programmers who want to explore or plan to use the Motoko programming +language. Most of the information in this guide is applicable +independent of whether you are developing programs to run on the +Internet Computer or working with the IC +SDK.

+

The guide assumes you are familiar with basic programming principles +and terminology and have at least some experience writing programs in a +high-level programming language such as C++ or Rust, or have practical +experience working with a scripting language such as JavaScript or +TypeScript. In addition, Motoko incorporates some aspects of functional +programming, so you might find some knowledge of functional programming +design principles helpful in learning to use Motoko.

+

Although this guide is intended to help readers from different +backgrounds understand the basic design principles and semantics of the +Motoko, you should keep in mind that the language implementation and the +documentation are also continuing to evolve.

+

Using this guide

+

To provide a framework for learning Motoko, you might want to start +by reviewing Engineering values +and goals. The Engineering +values and goals describe the core design considerations for the +development and evolution of the Motoko programming language.

+

With those considerations in mind, you can start to explore +fundamental concepts, including the role of types and type annotations, +in simple code examples and small programs.

+

Once you are familiar with the basic concepts and terminology, later +sections introduce programs that compute in more interesting ways, +including function abstractions, user-defined type definitions, +user-defined actors, and asynchronous communication.

+

As you begin using Motoko to write your own programs, you can return +to this guide for reference information and examples.

+

Most of the code examples in this guide are interactive: you can live +edit the example, interpret the code in the browser and see the result. +The interpreter is provided for education purposes. While most of the +language features are supported in the interpreter, they are not exactly +the same as the real compiler. For example, you may get a stack overflow +for a medium-size input, while the real compiler handles the input just +fine. Some of the system features are not fully supported, such as +cycles, canister imports and state-mutating query calls.

+

Documentation conventions

+

The following conventions are used in this guide:

+
    +
  • Fixed-width font is used for sample code, program +names, program output, file names, and commands that you type at the +command line.

  • +
  • Bold text is used to emphasize commands, +buttons, or user interface text, and to introduce new terms.

  • +
  • Italics are used for book titles and to emphasize +specific words or terms.

  • +
  • The CAUTION style is used to indicate content that is missing or +incomplete.

  • +
  • The WARNING style is used to indicate where content is outdated +or potentially inaccurate.

  • +
  • The NOTE style is used to indicate content that describes a +feature that is not yet supported but is planned for a future +release.

  • +
+

Engineering values and goals

+

The engineering effort behind the design and implementation of Motoko +is driven by a core set of values and goals. The DFINITY engineering +organization uses these values and goals to define and prioritize the +language features and enhancements to add and improve as part of +ongoing language development.

+

For transparency into the principles that guide the engineering +effort, the engineering organization has identified the following sets +of core values and secondary values for driving the direction of the +Motoko programming language.

+

Core values

+

The following guiding principles represent the core values of the +engineering organization in prioritized order:

+
    +
  1. Seamless integration with the Internet +Computer blockchain network to ensure that Motoko provides full +language support for the actor-based model, asynchronous messaging, data +persistence, interface description language interoperability, and other +features.

  2. +
  3. Ergonomics to ensure that Motoko embraces familiarity, +simplicity, clarity, explicitness, and other human factors.

  4. +
  5. Formal correctness to ensure that Motoko maintains state +isolation, a sound type system and type safety, precision, pattern +matching, appropriate defaults, and coding best-practices.

  6. +
+

Secondary values

+

The following principles represent the secondary values of the +engineering organization that are deemed important but not primary +driving factors:

+
    +
  1. Expressiveness, so that Motoko provides first-class functions, +polymorphism, pattern matching, and more as the language +evolves.

  2. +
  3. Performance, so that Motoko provides reasonably fast operation +initially and continues to improves as the language evolves.

  4. +
  5. Readiness, so the Motoko comes with "batteries included" in the +form of libraries and examples and out-of-the-box integration with the +IC +SDK.

  6. +
+

Non-goals

+

As a counterpoint to the core values and goals, the engineering +organization also identified the following as "non-goals" that are +outside of the scope of the engineering effort:

+
    +
  1. Having a more advanced type system, with cutting-edge +features.

  2. +
  3. Simplicity over functionality in design or implementation (the +"Worse is Better" approach).

  4. +
  5. Interoperability or support for running Motoko programs on +blockchains other than the Internet Computer.

  6. +
+

Finding more information

+

For information about using Motoko with the IC SDK for creating and +managing canisters, see the Developer +Resources.

+

For background information on various topics relevant to the design, +use, or deployment of Motoko services, or the language’s design itself, +consider the following resources as a starting point:

+

WebAssembly

+ +

Modern type systems

+ +

Getting additional support

+

If you are looking for more information or technical support, the +DFINITY website provides quick access to frequently-asked questions, +technical articles, developer updates, and other resources. From the +website, you can search knowledge base articles, open and view support +cases, sign up for the newsletter, read the latest blog posts, view +how-to videos, download software updates, or exchange ideas with members +of the community.

+

In addition to the resources available on the website, you can +connect with DFINITY or other developers using social media or by +visiting the DFINITY Community Forum on Discourse and joining the +conversation.

+ + diff --git a/docs/html/actor-classes.html b/docs/html/actor-classes.html new file mode 100644 index 00000000000..c793f5595fe --- /dev/null +++ b/docs/html/actor-classes.html @@ -0,0 +1,277 @@ + + + + + + + md/actor-classes.md + + + + +
+

md/actor-classes.md

+
+ +

Actor classes

+

Actor classes enable you to create networks of actors (canister smart +contracts) programmatically. Currently, actor classes have to +be defined in a separate source file. To illustrate how to define and +import actor classes, the following example implements a distributed map +of keys of type Nat to values of type Text. It +provides simple insert and lookup functions, put(k, v) and +get(k), for working with these keys and values.

+

To distribute the data for this example, the set of keys is +partitioned into n buckets. For now, we just fix +n = 8. The bucket, i, of a key, +k, is determined by the remainder of k divided +by n, that is, i = k % n. The ith +bucket (i in [0..n)) receives a dedicated +actor to store text values assigned to keys in that bucket.

+

The actor responsible for bucket i is obtained as an +instance of the actor class Bucket(i), defined in the +sample Buckets.mo file, as follows:

+

Buckets.mo:

+
+

A bucket stores the current mapping of keys to values in a mutable +map variable containing an imperative RedBlack tree, +map, that is initially empty.

+

On get(k), the bucket actor simply returns any value +stored at k, returning map.get(k).

+

On put(k, v), the bucket actor updates the current +map to map k to ?v by calling +map.put(k, v).

+

Both functions use the class parameters n and +i to verify that the key is appropriate for the bucket by +asserting ((k % n) == i).

+

Clients of the map can then communicate with a coordinating +Map actor, implemented as follows:

+
+

As this example illustrates, the Map code imports the +Bucket actor class as module Buckets.

+

The actor maintains an array of n allocated buckets, +with all entries initially null. Entries are populated with +Bucket actors on demand.

+

On get(k, v), the Map actor:

+
    +
  • uses the remainder of key k divided by +n to determine the index i of the bucket +responsible for that key

  • +
  • returns null if the ith bucket does not +exist, or

  • +
  • delegates to that bucket by calling bucket.get(k, v) +if it does.

  • +
+

On put(k, v), the Map actor:

+
    +
  • uses the remainder of key k divided by +n to determine the index i of the bucket +responsible for that key

  • +
  • installs bucket i if the bucket does not exist by +using an asynchronous call to the constructor, +Buckets.Bucket(i), and, after awaiting the result, records +it in the array buckets

  • +
  • delegates the insertion to that bucket by calling +bucket.put(k, v).

  • +
+

While this example sets the number of buckets to 8, you +can easily generalize the example by making the Map actor +an actor class, adding a parameter (n : Nat) and +omitting the declaration let n = 8;. For example:

+
actor class Map(n : Nat) {
+
+  type Key = Nat
+  ...
+}
+

Clients of actor class Map are now free to +determine the (maximum) number of buckets in the network by passing an +argument on construction.

+

:::note

+

On the Internet Computer, calls to a class constructor must be +provisioned with cycles to pay for the creation of a principal. See ExperimentalCycles for +instructions on how to add cycles to a call using the imperative +ExperimentalCycles.add(cycles) function.

+

:::

+

Configuring and +managing actor class instances

+

On the Internet Computer, the primary constructor of an imported +actor class always creates a new principal and installs a fresh instance +of the class as the code for that principal.

+

To provide further control over actor class installation, Motoko +endows each imported actor class with an extra, secondary constructor. +This constructor takes an additional first argument that specifies the +desired installation mode. The constructor is only available via special +syntax that stresses its system functionality.

+

Using this syntax, it's possible to specify initial canister settings +(such as an array of controllers), manually install, upgrade and +reinstall canisters, exposing all of the lower-level facilities of the +Internet Computer.

+

See Actor class +management for more details.

+ + diff --git a/docs/html/actors-async.html b/docs/html/actors-async.html new file mode 100644 index 00000000000..3611810dd49 --- /dev/null +++ b/docs/html/actors-async.html @@ -0,0 +1,603 @@ + + + + + + + md/actors-async.md + + + + +
+

md/actors-async.md

+
+ +

Actors and async data

+

The programming model of the Internet Computer consists of +memory-isolated canisters communicating by asynchronous message passing +of binary data encoding Candid values. A canister processes its messages +one-at-a-time, preventing race conditions. A canister uses call-backs to +register what needs to be done with the result of any inter-canister +messages it issues.

+

Motoko abstracts the complexity of the Internet Computer with a well +known, higher-level abstraction: the actor model. Each canister +is represented as a typed actor. The type of an actor lists the messages +it can handle. Each message is abstracted as a typed, asynchronous +function. A translation from actor types to Candid types imposes +structure on the raw binary data of the underlying Internet Computer. An +actor is similar to an object, but is different in that its state is +completely isolated, its interactions with the world are entirely +through asynchronous messaging, and its messages are processed +one-at-a-time, even when issued in parallel by concurrent actors.

+

In Motoko, sending a message to an actor is a function call, but +instead of blocking the caller until the call has returned, the message +is enqueued on the callee, and a future representing that +pending request immediately returned to the caller. The future is a +placeholder for the eventual result of the request, that the caller can +later query. Between issuing the request, and deciding to wait for the +result, the caller is free to do other work, including issuing more +requests to the same or other actors. Once the callee has processed the +request, the future is completed and its result made available to the +caller. If the caller is waiting on the future, its execution can resume +with the result, otherwise the result is simply stored in the future for +later use.

+

In Motoko, actors have dedicated syntax and types; messaging is +handled by so called shared functions returning futures (shared +because they are available to remote actors); a future, f, +is a value of the special type async T for some type +T; waiting on f to be completed is expressed +using await f to obtain a value of type T. To +avoid introducing shared state through messaging, for example, by +sending an object or mutable array, the data that can be transmitted +through shared functions is restricted to immutable, shared +types.

+

To start, we consider the simplest stateful service: a +Counter actor, the distributed version of our previous, +local counter object.

+

Example: a Counter service

+

Consider the following actor declaration:

+
+ + +

The Counter actor declares one field and three public, +shared functions:

+
    +
  • the field count is mutable, initialized to zero and +implicitly private.

  • +
  • function inc() asynchronously increments the counter +and returns a future of type async () for +synchronization.

  • +
  • function read() asynchronously reads the counter +value and returns a future of type async Nat containing its +value.

  • +
  • function bump() asynchronously increments and reads +the counter.

  • +
+

Shared functions, unlike local functions, are accessible to remote +callers and have additional restrictions: their arguments and return +value must be shared types - a subset of types that includes +immutable data, actor references, and shared function references, but +excludes references to local functions and mutable data. Because all +interaction with actors is asynchronous, an actor’s functions must +return futures, that is, types of the form async T, for +some type T.

+

The only way to read or modify the state (count) of the +Counter actor is through its shared functions.

+

A value of type async T is a future. The producer of the +future completes the future when it returns a result, either a value or +error.

+

Unlike objects and modules, actors can only expose functions, and +these functions must be shared. For this reason, Motoko +allows you to omit the shared modifier on public actor +functions, allowing the more concise, but equivalent, actor +declaration:

+
+

For now, the only place shared functions can be declared is in the +body of an actor or actor class. Despite this restriction, shared +functions are still first-class values in Motoko and can be passed as +arguments or results, and stored in data structures.

+

The type of a shared function is specified using a shared function +type. For example, the value inc has type +shared () → async Nat and could be supplied as a standalone +callback to some other service (see publish-subscribe for an example).

+

Actor types

+

Just as objects have object types, actors have actor types. +The Counter actor has the following type:

+
actor {
+  inc  : shared () -> async ();
+  read : shared () -> async Nat;
+  bump : shared () -> async Nat;
+}
+

Again, because the shared modifier is required on every +member of an actor, Motoko both elides them on display, and allows you +to omit them when authoring an actor type.

+

Thus the previous type can be expressed more succinctly as:

+
actor {
+  inc  : () -> async ();
+  read : () -> async Nat;
+  bump : () -> async Nat;
+}
+

Like object types, actor types support subtyping: an actor type is a +subtype of a more general one that offers fewer functions with more +general types.

+

Using await +to consume async futures

+

The caller of a shared function typically receives a future, a value +of type async T for some T.

+

The only thing the caller, a consumer, can do with this future is +wait for it to be completed by the producer, throw it away, or store it +for later use.

+

To access the result of an async value, the receiver of +the future use an await expression.

+

For example, to use the result of Counter.read() above, +we can first bind the future to an identifier a, and then +await a to retrieve the underlying Nat, +n:

+
let a : async Nat = Counter.read();
+let n : Nat = await a;
+

The first line immediately receives a future of the counter +value, but does not wait for it, and thus cannot (yet) use it as a +natural number.

+

The second line awaits this future and extracts the +result, a natural number. This line may suspend execution until the +future has been completed.

+

Typically, one rolls the two steps into one and one just awaits an +asynchronous call directly:

+
let n : Nat = await Counter.read();
+

Unlike a local function call, which blocks the caller until the +callee has returned a result, a shared function call immediately returns +a future, f, without blocking. Instead of blocking, a later +call to await f suspends the current computation until +f is complete. Once the future is completed (by the +producer), execution of await p resumes with its result. If +the result is a value, await f returns that value. +Otherwise the result is some error, and await f propagates +the error to the consumer of await f.

+

Awaiting a future a second time will just produce the same result, +including re-throwing any error stored in the future. Suspension occurs +even if the future is already complete; this ensures state changes and +message sends prior to every await are +committed.

+

:::danger

+

A function that does not await in its body is guaranteed +to execute atomically - in particular, the environment cannot change the +state of the actor while the function is executing. If a function +performs an await, however, atomicity is no longer +guaranteed. Between suspension and resumption around the +await, the state of the enclosing actor may change due to +concurrent processing of other incoming actor messages. It is the +programmer’s responsibility to guard against non-synchronized state +changes. A programmer may, however, rely on any state change prior to +the await being committed.

+

:::

+

For example, the implementation of bump() above is +guaranteed to increment and read the value of count, in one +atomic step. The alternative implementation:

+
  public shared func bump() : async Nat {
+    await inc();
+    await read();
+  };
+

does not have the same semantics and allows another client +of the actor to interfere with its operation: each await +suspends execution, allowing an interloper to change the state of the +actor. By design, the explicit awaits make the potential +points of interference clear to the reader.

+

Traps and Commit Points

+

A trap is a non-recoverable runtime failure caused by, for example, +division-by-zero, out-of-bounds array indexing, numeric overflow, cycle +exhaustion or assertion failure.

+

A shared function call that executes without executing an +await expression never suspends and executes atomically. A +shared function that contains no await expression is +syntactically atomic.

+

An atomic shared function whose execution traps has no visible effect +on the state of the enclosing actor or its environment - any state +change is reverted, and any message that it has sent is revoked. In +fact, all state changes and message sends are tentative during +execution: they are committed only after a successful commit +point is reached.

+

The points at which tentative state changes and message sends are +irrevocably committed are:

+
    +
  • implicit exit from a shared function by producing a +result,

  • +
  • explict exit via return or throw +expressions, and

  • +
  • explicit await expressions.

  • +
+

A trap will only revoke changes made since the last commit point. In +particular, in a non-atomic function that does multiple awaits, a trap +will only revoke changes attempted since the last await - all preceding +effects will have been committed and cannot be undone.

+

For example, consider the following (contrived) stateful +Atomicity actor:

+
+

Calling (shared) function atomic() will fail with an +error, since the last statement causes a trap. However, the trap leaves +the mutable variable s with value 0, not +1, and variable pinged with value +false, not true. This is because the trap +happens before method atomic has executed an +await, or exited with a result. Even though +atomic calls ping(), ping() is +tentative (queued) until the next commit point, so never delivered.

+

Calling (shared) function nonAtomic() will fail with an +error, since the last statement causes a trap. However, the trap leaves +the variable s with value 3, not +0, and variable pinged with value +true, not false. This is because each +await commits its preceding side-effects, including message +sends. Even though f is complete by the second await on +f, this await also forces a commit of the state, suspends +execution and allows for interleaved processing of other messages to +this actor.

+

Query functions

+

In Internet Computer terminology, all three Counter +functions are update messages that can alter the state of the +canister when called. Effecting a state change requires agreement +amongst the distributed replicas before the Internet Computer can commit +the change and return a result. Reaching consensus is an expensive +process with relatively high latency.

+

For the parts of applications that don’t require the guarantees of +consensus, the Internet Computer supports more efficient query +operations. These are able to read the state of a canister from a single +replica, modify a snapshot during their execution and return a result, +but cannot permanently alter the state or send further Internet Computer +messages.

+

Motoko supports the implementation of Internet Computer queries using +query functions. The query keyword modifies +the declaration of a (shared) actor function so that it executes with +non-committing, and faster, Internet Computer query semantics.

+

For example, we can extend the Counter actor with a +fast-and-loose variant of the trustworthy read function, +called peek:

+
+

The peek() function might be used by a +Counter frontend offering a quick, but less trustworthy, +display of the current counter value.

+

It is a compile-time error for a query method to call an actor +function since this would violate dynamic restrictions imposed by the +Internet Computer. Calls to ordinary functions are permitted.

+

Query functions can be called from non-query functions. Because those +nested calls require consensus, the efficiency gains of nested query +calls will be modest at best.

+

The query modifier is reflected in the type of a query +function:

+
  peek : shared query () -> async Nat
+

As before, in query declarations and actor types the +shared keyword can be omitted.

+

Messaging restrictions

+

The Internet Computer places restrictions on when and how canisters +are allowed to communicate. These restrictions are enforced dynamically +on the Internet Computer but prevented statically in Motoko, ruling out +a class of dynamic execution errors. Two examples are:

+
    +
  • canister installation can execute code, but not send +messages.

  • +
  • a canister query method cannot send messages.

  • +
+

These restrictions are surfaced in Motoko as restrictions on the +context in which certain expressions can be used.

+

In Motoko, an expression occurs in an asynchronous context +if it appears in the body of an async expression, which may +be the body of a (shared or local) function or a stand-alone expression. +The only exception are query functions, whose body is not +considered to open an asynchronous context.

+

In Motoko calling a shared function is an error unless the function +is called in an asynchronous context. In addition, calling a shared +function from an actor class constructor is also an error.

+

The await construct is only allowed in an asynchronous +context.

+

The async construct is only allowed in an asynchronous +context.

+

It is only possible to throw or try/catch +errors in an asynchronous context. This is because structured error +handling is supported for messaging errors only and, like messaging +itself, confined to asynchronous contexts.

+

These rules also mean that local functions cannot, in general, +directly call shared functions or await futures. This +limitation can sometimes be awkward: we hope to extend the type system +to be more permissive in future.

+ + +

Actor classes generalize +actors

+

An actor class generalizes a single actor declaration to the +declaration of family of actors satisfying the same interface. An actor +class declares a type, naming the interface of its actors, and a +function that constructs a fresh actor of that type each time it is +supplied with an argument. An actor class thus serves as a factory for +manufacturing actors. Because canister installation is asynchronous on +the Internet Computer, the constructor function is asynchronous too, and +returns its actor in a future.

+

For example, we can generalize Counter given above to +Counter(init) below, by introducing a constructor +parameter, variable init of type Nat:

+

Counters.mo:

+
+

If this class is stored in file Counters.mo, then we can +import the file as a module and use it to create several actors with +different initial values:

+
import Counters "Counters";
+
+let C1 = await Counters.Counter(1);
+let C2 = await Counters.Counter(2);
+(await C1.read(), await C2.read())
+

The last two lines above instantiate the actor class twice. +The first invocation uses the initial value 1, where the +second uses initial value 2. Because actor class +instantiation is asynchronous, each call to Counter(init) +returns a future that can be awaited for the resulting +actor value. Both C1 and C2 have the same +type, Counters.Counter and can be used interchangeably.

+

:::note

+

For now, the Motoko compiler gives an error when compiling programs +that do not consist of a single actor or actor class. Compiled programs +may still, however, reference imported actor classes. For more +information, see Importing actor +classes and Actor +classes.

+

:::

+

Composite query functions

+

Although queries can be fast, when called from a frontend, yet +trusted though slower, when called from an actor, they are also limited +in what they can do. In particular, they cannot themselves issue further +messages, including queries.

+

To address this limitation, the Internet Computer supports another +flavour of query function called a composite query. Like plain +queries, the state changes made by a composite query are transient, +isolated and never committed. Moreover, composite queries cannot call +update functions, including those implicit in async +expressions (which require update calls under the hood). Unlike plain +queries, composite queries can call query functions and composite query +functions, on the same and other actors, but only provided those actors +reside on the same subnet.

+

As a contrived example, consider generalising the previous +Counter actor to a class of counters. Each instance of the +class provides an additional composite query to sum the +values of a given array of counters:

+
+

Declaring sum as a composite query enables +it call the peek queries of its argument counters.

+

While update message can call plain query functions, they +cannot call composite query functions. This distinction, which +is dictated by the current capabilites of the IC, explains why query +functions and composite query functions are regarded as distinct types +of shared functions.

+

Note that the composite query modifier is reflected in +the type of a composite query function:

+
  sum : shared composite query ([Counter]) -> async Nat
+

Since only a composite query can call another composite query, you +may be wondering how any composite query gets called at all? The answer +to this chicken-and-egg problem is that composite queries are initiated +outside the IC, typically by an application (such as a browser frontend) +sending an ingress message invoking a composite query on a backend actor +on the IC.

+

:::danger

+

The Internet Computer's semantics of composite queries, like queries, +ensures that state changes made by a composite query are isolated from +other inter-canister calls, including recursive queries, composite or +not, to the same actor.

+

In particular, like a query, a composite query call rolls back its +state on function exit, but is also does not pass state changes to +sub-query or sub-composite-query calls. Therefore, repeated calls (which +includes recursive calls) have different semantics from the more +familiar sequential calls that accumulate state changes.

+

In sequential calls to queries made by a composite query, the +internal state changes of preceeding queries will have no effect on +subsequent queries, nor will the queries observe any local state changes +made by the enclosing composite query. Local states changes made by the +composite query are, however, preserved across the calls until finally +being rolled-back on exit from the composite query.

+

This semantics can lead to surprising behaviour for users accustomed +to ordinary imperative programming.

+

Consider this contrived example containing the composite query +test that calls query q and composite query +cq.

+
+

When state is 0, a call to +test returns

+
{s0 = 0; s1 = 0; s2 = 0; s3 = 3_000}
+

because none of the local updates to state are visible +to any of the callers or callees.

+

:::

+ + diff --git a/docs/html/advanced-discussion.html b/docs/html/advanced-discussion.html new file mode 100644 index 00000000000..0f77a3298ef --- /dev/null +++ b/docs/html/advanced-discussion.html @@ -0,0 +1,189 @@ + + + + + + + md/advanced-discussion.md + + + + +
+

md/advanced-discussion.md

+
+ +

Advanced discussion topics

+ + + diff --git a/docs/html/base-intro.html b/docs/html/base-intro.html new file mode 100644 index 00000000000..2b86103fec9 --- /dev/null +++ b/docs/html/base-intro.html @@ -0,0 +1,220 @@ + + + + + + + md/base-intro.md + + + + +
+

md/base-intro.md

+
+ +

Using Motoko base modules

+

The design of Motoko strives to minimize built-in types and +operations. Instead of built-in types, Motoko provides a base library of +modules to handle many kinds of common operations and make the language +feel complete. This base library is still evolving with modules that +support core features and all of the base library APIs are subject to +change over time to varying degrees. You should note, in particular, +that the size and number of modules and functions included in the base +library is likely to increase dramatically and updates to the base +library modules might introduce breaking changes that require you to +update your programs to remain compatible.

+

Importing from the base +library

+

To import from the base library, use the import keyword +followed by a local module name and a URL where the import +declaration can find the module you want to import. For example:

+
import Debug "mo:base/Debug";
+Debug.print("hello world");
+

This example illustrates how to import Motoko code—indicated by using +the mo: prefix—using the base/ base library +path and the module name Debug. You can also import Motoko +code and other modules using relative paths. For example, if you have +created a Motoko program named types.mo in the same folder +as your main program, you could include it with an import declaration +like this:

+
import Types "./types";
+

Viewing the base library +modules

+

You can find source code and documentation for Motoko base modules in +the motoko-base +open source repository. There are instructions in the repository for +generating a local copy of the current documentation for the Motoko base +library.

+

You can also search for documentation by using Search in any page of +the Developer Center.

+ + diff --git a/docs/html/basic-concepts.html b/docs/html/basic-concepts.html new file mode 100644 index 00000000000..b58a25181b4 --- /dev/null +++ b/docs/html/basic-concepts.html @@ -0,0 +1,789 @@ + + + + + + + md/basic-concepts.md + + + + +
+

md/basic-concepts.md

+
+ +

Basic concepts and terms

+

Motoko is designed for distributed programming with actors.

+

When programming on the Internet Computer in Motoko, each +actor represents an Internet Computer canister +smart contract with a Candid interface, whether written in +Motoko, Rust, Wasm or some other language that compiles to Wasm. Within +Motoko, we use the term actor to refer to any canister, +authored in any language that deploys to the Internet Computer. The role +of Motoko is to make these actors easy to author, and easy to use +programmatically, once deployed.

+

Before you begin writing distributed applications using actors, you +should be familiar with a few of the basic building blocks of any +programming language and with Motoko in particular. To get you started, +this section introduces the following key concepts and terms that are +used throughout the remainder of the documentation and that are +essential to learning to program in Motoko:

+
    +
  • program

  • +
  • declaration

  • +
  • expression

  • +
  • value

  • +
  • variable

  • +
  • type

  • +
+

If you have experience programming in other languages or are familiar +with modern programming language theory, you are probably already +comfortable with these terms and how they are used. There’s nothing +unique in how these terms are used in Motoko. If you are new to +programming, however, this guide introduces each of these terms +gradually and by using simplified example programs that eschew any use +of actors or distributed programming. After you have the basic +terminology as a foundation to build on, you can explore more advanced +aspects of the language. More advanced features are illustrated with +correspondingly more complex examples.

+

The following topics are covered in the section:

+ +

Motoko program syntax

+

Each Motoko program is a free mix of declarations and +expressions, whose syntactic classes are distinct, but related (see the +language quick reference for precise +program syntax).

+

For programs that we deploy on the Internet Computer, a valid program +consists of an actor expression, introduced with specific +syntax (keyword actor) that we discuss in Actors and async data.

+

In preparing for that discussion, this section and Section Mutable state begin by discussing programs +that are not meant to be Internet Computer services. Rather, these tiny +programs illustrate snippets of Motoko for writing those services, and +each can (usually) be run on its own as a (non-service) Motoko program, +possibly with some printed terminal output.

+

The examples in this section illustrate basic principles using simple +expressions, such as arithmetic. For an overview of the full expression +syntax of Motoko, see the Language quick +reference.

+

As a starting point, the following code snippet consists of two +declarations — for the variables x and y — +followed by an expression to form a single program:

+
let x = 1;
+let y = x + 1;
+x * y + x;
+

We will use variations of this small program in our discussion +below.

+

First, this program’s type is Nat (natural number), and +when run, it evaluates to the (natural number) value of +3.

+

Introducing a block with enclosing braces (do { and +}) and another variable (z), we can amend our +original program as follows:

+
let z = do {
+  let x = 1;
+  let y = x + 1;
+  x * y + x
+};
+

Declarations and expressions

+

Declarations introduce immutable variables, mutable state, actors, +objects, classes and other types. Expressions describe computations that +involve these notions.

+

For now, we use example programs that declare immutable variables, +and compute simple arithmetic.

+

Declarations versus +expressions

+

Recall that each Motoko +program is a free mix of declarations and expressions, whose +syntactic classes are distinct, but related. In this section, we use +examples to illustrate their distinctions and accommodate their +intermixing.

+

Recall our example program, first introduced above:

+
let x = 1;
+let y = x + 1;
+x * y + x;
+

In reality, this program is a declaration list that consists +of three declarations:

+
    +
  1. immutable variable x, via declaration +let x = 1;,

  2. +
  3. immutable variable y, via declaration +let y = x + 1;,

  4. +
  5. and an unnamed, implicit variable holding the final +expression’s value, x * y + x.

  6. +
+

This expression x * y + x illustrates a more general +principle: Each expression can be thought of as a declaration where +necessary since the language implicitly declares an unnamed variable +with that expression’s result value.

+

When the expression appears as the final declaration, this expression +may have any type. Here, the expression x * y + x has type +Nat.

+

Expressions that do not appear at the end, but rather within +the list of declarations must have unit type ().

+

Ignoring +non-unit-typed expressions in declaration lists

+

We can always overcome this unit-type restriction by explicitly using +ignore to ignore any unused result values. For example:

+
let x = 1;
+ignore(x + 42);
+let y = x + 1;
+ignore(y * 42);
+x * y + x;
+

Declarations and +variable substitution

+

Declarations can be mutually recursive, but in cases where they are +not, they permit substitution semantics. (that is, replacing equals for +equals, as familiar from high-school algebraic simplification).

+

Recall our original example:

+
let x = 1;
+let y = x + 1;
+x * y + x;
+

We can manually rewrite the program above by substituting +the variables' declared values for each of their respective +occurrences.

+

In so doing, we produce the following expression, which is also a +program:

+
1 * (1 + 1) + 1
+

This is also a valid program — of the same type and with the same +behavior (result value 3) — as the original program.

+

We can also form a single expression using a block.

+

From declarations to +block expressions

+

Many of the programs above each consist of a list of declarations, as +with this example, just above:

+
let x = 1;
+let y = x + 1;
+x * y + x
+

A declaration list is not itself (immediately) an +expression, so we cannot (immediately) declare another variable +with its final value (3).

+

Block expressions. We can form a block +expression from this list of declarations by enclosing it with +matching curly braces. Blocks are only allowed as +sub-expressions of control flow expressions like if, +loop, case, etc. In all other places, we use +do { …​ } to represent block expression, to distinguish +blocks from object literals. For example, do {} is the +empty block of type (), while {} is an empty +record of record type {}.

+
do {
+  let x = 1;
+  let y = x + 1;
+  x * y + x
+}
+

This is also program, but one where the declared variables +x and y are privately scoped to the block we +introduced.

+

This block form preserves the autonomy of the declaration list and +its choice of variable names.

+

A block expression produces a value and, when enclosed in +parentheses, can occur within some larger, compound expression. For +example:

+
100 +
+  (do {
+     let x = 1;
+     let y = x + 1;
+     x * y + x
+   })
+

Declarations follow +lexical scoping

+

Above, we saw that nesting blocks preserves the autonomy of each +separate declaration list and its choice of variable names. +Language theorists call this idea lexical scoping. It means +that variables' scopes may nest, but they may not interfere as they +nest.

+

For instance, the following (larger, enclosing) program evaluates to +42, not 2, since the final +occurrences of x and y, on the final line, +refer to the very first definitions, not the later +ones within the enclosed block:

+
let x = 40; let y = 2;
+ignore do {
+  let x = 1;
+  let y = x + 1;
+  x * y + x
+};
+x + y
+

Other languages that lack lexical scoping may give a different +meaning to this program. However, modern languages universally favor +lexical scoping, the meaning given here.

+

Aside from mathematical clarity, the chief practical benefit of +lexical scoping is security, and its use in building +compositionally-secure systems. Specifically, Motoko gives very strong +composition properties. For example, nesting your program within a +program you do not trust cannot arbitrarily redefine your variables with +different meanings.

+

Values and evaluation

+ + +

Once a Motoko expression receives the program’s (single) thread of +control, it evaluates eagerly until it reduces to a result +value.

+

In so doing, it will generally pass control to sub-expressions, and +to sub-routines before it gives up control from the ambient control +stack.

+

If this expression never reaches a value form, the expression +evaluates indefinitely. Later we introduce recursive functions and +imperative control flow, which each permit non-termination. For now, we +only consider terminating programs that result in values.

+

In the material above, we focused on expressions that produced +natural numbers. As a broader language overview, however, we briefly +summarize the other value forms below:

+

Primitive values

+

Motoko permits the following primitive value forms:

+
    +
  • Boolean values (true and +false).

  • +
  • Integers (…​,-2, -1, 0, +1, 2, …​) - bounded and unbounded +variants.

  • +
  • Natural numbers (0, 1, 2, +…​) - bounded and unbounded variants.

  • +
  • Text values - strings of unicode characters.

  • +
+

By default, integers and natural +numbers are unbounded and do not overflow. Instead, +they use representations that grow to accommodate any finite number.

+

For practical reasons, Motoko also includes bounded types +for integers and natural numbers, distinct from the default versions. +Each bounded variant has a fixed bit-width (one of 8, +16, 32, 64) that determines the +range of representable values and each carries the potential for +overflow. Exceeding a bound is a run-time fault that causes the +program to trap.

+

There are no unchecked, uncaught overflows in Motoko, except in +well-defined situations, for explicitly wrapping operations +(indicated by a conventional % character in the operator). +The language provides primitive built-ins to convert between these +various number representations.

+

The language quick reference +contains a complete list of primitive types.

+

Non-primitive values

+ + +

Building on the primitive values and types above, the language +permits user-defined types, and each of the following non-primitive +value forms and associated types:

+ +

We discuss the use of these forms in the next sections.

+

For precise language definitions of primitive and non-primitive +values, see the language quick +reference.

+

The unit type ()

+

Motoko has no type named void. In many cases where +readers may think of return types being “void” from using languages like +Java or C++, we encourage them to think instead of the unit +type, written ().

+

In practical terms, like void, the unit value usually +carries zero representation cost.

+

Unlike the void type, there is a unit value, +but like the void return value, the unit value carries no +values internally, and as such, it always carries zero +information.

+

Another mathematical way to think of the unit value is as a tuple +with no elements - the nullary (“zero-ary”) tuple. There is only one +value with these properties, so it is mathematically unique, and thus +need not be represented at runtime.

+

Natural numbers

+

The members of this type consist of the usual values - +0, 1, 2, …​ - but, as in +mathematics, the members of Nat are not bound to a special +maximum size. Rather, the runtime representation of these values +accommodates arbitrary-sized numbers, making their "overflow" (nearly) +impossible. (nearly because it is the same event as running out +of program memory, which can always happen for some programs in extreme +situations).

+

Motoko permits the usual arithmetic operations one would expect. As +an illustrative example, consider the following program:

+
let x = 42 + (1 * 37) / 12: Nat
+

This program evaluates to the value 45, also of type +Nat.

+

Type soundness

+

Each Motoko expression that type-checks we call well-typed. +The type of a Motoko expression serves as a promise from the +language to the developer about the future behavior of the program, if +executed.

+

First, each well-typed program will evaluate without undefined +behavior. That is, the phrase “well-typed programs don’t go +wrong” applies here. For those unfamiliar with the deeper +implications of that phrase, it means that there is a precise space of +meaningful (unambiguous) programs, and the type system enforces that we +stay within it, and that all well-typed programs have a precise +(unambiguous) meaning.

+

Furthermore, the types make a precise prediction over the program’s +result. If it yields control, the program will generate a result +value that agrees with that of the original program.

+

In either case, the static and dynamic views of the program are +linked by and agree with the static type system. This agreement is the +central principle of a static type system, and is delivered by Motoko as +a core aspect of its design.

+

The same type system also enforces that asynchronous interactions +agree between static and dynamic views of the program, and that the +resulting messages generated "under the hood" never mismatch at runtime. +This agreement is similar in spirit to the caller/callee argument type +and return type agreements that one ordinarily expects in a typed +language.

+

Type annotations and +variables

+

Variables relate (static) names and (static) types with (dynamic) +values that are present only at runtime.

+

In this sense, Motoko types provide a form of trusted, +compiler-verified documentation in the program source code.

+

Consider this very short program:

+
let x : Nat = 1
+

In this example, the compiler infers that the expression +1 has type Nat, and that x has +the same type.

+

In this case, we can omit this annotation without changing the +meaning of the program:

+
let x = 1
+

Except for some esoteric situations involving operator overloading, +type annotations do not (typically) affect the meaning of the program as +it runs.

+

If they are omitted and the compiler accepts the program, as is the +case above, the program has the same meaning (same behavior) as +it did originally.

+

However, sometimes type annotations are required by the compiler to +infer other assumptions, and to check the program as a whole.

+

When they are added and the compiler still accepts the program, we +know that the added annotations are consistent with the +existing ones.

+

For instance, we can add additional (not required) annotations, and +the compiler checks that all annotations and other inferred facts agree +as a whole:

+
let x : Nat = 1 : Nat
+

If we were to try to do something inconsistent with our +annotation type, however, the type checker will signal an error.

+

Consider this program, which is not well-typed:

+
let x : Text = 1 + 1
+

The type annotation Text does not agree with the rest of +the program, since the type of 1 + 1 is Nat +and not Text, and these types are unrelated by subtyping. +Consequently, this program is not well-typed, and the compiler will +signal an error (with a message and location) and will not compile or +execute it.

+

Type errors and messages

+

Mathematically, the type system of Motoko is declarative, +meaning that it exists independently of any implementation, as a concept +entirely in formal logic. Likewise, the other key aspects of the +language definition (for example, its execution semantics) exist outside +of an implementation.

+

However, to design this logical definition, to experiment with it, +and to practice making mistakes, we want to interact with this type +system, and to make lots of harmless mistakes along the way.

+

The error messages of the type checker attempt to help the +developer when they misunderstand or otherwise misapply the logic of the +type system, which is explained indirectly in this book.

+

These error messages will evolve over time, and for this reason, we +will not include particular error messages in this text. Instead, we +will attempt to explain each code example in its surrounding prose.

+

The Motoko base library

+ + +

For various practical language engineering reasons, the design of +Motoko strives to minimize builtin types and operations.

+

Instead, whenever possible, the Motoko base library provides the +types and operations that make the language feel complete. +However, this base library is still under +development, and is still incomplete.

+

The Motoko Base Library lists a +selection of modules from the Motoko base library, focusing on +core features used in the examples that are unlikely to change +radically. However, all of these base library APIs will certainly change +over time (to varying degrees), and in particular, they will grow in +size and number.

+

To import from the base library, use the import keyword. +Give a local module name to introduce, in this example D +for “Debug”, and a URL where the import +declaration may locate the imported module:

+
+

In this case, we import Motoko code (not some other module form) with +the mo: prefix. We specify the base/ path, +followed by the module’s file name Debug.mo minus its +extension.

+

Printing values

+

Above, we print the text string using the function print +in library Debug.mo:

+
print: Text -> ()
+

The function print accepts a text string (of type +Text) as input, and produces the unit value (of +unit type, or ()) as its output.

+

Because unit values carry no information, all values of type unit are +identical, so the print function doesn’t actually produce +an interesting result. Instead of a result, it has a side +effect. The function print has the effect of emitting +the text string in a human-readable form to the output terminal. +Functions that have side effects, such as emitting output, or modifying +state, are often called impure. Functions that just return +values, without further side-effects, are called pure. We +discuss the return value (the unit value) in +detail below, and relate it to the void type for +readers more familiar with that concept.

+

Finally, we can transform most Motoko values into human-readable text +strings for debugging purposes, without having to write those +transformations by hand.

+

The debug_show primitive permits converting a large +class of values into values of type Text.

+

For instance, we can convert a triple (of type +(Text, Nat, Text)) into debugging text without writing a +custom conversion function ourselves:

+
import D "mo:base/Debug";
+D.print(debug_show(("hello", 42, "world")))
+

Using these text transformations, we can print most Motoko data as we +experiment with our programs.

+

Accommodating incomplete +code

+

Sometimes, in the midst of writing a program, we want to run an +incomplete version, or a version where one or more execution paths are +either missing or simply invalid.

+

To accommodate these situations, we use the xxx, +nyi and unreachable functions from the base +Prelude library, explained below. Each is a simple wrapper +around a more general trap mechanism general +trap mechanism, explained further below.

+

Use short-term holes

+

Short-term holes are never committed to a source repository, and only +ever exist in a single development session, for a developer that is +still writing the program.

+

Assuming that earlier, one has imported the prelude as follows:

+
import P "mo:base/Prelude";
+

The developer can fill any missing expression with the +following one:

+
P.xxx()
+

The result will always type check at compile time, and +will always trap at run time, if and when this expression ever +executes.

+

Document longer-term holes

+

By convention, longer-term holes can be considered "not yet +implemented" (nyi) features, and marked as such with a +similar function from the Prelude module:

+
P.nyi()
+

Document +unreachable code paths

+

In contrast to the situations above, sometimes code will +never be filled, since it will never be evaluated, +assuming the coherence of the internal logic of the programs' +invariants.

+

To document a code path as logically impossible, or +unreachable, use the base library function +unreachable:

+
P.unreachable()
+

As in the situations above, this function type-checks in all +contexts, and when evaluated, traps in all contexts.

+ + +

Traps due to faults

+

Some errors, such as division by zero, out-of-bounds array indexing, +and pattern match failure are (by design) not prevented by the type +system, but instead cause dynamic faults called traps.

+
1/0; // traps due to division by 0
+
let a = ["hello", "world"];
+a[2]; // traps due to out-of-bounds indexing
+
let true = false; // pattern match failure
+

We say that code traps when its exection causes a +trap.

+

Because the meaning of execution is ill-defined after a faulting +trap, execution of the code ends by aborting at the trap.

+

:::note

+

Traps that occur within actor messages are more subtle: they don’t +abort the entire actor, but prevent that particular message from +proceeding, rolling back any yet uncommitted state changes. Other +messages on the actor will continue execution.

+

:::

+

Explicit traps

+

Occasionally it can be useful to force an unconditional trap, with a +user-defined message.

+

The Debug library provides the function +trap(t) for this purpose, which can be used in any +context.

+
import Debug "mo:base/Debug";
+
+Debug.trap("oops!");
+
import Debug "mo:base/Debug";
+
+let swear : Text = Debug.trap("oh my!");
+

(The Prelude functions nyi(), +unreachable() and xxx() discussed above are +simple wrappers around Debug.trap.)

+

Assertions

+

Assertions allow you to conditionally trap when some Boolean test +fails to hold, but continue execution otherwise. For example,

+
let n = 65535;
+assert n % 2 == 0; // traps when n not even
+
assert false; // unconditionally traps
+
import Debug "mo:base/Debug";
+
+assert 1 > 0; // never traps
+Debug.print "bingo!";
+

Because an assertion may succeed, and thus proceed with execution, it +may only be used in context where a value of type () is +expected.

+ + diff --git a/docs/html/caller-id.html b/docs/html/caller-id.html new file mode 100644 index 00000000000..ba783de8964 --- /dev/null +++ b/docs/html/caller-id.html @@ -0,0 +1,236 @@ + + + + + + + md/caller-id.md + + + + +
+

md/caller-id.md

+
+ +

Principals and caller +identification

+

Motoko’s shared functions support a simple form of caller +identification that allows you to inspect the Internet Computer +principal associated with the caller of a function. The +principal associated with a call is a value that identifies a unique +user or canister smart contract.

+

You can use the principal associated with the caller +of a function to implement a basic form of access-control in +your program.

+

In Motoko, the shared keyword is used to declare a +shared function. The shared function can also declare an optional +parameter of type {caller : Principal}.

+ + +

To illustrate how to access the caller of a shared function, consider +the following:

+
shared(msg) func inc() : async () {
+  // ... msg.caller ...
+}
+

In this example, the shared function inc() specifies a +msg parameter, a record, and the msg.caller +accesses the principal field of msg.

+

The calls to the inc() function do not change — at each +call site, the caller’s principal is provided by the system, not the +user — so the principal cannot be forged or spoofed by a malicious +user.

+

To access the caller of an actor class constructor, you use the same +(optional) syntax on the actor class declaration. For example:

+
shared(msg) actor class Counter(init : Nat) {
+  // ... msg.caller ...
+}
+

To extend this example, assume you want to restrict the +Counter actor so it can only be modified by the installer +of the Counter. To do this, you can record the principal +that installed the actor by binding it to an owner +variable. You can then check that the caller of each method is equal to +owner like this:

+
+

In this example, the assert (owner == msg.caller) +expression causes the functions inc() and +bump() to trap if the call is unauthorized, preventing any +modification of the count variable while the +read() function permits any caller.

+

The argument to shared is just a pattern, so, if you +prefer, you can also rewrite the above to use pattern matching:

+
+

:::note

+

Simple actor declarations do not let you access their installer. If +you need access to the installer of an actor, rewrite the actor +declaration as a zero-argument actor class instead.

+

:::

+

Principals support equality, ordering, and hashing, so you can +efficiently store principals in containers, for example, to maintain an +allow or deny list. More operations on principals are available in Principal base library.

+ + diff --git a/docs/html/compatibility.html b/docs/html/compatibility.html new file mode 100644 index 00000000000..b678d64b4ce --- /dev/null +++ b/docs/html/compatibility.html @@ -0,0 +1,553 @@ + + + + + + + md/compatibility.md + + + + +
+

md/compatibility.md

+
+ +

Verifying upgrade +compatibility

+

Goal: we need to verify that an upgrade can proceed without:

+
    +
  • breaking clients (due to a Candid interface change)

  • +
  • discarding Motoko stable state (due to a change in stable +declarations)

  • +
+

With Motoko, we promised to check these properties statically (before +attempting the upgrade).

+

Let’s deliver on that promise.

+

An unstable counter

+

The following is a simple example of how to declare a stateful +counter.

+
+

Unfortunately, when we upgrade this counter (say with itself), its +state is lost.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionstatesuccesscall
v00inc()
v01inc()
v02upgrade(v0)
v00inc()
v01
+

A stable counter

+

In Motoko, we can declare variables to be stable (across +upgrades).

+
+

Because it’s stable, this counter’s state +is retained across upgrades.

+

(If not marked stable, state would restart +from 0 on upgrade).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionstatesuccesscall
v10inc()
v11inc()
v12upgrade(v1)
v12inc()
v13
+

Evolving the Candid +interface:

+

Let’s extend the API - old clients still satisfied, new ones get +extra features (the read query).

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionstatesuccesscall
v13inc()
v14upgrade(v2)
v24inc()
v25read()
+

Changing the stable +interface

+

Observation: the counter is always positive - let’s refactor +Int to Nat!

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versionstatesuccesscall
v25inc()
v26upgrade(v3)
v30inc()
v31read()
+

BOOM: code upgraded, but counter is back to 0.

+

The unthinkable has happened: state was lost in an +upgrade.

+

What gives?

+

The Candid interface evolved safely …​ but the stable types did +not.

+

An upgrade must be able to:

+
    +
  • consume any stable variable value from its predecessor, +or

  • +
  • run the initializer for a new stable variable.

  • +
+

Since Int </: Nat, the upgrade logic discards the +saved Int (what if it was -1?) and re-runs the +initializer instead.

+

What’s worse, the upgrade silently "succeeded", resetting the counter +to 0.

+

Stable type signatures

+

A stable type signature looks like the "insides" of a Motoko actor +type.

+

For example, v2's stable types:

+
+

An upgrade from v2 to v3's stable +types:

+
+

requires consuming an Int as a Nat: a +type error.

+

Dual interface evolution

+

An upgrade is safe provided:

+
    +
  • the candid interface evolves to a subtype; and

  • +
  • the stable interface evolves to a compatible one (variable to +supertype or new)

  • +
+

Given version v0 with candid interface +v0.did and stable type interface v0.most:

+
+
+

And version v1 with candid interface v1.did +and stable type interface v1.most,

+
+
+

And version v2 with candid interface v2.did +and stable type interface v2.most,

+
+
+

And, finally, version v3 with candid interface +v3.did and stable type interface v3.most:

+
+
+

The following table summarizes the (in)compatibilities between +them:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
versioncandid interfacestable type interface
v0v0.didv0.most
:> ✓<<: ✓
v1v1.didv1.most
:> ✓<<: ✓
v2v2.didv2.most
:> ✓<<:
v3v3.didv3.most
+

Tooling

+

Motoko compiler (moc) now supports:

+
    +
  • moc --stable-types …​ emits stable types to a +.most file

  • +
  • moc --stable-compatible <pre> <post> +checks two .most files for upgrade compatibility

  • +
+

To upgrade from cur.wasm to nxt.wasm we +need check both Candid interface and stable variables are +"compatible"

+
didc check nxt.did cur.did  // nxt <: cur
+moc --stable-compatible cur.most nxt.most  // cur <<: nxt
+

E.g. the upgrade from v2 to v3 fails this +check:

+
> moc --stable-compatible v2.most v3.most
+(unknown location): Compatibility error [M0170], stable variable state of previous type
+  var Int
+cannot be consumed at new type
+  var Nat
+

Examples in the wild

+

A common, real-world example of an incompatible upgrade can be found +on the forum: https://forum.dfinity.org/t/questions-about-data-structures-and-migrations/822/12?u=claudio

+

In that example, a user was attempting to add a field to the record +payload of an array, by upgrading from stable type interface:

+
type Card = {
+  title : Text
+};
+actor {
+  stable var map: [(Nat32, Card)]
+}
+

to incompatible stable type interface:

+
type Card = {
+  title : Text;
+  description : Text
+};
+actor {
+  stable var map : [(Nat32, Card)]
+}
+

Adding a new record field (to magic from nothing) does not work.

+

Metadata Sections

+

Motoko embeds .did and .most files as wasm +custom sections, for use by other tools, e.g. dfx.

+

In future, dfx canister upgrade will, by default:

+
    +
  1. query the IC for a canister’s dual interfaces,

  2. +
  3. check compatibility of the installed and new binary,

  4. +
  5. abort the upgrade when unsafe.

  6. +
+

Why are we seeing +data-loss only now?

+

A side-effect of a revision to Candid (used for stabilizing +variables):

+
    +
  • Previously, upgrades from v2.wasm to +v3.wasm would fail and roll-back (no data loss).

  • +
  • Candid revision meant upgrade would now "succeed", but +with data loss.

  • +
+

("fail safe" vs "silent failure")

+

The right solution

+

What if we really do want to change state to +Nat.

+

Solution: introduce a new stable variable, newState, +initialized from the old one:

+
+
+

(Or use a variant from the start…​)

+ + diff --git a/docs/html/compiler-ref.html b/docs/html/compiler-ref.html new file mode 100644 index 00000000000..60bb61a6436 --- /dev/null +++ b/docs/html/compiler-ref.html @@ -0,0 +1,443 @@ + + + + + + + md/compiler-ref.md + + + + +
+

md/compiler-ref.md

+
+ +

Compiler reference

+

The Motoko compiler (moc) is the primary tool for +compiling Motoko programs into executable WebAssembly (Wasm) modules. +The compiler runs in the background when you build projects using the IC +SDK. If you invoke the compiler directly on the command-line, you +can press CTRL-C to exit.

+

This section provides compiler command-line reference +information.

+

moc

+

Use the Motoko compiler (moc) to compile Motoko programs +into executable WebAssembly (Wasm) modules.

+

Basic usage

+
moc [option] [file ...]
+

Options

+

You can use the following options with the moc +command.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescription
--actor-idl <idl-path>Specifies a path to actor IDL (Candid) files.
--actor-alias <alias> <principal>Specifies an actor import alias.
--args <file>Read additional newline separated command line arguments from +<file>.
--args0 <file>Read additional NUL separated command line arguments +from <file>.
-cCompile to WebAssembly.
--checkPerforms type checking only.
--compacting-gcUse compacting GC
--copying-gcUse copying GC (default)
--debugRespects debug expressions in the source (the default).
--error-detail <n>Set level of error message detail for syntax errors, n in [0..3] +(default 2).
--generational-gcUse generational GC
-help,--helpDisplays usage information.
--hide-warningsHides compiler warnings.
-WerrorTreat warnings as errors.
--incremental-gcUse incremental GC (only for beta-testing)
--idlCompile binary and emit Candid IDL specification to +.did file.
-iRuns the compiler in an interactive read–eval–print loop (REPL) +shell so you can evaluate program execution (implies -r).
--mapOutputs a JavaScript source map.
--max-stable-pages <n>Set maximum number of pages available for library +ExperimentStableMemory.mo (default 65536).
-no-system-apiDisables system API imports.
-no-timerDisables timer API imports and hides timer primitives.
-o <file>Specifies the output file.
-p <n>Sets the print depth.
--package <package-name> <package-path>Specifies a <package-name> +<package-path> pair, separated by a space.
--public-metadata <name>Emit icp custom section <name> +(candid:args or candid:service or +motoko:stable-types or motoko:compiler) as +public (default is private)
--omit-metadata <name>omit icp custom section <name> +(candid:args or candid:service or +motoko:stable-types or motoko:compiler)
--print-depsPrints the dependencies for a given source file.
-rInterprets programs.
--releaseIgnores debug expressions in the source.
--stable-typesCompile binary and emit signature of stable types to +.most file.
--stable-compatible <pre> <post>Test upgrade compatibility between stable-type signatures +<pre> and <post>.
--rts-stack-pages <n>Set maximum number of pages available for runtime system stack +(default 32).
--trap-on-call-errorTrap, don't throw an Error, when an IC call fails due +to destination queue full or freezing threshold is crossed.
Emulates behaviour of moc versions < 0.8.0.
-tActivates tracing in interpreter.
-vGenerates verbose output.
--versionDisplays version information.
-wasi-system-apiUses the WASI system API (wasmtime).
+ + diff --git a/docs/html/control-flow.html b/docs/html/control-flow.html new file mode 100644 index 00000000000..eaf05602446 --- /dev/null +++ b/docs/html/control-flow.html @@ -0,0 +1,490 @@ + + + + + + + md/control-flow.md + + + + +
+

md/control-flow.md

+
+ +

Imperative control flow

+

There are two key categories of control flow:

+
    +
  • declarative, when the structure of some value guides +control and the selection of the next expression to evaluate, like in +if and switch expressions;

  • +
  • imperative where control changes abruptly according to a +programmer’s command, abondoning regular control flow; examples are +break and continue, but also +return and throw.

  • +
+

Imperative control flow often goes hand-in-hand with state changes +and other flavors of side-effects, such as error handling and +input/output.

+

Early return from +func

+

Normally, the result of a function is the value of its body. +Sometimes, during evaluation of the body, the result is available before +the end of evaluation. In such situations the +return <exp> construct can be used to abandon the +rest of the computation and immediately exit the function with a result. +Similarly, where permitted, throw may be used to abandon a +computation with an error.

+

When a function has unit result type, the shorthand +return may be used instead of the equivalent +return ().

+

Loops and labels

+

Motoko provides several kinds of repetition constructs, +including:

+
    +
  • for expressions for iterating over members of +structured data.

  • +
  • loop expressions for programmatic repetition +(optionally with termination condition).

  • +
  • while loops for programmatic repetition with entry +condition.

  • +
+

Any of these can be prefixed with a label <name> +qualifier to give the loop a symbolic name. Named loops are useful for +imperatively changing control flow to continue from the entry or exit of +the named loop.

+
    +
  • re-entering the loop with continue <name>, +or

  • +
  • exiting the loop altogether with +break <name>.

  • +
+

In the following example, the for expression loops over +characters of some text and abandons iteration as soon as an exclamation +sign is encountered.

+
import Debug "mo:base/Debug";
+label letters for (c in "ran!!dom".chars()) {
+  Debug.print(debug_show(c));
+  if (c == '!') { break letters };
+  // ...
+}
+

Labeled expressions

+

There are two other facets to label​s that are less +mainstream, but come in handy in certain situations:

+
    +
  • label​s can be typed

  • +
  • any expression (not just loops) can be named by +prefixing it with a label; break allows one to +short-circuit the expression’s evaluation by providing an immediate +value for its result. (This is similar to exiting a function early using +return, but without the overhead of declaring and calling a +function.)

  • +
+

The syntax for type-annotated labels is +label <name> : <type> <expr>, signifying +that any expression can be exited using a +break <name> <alt-expr> construct that returns +the value of <alt-expr> as the value of +<expr>, short-circuiting evaluation of +<expr>.

+

Judicious use of these constructs allows the programmer to focus on +the primary program logic and handle exceptional case via +break

+
import Text "mo:base/Text";
+import Iter "mo:base/Iter";
+
+type Host = Text;
+let formInput = "us@dfn";
+
+let address = label exit : ?(Text, Host) {
+  let splitted = Text.split(formInput, #char '@');
+  let array = Iter.toArray<Text>(splitted);
+  if (array.size() != 2) { break exit(null) };
+  let account = array[0];
+  let host = array[1];
+  // if (not (parseHost(host))) { break exit(null) };
+  ?(account, host)
+}
+

Naturally, labeled common expressions don’t allow +continue. In terms of typing, both +<expr> and <alt-expr>​'s types must +conform with the label’s declared <type>. If a label +is only given a <name>, then its +<type> defaults to unit (()). Similarly +a break without an <alt-expr> is +shorthand for the value unit (()).

+

Option blocks and null +breaks

+

Like many other high-level languages, Motoko lets you opt in to +null values, tracking possible occurences of +null values using option types of the form ?T. +This is to both to encourage you to avoid using null values +when possible, and to consider the possibility of null +values when necessary.

+

The latter could be cumbersome, if the only way to test a value for +null were with a verbose switch expression, +but Motoko simplifies the handling of option types with some dedicated +syntax: option blocks and null breaks.

+

The option block, do ? <block>, produces a value +of type ?T, when block <block> has type +T and, importantly, introduces the possibility of a break +from <block>. Within a +do ? <block>, the null break +<exp> !, tests whether the result of the expression, +<exp>, of unrelated option type, ?U, is +null. If the result <exp> is +null, control immediately exits the +do ? <block> with value null. Otherwise, +the result of <exp> must be an option value +?v, and evaluation of <exp> ! proceeds +with its contents, v (of type U).

+

As realistic example, we give the definition of a simple function +evaluating numeric Expressions built from +natural numbers, division and a zero test, encoded as a variant +type:

+ + +
+

To guard against division by 0 without trapping, the +eval function returns an option result, using +null to indicate failure.

+

Each recursive call is checked for null using +!, immediately exiting the outer do ? block, +and thus the function itself, with null, when a result is +null.

+

(As an exercise that illustrates the concision of option blocks, you +might want to try rewriting eval using a labeled expression +and explicit switches for each null break.)

+

Repetition with loop

+

The simplest way to indefinitely repeat a sequence of imperative +expressions is by using a loop construct

+
loop { <expr1>; <expr2>; ... }
+

The loop can only be abandoned with a return or +break construct.

+

A re-entry condition can be affixed to allow a conditional repetition +of the loop with loop <body> while <cond>.

+

The body of such a loop is always executed at least once.

+

while loops with +precondition

+

Sometimes an entry condition is needed to guard the first execution +of a loop. For this kind of repetition the +while <cond> <body>-flavor is available

+
while (earned < need) { earned += earn() };
+

Unlike a loop, the body of a while loop may +never be executed.

+

for loops for +iteration

+

An iteration over elements of some homogeneous collection can be +performed using a for loop. The values are drawn from an +iterator and bound to the loop pattern in turn.

+
let carsInStock = [
+  ("Buick", 2020, 23.000),
+  ("Toyota", 2019, 17.500),
+  ("Audi", 2020, 34.900)
+];
+var inventory : { var value : Float } = { var value = 0.0 };
+for ((model, year, price) in carsInStock.vals()) {
+  inventory.value += price;
+};
+inventory
+

Using range with a +for loop

+

The range function produces an iterator (of type +Iter<Nat>) with the given lower and upper bound, +inclusive.

+

The following loop example prints the numbers 0 through +10 over its eleven iterations:

+
import Iter "mo:base/Iter";
+import Debug "mo:base/Debug";
+var i = 0;
+for (j in Iter.range(0, 10)) {
+  Debug.print(debug_show(j));
+  assert(j == i);
+  i += 1;
+};
+assert(i == 11);
+

More generally, the function range is a +class that constructs iterators over sequences of natural +numbers. Each such iterator has type Iter<Nat>.

+

As a constructor function, range has a function +type:

+
(lower : Nat, upper : Int) -> Iter<Nat>
+

Where Iter<Nat> is an iterator object type with a +next method that produces optional elements, each of type +?Nat:

+
type Iter<A> = {next : () -> ?A};
+

For each invocation, next returns an optional element +(of type ?Nat).

+

The value null indicates that the iteration sequence has +terminated.

+

Until reaching null, each non-null value, +of the form ?n for some number n, +contains the next successive element in the iteration sequence.

+

Using revRange

+

Like range, the function revRange is a +class that constructs iterators (each of type +Iter<Int>). As a constructor function, it has a +function type:

+
(upper : Int, lower : Int) -> Iter<Int>
+

Unlike range, the revRange function +descends in its iteration sequence, from an initial +upper bound to a final lower bound.

+

Using iterators of +specific data structures

+

Many built-in data structures come with pre-defined iterators. Below +table lists them

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameIteratorElementsElement type
[T]array of T​svalsthe array’s membersT
[T]array of T​skeysthe array’s valid indicesNat
[var T]mutable array of T​svalsthe array’s membersT
[var T]mutable array of T​skeysthe array’s valid indicesNat
Texttextcharsthe text’s charactersChar
Blobblobvalsthe blob’s bytesNat8
+

Iterators for data structures

+

User-defined data structures can define their own iterators. As long +they conform with the Iter<A> type for some element +type A, these behave like the built-in ones and can be +consumed with ordinary for-loops.

+ + diff --git a/docs/html/cycles.html b/docs/html/cycles.html new file mode 100644 index 00000000000..879f9bcf873 --- /dev/null +++ b/docs/html/cycles.html @@ -0,0 +1,369 @@ + + + + + + + md/cycles.md + + + + +
+

md/cycles.md

+
+ +

Managing cycles

+

Usage of the Internet Computer is measured, and paid for, in +cycles. The Internet Computer maintains a balance of cycles per +canister smart contract. In addition, cycles can be transferred between +canisters.

+

In Motoko programs targeting the Internet Computer, each actor +represents an Internet Computer canister, and has an associated balance +of cycles. The ownership of cycles can be transferred between actors. +Cycles are selectively sent and received through messages, that is, +shared function calls. A caller can choose to transfer cycles with a +call, and a callee can choose to accept cycles that are made available +by the caller. Unless explicitly instructed, no cycles are transferred +by callers or accepted by callees.

+

Callees can accept all, some or none of the available cycles up to +limit determined by their actor’s current balance. Any remaining cycles +are refunded to the caller. If a call traps, all its accompanying cycles +are automatically refunded to the caller, without loss.

+

In future, we may see Motoko adopt dedicated syntax and types to +support safer programming with cycles. For now, we provide a temporary +way to manage cycles through a low-level imperative API provided by the +ExperimentalCycles library in +package base.

+

:::note

+

This library is subject to change and likely to be replaced by more +high-level support for cycles in later versions of Motoko.

+

:::

+

The +ExperimentalCycles Library

+

The ExperimentalCycles library provides imperative +operations for observing an actor’s current balance of cycles, +transferring cycles and observing refunds.

+

The library provides the following operations:

+
func balance() : (amount : Nat)
+
+func available() : (amount : Nat)
+
+func accept(amount : Nat) : (accepted : Nat)
+
+func add(amount : Nat) : ()
+
+func refunded() : (amount : Nat)
+

Function balance() returns the actor’s current balance +of cycles as amount. Function balance() is +stateful and may return different values after calls to +accept(n), calling a function after adding +cycles, or resuming from await (reflecting a refund).

+

:::danger

+

Since cycles measure computational resources spent, the value of +balance() generally decreases from one shared function call +to the next.

+

:::

+

Function available(), returns the currently available +amount of cycles. This is the amount received from the +current caller, minus the cumulative amount accepted so far +by this call. On exit from the current shared function or +async expression via return or +throw any remaining available amount is automatically +refunded to the caller.

+

Function accept transfers amount from +available() to balance(). It returns the +amount actually transferred, which may be less than requested, for +example, if less is available, or if canister balance limits are +reached.

+

Function add(amount) indicates the additional amount of +cycles to be transferred in the next remote call, i.e. evaluation of a +shared function call or async expression. Upon the call, +but not before, the total amount of units added since the +last call is deducted from balance(). If this total exceeds +balance(), the caller traps, aborting the call.

+

:::note

+

the implicit register of added amounts, incremented on each +add, is reset to zero on entry to a shared function, and +after each shared function call or on resume from an await.

+

:::

+

Function refunded() reports the amount of +cycles refunded in the last await of the current context, +or zero if no await has occurred yet. Calling refunded() is +solely informational and does not affect balance(). +Instead, refunds are automatically added to the current balance, whether +or not refunded is used to observe them.

+

Example

+

To illustrate, we will now use the ExperimentalCycles +library to implement a toy piggy bank for saving cycles.

+

Our piggy bank has an implicit owner, a benefit callback +and a fixed capacity, all supplied at time of construction. +The callback is used to transfer withdrawn amounts.

+
+

The owner of the bank is identified with the (implicit) caller of +constructor PiggyBank(), using the shared pattern, +shared(msg). Field msg.caller is a +Principal and is stored in private variable +owner (for future reference). See Principals and caller identification for more +explanation of this syntax.

+

The piggy bank is initially empty, with zero current +savings.

+

Only calls from owner may:

+
    +
  • query the current savings of the piggy bank +(function getSavings()), or

  • +
  • withdraw amounts from the savings (function +withdraw(amount)).

  • +
+

The restriction on the caller is enforced by the statements +assert (msg.caller == owner), whose failure causes the +enclosing function to trap, without revealing the balance or moving any +cycles.

+

Any caller may deposit an amount of cycles, provided the +savings will not exceed capacity, breaking the piggy bank. +Because the deposit function only accepts a portion of the available +amount, a caller whose deposit exceeds the limit will receive an +implicit refund of any unaccepted cycles. Refunds are automatic and +ensured by the Internet Computer infrastructure.

+

Since transfer of cycles is one-directional (from caller to callee), +retrieving cycles requires the use of an explicit callback (the +benefit function, taken by the constructor as an argument). +Here, benefit is called by the withdraw +function, but only after authenticating the caller as +owner. Invoking benefit in +withdraw inverts the caller/caller relationship, allowing +cycles to flow "upstream".

+

Note that the owner of the PiggyBank could, in fact, +supply a callback that rewards a beneficiary distinct from +owner.

+

Here’s how an owner, Alice, might use an instance of +PiggyBank:

+
+

Let’s dissect Alice's code.

+

Alice imports the PiggyBank actor class as +a library, so she can create a new PiggyBank actor on +demand.

+

Most of the action occurs in Alice's test() +function:

+

Alice dedicates 10_000_000_000_000 of her own cycles for +running the piggy bank, by calling +Cycles.add(10_000_000_000_000) just before creating a new +instance, porky, of the PiggyBank, passing +callback Alice.credit and capacity +(1_000_000_000). Passing Alice.credit +nominates Alice as the beneficiary of withdrawals. The +10_000_000_000_000 cycles, minus a small installation fee, +are credited to porky's balance without any further action +by porky initialization code. You can think of this as an +electric piggy bank, that consumes its own resources as its used. Since +constructing a PiggyBank is asynchronous, +Alice needs to await the result.

+

After creating porky, she first verifies that the +porky.getSavings() is zero using an +assert.

+

Alice dedicates 1_000_000 of her cycles +(Cycles.add(1_000_000)) to transfer to porky +with the next call to porky.deposit(). The cycles are only +consumed from Alice’s balance if the call to +porky.deposit() succeeds (which it should).

+

Alice now withdraws half the amount, +500_000, and verifies that porky's savings +have halved. Alice eventually receives the cycles via a +callback to Alice.credit(), initiated in +porky.withdraw(). Note the received cycles are precisely +the cycles added in porky.withdraw(), before +it invokes its benefit callback, that is, +Alice.credit.

+

Alice withdraws another 500_000 cycles to +wipe out her savings.

+

Alice vainly tries to deposit 2_000_000_000 +cycles into porky but this exceeds porky's +capacity by half, so porky accepts +1_000_000_000 and refunds the remaining +1_000_000_000 to Alice. Alice +verifies the refund amount (Cycles.refunded()), which has +(already) been automatically restored to her balance. She also verifies +porky's adjusted savings.

+

Alice's credit() function simply accepts +all available cycles by calling Cycles.accept(available), +checking the actually accepted amount with an assert.

+

:::note

+

For this example, Alice is using her (readily available) cycles, that +she already owns.

+

:::

+

:::danger

+

Because porky consumes cycles in its operation, it is +possible for porky to spend some or even all of Alice’s +cycle savings before she has a chance to retrieve them.

+

:::

+ + diff --git a/docs/html/errors.html b/docs/html/errors.html new file mode 100644 index 00000000000..69da4b5d69c --- /dev/null +++ b/docs/html/errors.html @@ -0,0 +1,368 @@ + + + + + + + md/errors.md + + + + +
+

md/errors.md

+
+ +

Errors and Options

+

There are three primary ways to represent and handle errors values in +Motoko:

+
    +
  • Option values (with a non-informative null indicated +some error);

  • +
  • Result variants (with a descriptive +#err value providing more information about the error); +and

  • +
  • Error values (that, in an asynchronous context, can +be thrown and caught - similar to exceptions - and contain a numeric +code and message).

  • +
+

Our Example API

+

Let’s assume we’re building an API for a Todo application and want to +expose a function that lets a user mark one of their Todo’s as +Done. To keep it simple we’ll accept a +TodoId and return an Int that represents how +many seconds the Todo has been open. We’re also assuming we’re running +in our own actor so we return an async value. If nothing would ever go +wrong that would leave us with the following API:

+
func markDone(id : TodoId) : async Int
+

The full definition of all types and helpers we’ll use in this +document is included for reference:

+
+
+

When things go wrong

+

We now realize that there are conditions under which marking a Todo +as done fails.

+
    +
  • The id could reference a non-existing Todo

  • +
  • The Todo might already be marked as done

  • +
+

We’ll now talk about the different ways to communicate these errors +in Motoko and slowly improve our solution.

+

What error type to prefer

+

How not to do things

+

One particularly easy and bad way of reporting errors is +through the use of a sentinel value. For example, for our +markDone function we might decide to use the value +-1 to signal that something failed. The callsite then has +to check the return value against this special value and report the +error. But it’s way too easy to not check for that error condition and +continue to work with that value in our code. This can lead to delayed +or even missing error detection and is strongly discouraged.

+

Definition:

+
+

Callsite:

+
+

Prefer +Option/Result over Exceptions where possible

+

Using Option or Result is the preferred way +of signaling errors in Motoko. They work in both synchronous and +asynchronous contexts and make your APIs safer to use (by encouraging +clients to consider the error cases as well as the success cases. +Exceptions should only be used to signal unexpected error states.

+

Error reporting with Option

+

A function that wants to return a value of type A or +signal an error can return a value of option type +?A and use the null value to designate the +error. In our example this means having our markDone +function return an async ?Seconds.

+

Here’s what that looks like for our markDone +function:

+

Definition:

+
+

Callsite:

+
+

The main drawback of this approach is that it conflates all possible +errors with a single, non-informative null value. Our +callsite might be interested in why marking a Todo as done +has failed, but that information is lost by then, which means we can +only tell the user that "Something went wrong.". Returning +option values to signal errors should only be used if there just one +possible reason for the failure, and that reason can be easily +determined at the callsite. One example of a good usecase for this is a +HashMap lookup failing.

+

Error reporting with +Result types

+

To address the shortcomings of using option types to signal errors +we’ll now look at the richer Result type. While options are +a built-in type, the Result is defined as a variant type +like so:

+
type Result<Ok, Err> = { #ok : Ok; #err : Err }
+

Because of the second type parameter, Err, the +Result type lets us select the type we use to describe +errors. So we’ll define a TodoError type our +markDone function will use to signal errors.

+
+

This lets us now write the third version of +markDone:

+

Definition:

+
+

Callsite:

+
+

And as we can see we can now give the user a useful error +message.

+

Working with Option/Result

+

Options and Resultss are a different way of +thinking about errors, especially if you come from a language with +pervasive exceptions. In this chapter we’ll look at the different ways +to create, destructure, convert, and combine Options and +Results in different ways.

+

Pattern matching

+

The first and most common way of working with Option and +Result is to use 'pattern matching'. If we have a value of +type ?Text we can use the switch keyword to +access the potential Text contents:

+
+

The important thing to understand here is that Motoko does not let +you access the optional value without also considering the case that it +is missing.

+

In the case of a Result we can also use pattern +matching, with the difference that we also get an informative value (not +just null) in the #err case.

+
+

Higher-Order functions

+

Pattern matching can become tedious and verbose, especially when +dealing with multiple optional values. The base library exposes a +collection of higher-order functions from the Optional and +Result modules to improve the ergonomics of error +handling.

+

Converting back +and forth between Option/Result

+

Sometimes you’ll want to move between Options and Results. A Hashmap +lookup returns null on failure and that’s fine, but maybe +the caller has more context and can turn that lookup failure into a +meaningful Result. At other times you don’t need the +additional information a Result provides and just want to +convert all #err cases into null. For these +situations base +provides the fromOption and toOption functions +in the Result module.

+

Asynchronous Errors

+

The last way of dealing with errors in Motoko is to use asynchronous +Error handling, a restricted form of the exception handling +familiar from other languages. Unlike the exceptions of other languages, +Motoko errors values, can only be thrown and caught in +asynchronous contexts, typically the body of a shared +function or async expression. Non-shared +functions cannot employ structured error handling. This means you can +exit a shared function by throwing an Error +value and try some code calling a shared function on +another actor, catching its failure as a result of type +Error, but you can’t use these error handling constructs in +regular code, outside of an asynchronous context.

+

Asynchronous Errors should generally only be used to +signal unexpected failures that you cannot recover from, and that you +don’t expect many consumers of your API to handle. If a failure should +be handled by your caller you should make it explicit in your signature +by returning a Result instead. For completeness here is the +markDone example with exceptions:

+

Definition:

+
+

Callsite:

+
+ + diff --git a/docs/html/extrastuff.html b/docs/html/extrastuff.html new file mode 100644 index 00000000000..d1669d94b97 --- /dev/null +++ b/docs/html/extrastuff.html @@ -0,0 +1,230 @@ + + + + + + + md/extrastuff.md + + + + +
+

md/extrastuff.md

+
+ +

Why +develop applications to run on the internet computer?

+

Motoko provides:

+
    +
  • A high-level language for programming applications to run on the +Internet Computer blockchain network.

  • +
  • A simple design that uses familiar syntax that is easy for +programmers to learn.

  • +
  • An actor-based programming model optimized for +efficient message handling.

  • +
  • An interpreter and compiler that you can use to test and compile +the WebAssembly code for autonomous applications.

  • +
  • Support for features not-yet implemented that anticipate future +extensions and improvement to WebAssembly.

  • +
+

Why a new language?

+

The Internet Computer provides a blockchain network that can support +programs written in different languages. The only requirement is that +the program must support compilation to WebAssembly code. WebAssembly +(commonly-abbreviated as Wasm) is a low-level computer instruction +format for virtual machines. Because WebAssembly code is designed to +provide portable low-level instructions that enable applications to be +deployed on many platforms such as the web, it is a natural fit for +deploying applications that are intended to run on the Internet +Computer. However, most of the higher-level languages - like C, C, and +Rust - that support compiling to WebAssembly are either too unsafe (for +example, C or C) or too complex (for example, Rust) for developers who +want to deliver secure applications without a long learning curve.

+

To address the need for correctness without complexity, DFINITY has +designed its own Motoko programming language. +Motoko provides a simple and expressive alternative to +other programming languages that is easy to learn whether you are a new +or experienced programmer.

+

Support for other languages

+

WebAssembly is language-agnostic. It does not require a high-level +type system for language inter-operation. Although Motoko is +specifically designed to compile to WebAssembly and make it easy to +write programs to run on the internet computer, it is just one of many +languages you can eventually use to develop applications for the +Internet Computer blockchain network.

+

To support multiple languages and typed, cross-language +communication, DFINITY also provides an Interface Definition +Language (IDL). The Motoko compiler automates the production +and consumption of IDL files using the type signatures in Motoko +programs and the structure of imported IDL interfaces.

+

For information about the Interface Definition +Language interfaces, see XXX.

+ + diff --git a/docs/html/heartbeats.html b/docs/html/heartbeats.html new file mode 100644 index 00000000000..3561dd85340 --- /dev/null +++ b/docs/html/heartbeats.html @@ -0,0 +1,200 @@ + + + + + + + md/heartbeats.md + + + + +
+

md/heartbeats.md

+
+ +

Heartbeats

+

Internet Computer canisters can elect to receive regular heartbeat +messages by exposing a particular canister_heartbeat +function (see heartbeat).

+

In Motoko, an actor can receive heartbeat messages by declaring a +system function, named heartbeat, with no +arguments, returning a future of unit type (async ()).

+

A simple, contrived example is a recurrent alarm, that sends a +message to itself every n-th heartbeat:

+
+

The heartbeat function, when declared, is called on +every Internet Computer subnet heartbeat, by scheduling an +asynchronous call to the heartbeat function. Due to its +async return type, a heartbeat function may send further +messages and await results. The result of a heartbeat call, including +any trap or thrown error, is ignored. The implicit context switch +inherent to calling every Motoko async function, means that the time the +heartbeat body is executed may be later than the time the +heartbeat was issued by the subnet.

+

As an async function, Alarm's +heartbeat function is free to call other asynchronous +functions (the inner call to ring() above is an example), +as well as shared functions of other canisters.

+ + diff --git a/docs/html/language-manual.html b/docs/html/language-manual.html new file mode 100644 index 00000000000..84dc1ae8199 --- /dev/null +++ b/docs/html/language-manual.html @@ -0,0 +1,4193 @@ + + + + + + + md/language-manual.md + + + + +
+

md/language-manual.md

+
+ +

Language quick reference

+ + +

This section serves as a technical reference for the previous +chapters and has specific technical information for readers with +specific interests. For example, this section provides technical details +of interest to the following audiences:

+
    +
  • Authors providing the higher-level documentation about the Motoko +programming language.

  • +
  • Compiler experts interested in the details of Motoko and its +compiler.

  • +
  • Advanced programmers who want to learn more about the lower-level +details of Motoko.

  • +
+

The language quick reference is intended to provide complete +reference information about Motoko, but this section does not +provide explanatory text or usage information. Therefore, this section +is typically not suitable for readers who are new to programming +languages or who are looking for a general introduction to using +Motoko.

+

Throughout, we use the term canister to refer to an Internet Computer +canister smart contract.

+

Basic language syntax

+

This section describes the basic language conventions you need to +know for programming in Motoko.

+

Whitespace

+

Space, newline, horizontal tab, carriage return, line feed and form +feed are considered as whitespace. Whitespace is ignored but used to +separate adjacent keywords, identifiers and operators.

+

In the definition of some lexemes, the quick reference uses the +symbol to denote a single whitespace character.

+

Comments

+

Single line comments are all characters following // +until the end of the same line.

+
// single line comment
+x = 1
+

Single or multi-line comments are any sequence of characters +delimited by /* and */:

+
/* multi-line comments
+   look like this, as in C and friends */
+

Comments delimited by /* and */ may be +nested, provided the nesting is well-bracketed.

+
/// I'm a documentation comment
+/// for a function
+

Documentation comments start with /// followed by a +space until the end of line, and get attached to the definition +immediately following them.

+

Deprecation comments start with /// @deprecated followed +by a space until the end of line, and get attached to the definition +immediately following them. They are only recognized in front of +public declarations.

+

All comments are treated as whitespace.

+

Keywords

+

The following keywords are reserved and may not be used as +identifiers:

+

+actor and assert async async* await await* break case catch class
+composite continue debug debug_show do else flexible false for
+from_candid func if ignore import in module not null object or label
+let loop private public query return shared stable switch system throw
+to_candid true try type var while with
+

Identifiers

+

Identifiers are alpha-numeric, start with a letter and may contain +underscores:

+
<id>   ::= Letter (Letter | Digit | _)*
+Letter ::= A..Z | a..z
+Digit  ::= 0..9
+

Integers

+

Integers are written as decimal or hexadecimal, +Ox-prefixed natural numbers. Subsequent digits may be +prefixed a single, semantically irrelevant, underscore.

+
digit ::= ['0'-'9']
+hexdigit ::= ['0'-'9''a'-'f''A'-'F']
+num ::= digit ('_'? digit)*
+hexnum ::= hexdigit ('_'? hexdigit)*
+nat ::= num | "0x" hexnum
+

Negative integers may be constructed by applying a prefix negation +- operation.

+

Floats

+

Floating point literals are written in decimal or +Ox-prefixed hexadecimal scientific notation.

+
let frac = num
+let hexfrac = hexnum
+let float =
+    num '.' frac?
+  | num ('.' frac?)? ('e' | 'E') sign? num
+  | "0x" hexnum '.' hexfrac?
+  | "0x" hexnum ('.' hexfrac?)? ('p' | 'P') sign? num
+

The 'e' (or 'E') prefixes a base 10, decimal exponent; 'p' (or 'P') +prefixes a base 2, binary exponent. In both cases, the exponent is in +decimal notation.

+

:::note

+

the use of decimal notation, even for the base 2 exponent, is in +keeping with the established hexadecimal floating point literal syntax +of the C language.

+

:::

+

Characters

+

A character is a single quote (') delimited:

+
    +
  • Unicode character in UTF-8,

  • +
  • \-escaped newline, carriage return, tab, single or +double quotation mark

  • +
  • \-prefixed ASCII character (TBR),

  • +
  • or \u{ hexnum } enclosed valid, escaped +Unicode character in hexadecimal (TBR).

  • +
+
ascii ::= ['\x00'-'\x7f']
+ascii_no_nl ::= ['\x00'-'\x09''\x0b'-'\x7f']
+utf8cont ::= ['\x80'-'\xbf']
+utf8enc ::=
+    ['\xc2'-'\xdf'] utf8cont
+  | ['\xe0'] ['\xa0'-'\xbf'] utf8cont
+  | ['\xed'] ['\x80'-'\x9f'] utf8cont
+  | ['\xe1'-'\xec''\xee'-'\xef'] utf8cont utf8cont
+  | ['\xf0'] ['\x90'-'\xbf'] utf8cont utf8cont
+  | ['\xf4'] ['\x80'-'\x8f'] utf8cont utf8cont
+  | ['\xf1'-'\xf3'] utf8cont utf8cont utf8cont
+utf8 ::= ascii | utf8enc
+utf8_no_nl ::= ascii_no_nl | utf8enc
+
+escape ::= ['n''r''t''\\''\'''\"']
+
+character ::=
+  | [^'"''\\''\x00'-'\x1f''\x7f'-'\xff']
+  | utf8enc
+  | '\\'escape
+  | '\\'hexdigit hexdigit
+  | "\\u{" hexnum '}'
+  | '\n'        // literal newline
+
+char := '\'' character '\''
+

Text

+

A text literal is "-delimited sequence of +characters:

+
text ::= '"' character* '"'
+

Note that a text literal may span multiple lines.

+

Literals

+
<lit> ::=                                     literals
+  <nat>                                         natural
+  <float>                                       float
+  <char>                                        character
+  <text>                                        Unicode text
+

Literals are constant values. The syntactic validity of a literal +depends on the precision of the type at which it is used.

+

Operators and types

+

To simplify the presentation of available operators, operators and +primitive types are classified into basic categories:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AbbreviationCategorySupported opertions
AArithmeticarithmetic operations
LLogicallogical/Boolean operations
BBitwisebitwise and wrapping operations
OOrderedcomparison
TTextconcatenation
+

Some types have several categories. For example, type +Int is both arithmetic (A) and ordered (O) and supports +both arithmetic addition (+) and relational less than +(<) (amongst other operations).

+

Unary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + +
<unop>Category
-Anumeric negation
+Anumeric identity
^Bbitwise negation
+

Relational operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<relop>Category
==equals
!=not equals
␣<␣Oless than (must be enclosed in whitespace)
␣>␣Ogreater than (must be enclosed in whitespace)
<=Oless than or equal
>=Ogreater than or equal
+

Note that equality (==) and inequality (!=) +do not have categories. Instead, equality and inequality are applicable +to arguments of all shared types, including non-primitive, +compound types such as immutable arrays, records, and variants.

+

Equality and inequality are structural and based on the observable +content of their operands (as determined by their static type).

+

Numeric binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<binop>Category
+Aaddition
-Asubtraction
*Amultiplication
/Adivision
%Amodulo
**Aexponentiation
+

Bitwise and wrapping +binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<binop>Category
&Bbitwise and
|Bbitwise or
^Bexclusive or
<<Bshift left
␣>>Bshift right (must be preceded by whitespace)
<<>Brotate left
<>>Brotate right
+%Aaddition (wrap-on-overflow)
-%Asubtraction (wrap-on-overflow)
*%Amultiplication (wrap-on-overflow)
**%Aexponentiation (wrap-on-overflow)
+

Text operators

+ + + + + + + + + + + + + + + +
<binop>Category
#Tconcatenation
+

Assignment operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:=, <unop>=, +<binop>=Category
:=*assignment (in place update)
+=Ain place add
-=Ain place subtract
*=Ain place multiply
/=Ain place divide
%=Ain place modulo
**=Ain place exponentiation
&=Bin place logical and
|=Bin place logical or
^=Bin place exclusive or
<<=Bin place shift left
>>=Bin place shift right
<<>=Bin place rotate left
<>>=Bin place rotate right
+%=Bin place add (wrap-on-overflow)
-%=Bin place subtract (wrap-on-overflow)
*%=Bin place multiply (wrap-on-overflow)
**%=Bin place exponentiation (wrap-on-overflow)
#=Tin place concatenation
+

The category of a compound assignment +<unop>=/<binop>= is given by the +category of the operator +<unop>/<binop>.

+

Operator and keyword +precedence

+

The following table defines the relative precedence and associativity +of operators and tokens, ordered from lowest to highest precedence. +Tokens on the same line have equal precedence with the indicated +associativity.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PrecedenceAssociativityToken
LOWESTnoneif _ _ (no else), loop _ (no +while)
(higher)noneelse, while
(higher)right:=, +=, -=, *=, +/=, %=, **=, #=, +&=, |=, ^=, +<<=, >>=, +<<>=, <>>=, ++%=, -%=, *%=, +**%=
(higher)left:
(higher)left`
(higher)leftor
(higher)leftand
(higher)none==, !=, <, +>, <=, >, +>=
(higher)left+, -, #, +%, +-%
(higher)left*, /, %, *%
(higher)left|
(higher)left&
(higher)left^
(higher)none<<, >>, +<<>, <>>
HIGHESTleft**, **%
+

Programs

+

The syntax of a program <prog> is as +follows:

+
<prog> ::=             programs
+  <imp>;* <dec>;*
+

A program is a sequence of imports <imp>;* +followed by a sequence of declarations <dec>;* that +ends with an optional actor or actor class declaration. The actor or +actor class declaration determines the main actor, if any, of the +program.

+

For now, compiled programs must obey the following additional +restrictions (not imposed on interpreted programs):

+
    +
  • a shared function can only appear as a public field +of an actor or actor class;

  • +
  • a program may contain at most one actor or actor class +declaration, i.e. the final main actor or actor class; and

  • +
  • any main actor class declaration should be anonymous; if +named, the class name should not be used as a value within the class and +will be reported as an unavailable identifier.

  • +
+

The last two restrictions are designed to forbid programmatic actor +class recursion, pending compiler support.

+

Note that the parameters (if any) of an actor class must have shared +type (see Sharability). The parameters of a +program’s final actor class provide access to the corresponding canister +installation argument(s); the Candid type of this argument is determined +by the Candid projection of the Motoko type of the class parameter.

+

Imports

+

The syntax of an import <imp> is as +follows:

+
<imp> ::=                           imports
+  import <pat> =? <url>
+
+<url> ::=
+  "<filepath>"                      import module from relative <filepath>.mo
+  "mo:<package-name>/<filepath>"    import module from package
+  "canister:<canisterid>"           import external actor by <canisterid>
+  "canister:<name>"                 import external actor by <name>
+

An import introduces a resource referring to a local source module, +module from a package of modules, or canister (imported as an actor). +The contents of the resource are bound to <pat>.

+

Though typically a simple identifier, <id>, +<pat> can also be any composite pattern binding +selective components of the resource.

+

The pattern must be irrefutable.

+

Libraries

+

The syntax of a library (that can be referenced in an +import) is as follows:

+
<lib> ::=                                               library
+  <imp>;* module <id>? <obj-body>                         module
+  <imp>;* <shared-pat>? actor class                       actor class
+    <id> <typ-params>? <pat> (: <typ>)? <class-body>
+

A library <lib> is a sequence of imports +<imp>;* followed by:

+
    +
  • a named or anonymous (module) declaration; or

  • +
  • a named actor class declaration.

  • +
+

Libraries stored in .mo files may be referenced by +import declarations.

+

In a module library, the optional name <id>? is +only significant within the library and does not determine the name of +the library when imported. Instead, the imported name of a library is +determined by the import declaration, giving clients of the +library the freedom to choose library names (e.g. to avoid clashes).

+

An actor class library, because it defines both a type constructor +and a function with name <id>, is imported as a +module defining both a type and a function named +<id>. The name <id> is mandatory +and cannot be omitted. An actor class constructor is always +asynchronous, with return type async T where T +is the inferred type of the class body. Because actor construction is +asynchronous, an instance of an imported actor class can only be created +in an asynchronous context (i.e. in the body of a +(non-query) shared function, asynchronous +function, async expression or async* +expression).

+

Declaration syntax

+

The syntax of a declaration is as follows:

+
<dec> ::=                                                               declaration
+  <exp>                                                                  expression
+  let <pat> = <exp>                                                      immutable, trap on match failure
+  let <pat> = <exp> else <block-or-exp>                                  immutable, handle match failure
+  var <id> (: <typ>)? = <exp>                                            mutable
+  <sort> <id>? =? <obj-body>                                             object
+  <shared-pat>? func <id>? <typ-params>? <pat> (: <typ>)? =? <exp>       function
+  type <id> <typ-params>? = <typ>                                        type
+  <shared-pat>? <sort>? class                                            class
+    <id>? <typ-params>? <pat> (: <typ>)? <class-body>
+
+<obj-body> ::=           object body
+  { <dec-field>;* }       field declarations
+
+<class-body> ::=         class body
+  = <id>? <obj-body>     object body, optionally binding <id> to 'this' instance
+  <obj-body>             object body
+

The syntax of a shared function qualifier with call-context pattern +is as follows:

+
<query> ::=
+ composite? query
+
+<shared-pat> ::=
+  shared <query>? <pat>?
+

For <shared-pat>, an absent +<pat>? is shorthand for the wildcard pattern +_.

+
<dec-field> ::=                                object declaration fields
+  <vis>? <stab>? <dec>                           field
+
+<vis> ::=                                      field visibility
+  public
+  private
+  system
+
+<stab> ::=                                     field stability (actor only)
+  stable
+  flexible
+

The visibility qualifier <vis>? +determines the accessibility of every field <id> +declared by <dec>:

+
    +
  • An absent <vis>? qualifier defaults to +private visibility.

  • +
  • Visibility private restricts access to +<id> to the enclosing object, module or +actor.

  • +
  • Visibility public extends private with +external access to <id> using the dot notation +<exp>.<id>.

  • +
  • Visibility system extends private with +access by the run-time system.

  • +
  • Visibility system may only appear on +func declarations that are actor fields, and must +not appear anywhere else.

  • +
+

The stability qualifier <stab> determines +the upgrade behaviour of actor fields:

+
    +
  • A stability qualifier should appear on let +and var declarations that are actor fields. An absent +stability qualifier defaults to flexible.

  • +
  • <stab> qualifiers must not appear on fields of +objects or modules.

  • +
  • The pattern in a +stable let <pat> = <exp> declaration must be +simple where, a pattern pat is simple if it +(recursively) consists of

    +
      +
    • a variable pattern <id>, or

    • +
    • an annotated simple pattern +<pat> : <typ>, or

    • +
    • a parenthesized simple pattern +( <pat> ).

    • +
  • +
+

Expression syntax

+

The syntax of an expression is as follows:

+
<exp> ::=                                      expressions
+  <id>                                           variable
+  <lit>                                          literal
+  <unop> <exp>                                   unary operator
+  <exp> <binop> <exp>                            binary operator
+  <exp> <relop> <exp>                            binary relational operator
+  _                                              placeholder expression
+  <exp> |> <exp>                                 pipe operator
+  ( <exp>,* )                                    tuple
+  <exp> . <nat>                                  tuple projection
+  ? <exp>                                        option injection
+  { <exp-field>;* }                              object
+  { <exp> (and <exp>)* (with <exp-field>;+)? }   object combination/extension
+  # id <exp>?                                    variant injection
+  <exp> . <id>                                   object projection/member access
+  <exp> := <exp>                                 assignment
+  <unop>= <exp>                                  unary update
+  <exp> <binop>= <exp>                           binary update
+  [ var? <exp>,* ]                               array
+  <exp> [ <exp> ]                                array indexing
+  <shared-pat>? func <func_exp>                  function expression
+  <exp> <typ-args>? <exp>                        function call
+  not <exp>                                      negation
+  <exp> and <exp>                                conjunction
+  <exp> or <exp>                                 disjunction
+  if <exp> <block-or-exp> (else <block-or-exp>)? conditional
+  switch <exp> { (case <pat> <block-or-exp>;)+ } switch
+  while <exp> <block-or-exp>                     while loop
+  loop <block-or-exp> (while <exp>)?             loop
+  for ( <pat> in <exp> ) <block-or-exp>          iteration
+  label <id> (: <typ>)? <block-or-exp>           label
+  break <id> <exp>?                              break
+  continue <id>                                  continue
+  return <exp>?                                  return
+  async <block-or-exp>                           async expression
+  await <block-or-exp>                           await future (only in async)
+  async* <block-or-exp>                          delay an asynchronous computation
+  await* <block-or-exp>                          await a delayed computation (only in async)
+  throw <exp>                                    raise an error (only in async)
+  try <block-or-exp> catch <pat> <block-or-exp>  catch an error (only in async)
+  assert <block-or-exp>                          assertion
+  <exp> : <typ>                                  type annotation
+  <dec>                                          declaration
+  ignore <block-or-exp>                          ignore value
+  do <block>                                     block as expression
+  do ? <block>                                   option block
+  <exp> !                                        null break
+  debug <block-or-exp>                           debug expression
+  actor <exp>                                    actor reference
+  to_candid ( <exp>,* )                          Candid serialization
+  from_candid <exp>                              Candid deserialization
+  (system <exp> . <id>)                          System actor class constructor
+  ( <exp> )                                      parentheses
+
+<block-or-exp> ::=
+  <block>
+  <exp>
+
+<block> ::=
+  { <dec>;* }
+

Patterns

+

The syntax of a pattern is as follows:

+
<pat> ::=                                      patterns
+  _                                              wildcard
+  <id>                                           variable
+  <unop>? <lit>                                  literal
+  ( <pat>,* )                                    tuple or brackets
+  { <pat-field>;* }                              object pattern
+  # <id> <pat>?                                  variant pattern
+  ? <pat>                                        option
+  <pat> : <typ>                                  type annotation
+  <pat> or <pat>                                 disjunctive pattern
+
+<pat-field> ::=                                object pattern fields
+  <id> (: <typ>) = <pat>                         field
+  <id> (: <typ>)                                 punned field
+

Type syntax

+

Type expressions are used to specify the types of arguments, +constraints (a.k.a bounds) on type parameters, definitions of type +constructors, and the types of sub-expressions in type annotations.

+
<typ> ::=                                     type expressions
+  <path> <typ-args>?                            constructor
+  <sort>? { <typ-field>;* }                     object
+  { <typ-tag>;* }                               variant
+  { # }                                         empty variant
+  [ var? <typ> ]                                array
+  Null                                          null type
+  ? <typ>                                       option
+  <shared>? <typ-params>? <typ> -> <typ>        function
+  async <typ>                                   future
+  async* <typ>                                  delayed, asynchronous computation
+  ( ((<id> :)? <typ>),* )                       tuple
+  Any                                           top
+  None                                          bottom
+  <typ> and <typ>                               intersection
+  <typ> or <typ>                                union
+  Error                                         errors/exceptions
+  ( <typ> )                                      parenthesized type
+
+<sort> ::= (actor | module | object)
+
+<shared> ::=                                 shared function type qualifier
+  shared <query>?
+
+<path> ::=                                   paths
+  <id>                                         type identifier
+  <path> . <id>                                projection
+

An absent <sort>? abbreviates +object.

+

Primitive types

+

Motoko provides the following primitive type identifiers, including +support for Booleans, signed and unsigned integers and machine words of +various sizes, characters and text.

+

The category of a type determines the operators (unary, binary, +relational and in-place update via assignment) applicable to values of +that type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierCategoryDescription
BoolLBoolean values true and false and logical +operators
CharOUnicode characters
TextT, OUnicode strings of characters with concatenation _ # _ +and iteration
FloatA, O64-bit floating point values
IntA, Osigned integer values with arithmetic (unbounded)
Int8A, Osigned 8-bit integer values with checked arithmetic
Int16A, Osigned 16-bit integer values with checked arithmetic
Int32A, Osigned 32-bit integer values with checked arithmetic
Int64A, Osigned 64-bit integer values with checked arithmetic
NatA, Onon-negative integer values with arithmetic (unbounded)
Nat8A, Onon-negative 8-bit integer values with checked arithmetic
Nat16A, Onon-negative 16-bit integer values with checked arithmetic
Nat32A, Onon-negative 32-bit integer values with checked arithmetic
Nat64A, Onon-negative 64-bit integer values with checked arithmetic
BlobObinary blobs with iterators
PrincipalOprincipals
Error(opaque) error values
+

Although many of these types have linguistic support for literals and +operators, each primitive type also has an eponymous base library +providing related functions and values (see Motoko Base Library). For example, the Text library provides common +functions on Text values.

+

Type Bool

+

The type Bool of category L (Logical) has values +true and false and is supported by one and two +branch if _ <exp> (else <exp>)?, +not <exp>, _ and _ and +_ or _ expressions. Expressions if, +and and or are short-circuiting.

+ + +

Type Char

+

A Char of category O (Ordered) represents a character as +a code point in the Unicode character set.

+

Base library function Char.toNat32(c) converts a +Char value, c to its Nat32 code +point. Function Char.fromNat32(n) converts a +Nat32 value, n, in the range +0x0..xD7FF or 0xE000..0x10FFFF of valid code points to +its Char value; this conversion traps on invalid arguments. +Function Char.toText(c) converts the Char +c into the corresponding, single character +Text value.

+

Type Text

+

The type Text of categories T and O (Text, Ordered) +represents sequences of Unicode characters (i.e. strings). Function +t.size returns the number of characters in +Text value t. Operations on text values +include concatenation (_ # _) and sequential iteration over +characters via t.chars as in +for (c : Char in t.chars()) { …​ c …​ }.

+ + +

Type Float

+

The type Float represents 64-bit floating point values +of categories A (Arithmetic) and O (Ordered).

+

The semantics of Float and its operations is in +accordance with standard IEEE 754-2019 +(See References).

+

Common functions and values are defined in base library +"base/Float".

+

Types Int and +Nat

+

The types Int and Nat are signed integral +and natural numbers of categories A (Arithmetic) and O (Ordered).

+

Both Int and Nat are arbitrary precision, +with only subtraction - on Nat trapping on +underflow.

+

The subtype relation Nat <: Int holds, so every +expression of type Nat is also an expression of type +Int (but not vice versa). In particular, every +value of type Nat is also a value of type Int, +without change of representation.

+

Bounded integers +Int8, Int16, Int32 and +Int64

+

The types Int8, Int16, Int32 +and Int64 represent signed integers with respectively 8, +16, 32 and 64 bit precision. All have categories A (Arithmetic), B +(Bitwise) and O (Ordered).

+

Operations that may under- or overflow the representation are checked +and trap on error.

+

The operations +%, -%, *% and +**% provide access to wrap-around, modular arithmetic.

+

As bitwise types, these types support bitwise operations and +(&), or (|) and +exclusive-or (^). Further, they can be rotated +left (<<>), right (<>>), and +shifted left (<<), right (>>). The +right-shift preserves the two’s-complement sign. All shift and rotate +amounts are considered modulo the numbers’s bit width n.

+

Bounded integer types are not in subtype relationship with each other +or with other arithmetic types, and their literals need type annotation +if the type cannot be inferred from context, e.g. +(-42 : Int16).

+

The corresponding module in the base library provides conversion +functions: Conversion to Int, checked and wrapping +conversions from Int and wrapping conversion to the bounded +natural type of the same size.

+

Bounded naturals +Nat8, Nat16, Nat32 and +Nat64

+

The types Nat8, Nat16, Nat32 +and Nat64 represent unsigned integers with respectively 8, +16, 32 and 64 bit precision. All have categories A (Arithmetic), B +(Bitwise) and O (Ordered).

+

Operations that may under- or overflow the representation are checked +and trap on error.

+

The operations +%, -%, *% and +**% provide access to the modular, wrap-on-overflow +operations.

+

As bitwise types, these types support bitwise operations and +(&), or (|) and +exclusive-or (^). Further, they can be rotated +left (<<>), right (<>>), and +shifted left (<<), right (>>). The +right-shift is logical. All shift and rotate amounts are considered +modulo the number’s bit width n.

+

The corresponding module in the base library provides conversion +functions: Conversion to Int, checked and wrapping +conversions from Int and wrapping conversion to the bounded +natural type of the same size.

+

Type Blob

+

The type Blob of category O (Ordered) represents binary +blobs or sequences of bytes. Function b.size returns the +number of characters in Blob value b. +Operations on blob values include sequential iteration over bytes via +function b.vals as in +for (v : Nat8 in b.vals()) { …​ v …​ }.

+

Type Principal

+

The type Principal of category O (Ordered) represents +opaque principals such as canisters and users that can, for example, be +used to identify callers of shared functions and used for simple +authentication. Although opaque, principals may be converted to binary +Blob values for more efficient hashing and other +applications (see module Principal from the base +library).

+

Error type

+

Assuming base library import,

+
import E "mo:base/Error";
+

Errors are opaque values constructed and examined with +operations:

+
    +
  • E.reject : Text -> Error

  • +
  • E.code : Error -> E.ErrorCode

  • +
  • E.message : Error -> Text

  • +
+

Type E.ErrorCode is equivalent to variant type:

+
type ErrorCode = {
+  // Fatal error.
+  #system_fatal;
+  // Transient error.
+  #system_transient;
+  // Destination invalid.
+  #destination_invalid;
+  // Explicit reject by canister code.
+  #canister_reject;
+  // Canister trapped.
+  #canister_error;
+  // Future error code (with unrecognized numeric code).
+  #future : Nat32;
+  // Error issuing inter-canister call
+  // (indicating destination queue full or freezing threshold crossed).
+  #call_error : { err_code : Nat32 }
+};
+

A constructed error e = E.reject(t) has +E.code(e) = #canister_reject and +E.message(e) = t.

+

Error values can be thrown and caught within an +async expression or shared function (only). +See Throw and Try.

+

Errors with codes other than #canister_reject (i.e. +system errors) may be caught and thrown, but not +user-constructed.

+

:::note

+

Exiting an async block or shared function with a +non-#canister-reject system error exits with a copy of the +error with revised code #canister_reject and the original +Text message. This prevents programmatic forgery of system +errors.

+

:::

+

:::note

+

On the Internet Computer, the act of issuing a call to a canister +function can fail, so that the call cannot (and will not be) performed. +This can happen due to a lack of canister resources, typically because +the local message queue for the destination canister is full, or because +performing the call would reduce the current cycle balance of the +calling canister to a level below its freezing threshold. Such call +failures are reported by throwing an Error with code +#call_error { err_code = n }, where n is the +non-zero err_code value returned by the Internet Computer. +Like other errors, call errors can be caught and handled using +try ... catch ... expressions, if desired.

+

:::

+

Constructed types

+

<path> <typ-args>? is the application of a +type identifier or path, either built-in (i.e. Int) or user +defined, to zero or more type arguments. The type +arguments must satisfy the bounds, if any, expected by the type +constructor’s type parameters (see Well-formed types).

+

Though typically a type identifier, more generally, +<path> may be a .-separated sequence of +actor, object or module identifiers ending in an identifier accessing a +type component of a value (for example, +Acme.Collections.List).

+

Object types

+

<sort>? { <typ-field>;* } specifies an +object type by listing its zero or more named type fields.

+

Within an object type, the names of fields must be distinct (both by +name and hash value).

+

Object types that differ only in the ordering of the fields are +equivalent.

+

When <sort>? is actor, all fields +have shared function type (specifying messages).

+

Variant types

+

{ <typ-tag>;* } specifies a variant type by +listing its variant type fields as a sequence of +<typ-tag>s.

+

Within a variant type, the tags of its variants must be distinct +(both by name and hash value).

+

Variant types that differ only in the ordering of their variant type +fields are equivalent.

+

{ # } specifies the empty variant type.

+

Array types

+

[ var? <typ> ] specifies the type of arrays with +elements of type <typ>.

+

Arrays are immutable unless specified with qualifier +var.

+

Null type

+

The Null type has a single value, the literal +null. Null is a subtype of the option +? T, for any type T.

+

Option types

+

? <typ> specifies the type of values that are +either null or a proper value of the form +? <v> where <v> has type +<typ>.

+

Function types

+

Type +<shared>? <typ-params>? <typ1> -> <typ2> +specifies the type of functions that consume (optional) type parameters +<typ-params>, consume a value parameter of type +<typ1> and produce a result of type +<typ2>.

+

Both <typ1> and <typ2> may +reference type parameters declared in +<typ-params>.

+

If <typ1> or <typ2> (or both) +is a tuple type, then the length of that tuple type determines the +argument or result arity of the function type.

+

The optional <shared> qualifier specifies whether +the function value is shared, which further constrains the form of +<typ-params>, <typ1> and +<typ2> (see Sharability +below).

+

(Note that a <shared> function may itself be +shared or shared query or +shared composite query, determining the persistence of its +state changes.)

+

Async types

+

async <typ> specifies a future producing a value +of type <typ>.

+

Future types typically appear as the result type of a +shared function that produces an await-able +value.

+

Async* types

+

async* <typ> specifies a delayed, asynchronous +computation producing a value of type <typ>.

+

Computation types typically appear as the result type of a +local function that produces an await*-able +value.

+

(They cannot be used as the return types of shared +functions.)

+

Tuple types

+

( ((<id> :)? <typ>),* ) specifies the type +of a tuple with zero or more ordered components.

+

The optional identifier <id>, naming its +components, is for documentation purposes only and cannot be used for +component access. In particular, tuple types that differ only in the +names of components are equivalent.

+

The empty tuple type () is called the unit +type.

+

Any type

+

Type Any is the top type, i.e. the super-type +of all types. All values have type Any.

+

None type

+

Type None is the bottom type, a subtype of all +other types. No value has type None.

+

As an empty type, None can be used to specify the +impossible return value of an infinite loop or unconditional trap.

+

Intersection type

+

The type expression <typ1> and <typ2> +denotes the syntactic intersection between its two type +operands, that is, the greatest type that is a subtype of both. If both +types are incompatible, the intersection is None.

+

The intersection is syntactic, in that it does not consider +possible instantiations of type variables. The intersection of two type +variables is None, unless they are equal, or one is +declared to be a (direct or indirect) subtype of the other.

+

Union type

+

The type expression <typ1> or <typ2> denotes +the syntactic union between its two type operands, that is, the +smallest type that is a supertype of both. If both types are +incompatible, the union is Any.

+

The union is syntactic, in that it does not consider +possible instantiations of type variables. The union of two type +variables is the union of their bounds, unless the variables are equal, +or one is declared to be a (direct or indirect) subtype of the +other.

+

Parenthesized type

+

A function that takes an immediate, syntactic tuple of length n +>= 0 as its domain or range is a function that takes +(respectively returns) n values.

+

When enclosing the argument or result type of a function, which is +itself a tuple type, ( <tuple-typ> ) declares that +the function takes or returns a single (boxed) value of type +<tuple-type>.

+

In all other positions, ( <typ> ) has the same +meaning as <typ>.

+

Type fields

+
<typ-field> ::=                               object type fields
+  <id> : <typ>                                  immutable value
+  var <id> : <typ>                              mutable value
+  <id> <typ-params>? <typ1> : <typ2>            function value (short-hand)
+  type <id> <typ-params>? = <typ>               type component
+

A type field specifies the name and type of a value field of an +object, or the name and definition of a type component of an object. The +value field names within a single object type must be distinct and have +non-colliding hashes. The type component names within a single object +type must also be distinct and have non-colliding hashes. Value fields +and type components reside in separate name spaces and thus may have +names in common.

+

<id> : <typ> specifies an immutable +field, named <id> of type +<typ>.

+

var <id> : <typ> specifies a +mutable field, named <id> of type +<typ>.

+

type <id> <typ-params>? = <typ> +specifies a type component, with field name +<id>, abbreviating (parameterized) type +<typ>.

+

Unlike type declarations, a type component is not, in itself, +recursive (though it may abbreviate an existing recursive type). In +particular, the name <id> is not bound in +<typ> nor in any other fields of the enclosing object +type. The name <id> only determines the label to use +when accessing the definition through a record of this type (using the +dot notation).

+

Variant type fields

+
<typ-tag> ::=                                 variant type fields
+  # <id> : <typ>                                tag
+  # <id>                                        unit tag (short-hand)
+

A variant type field specifies the tag and type of a single variant +of an enclosing variant type. The tags within a single variant type must +be distinct and have non-colliding hashes.

+

# <id> : <typ> specifies an (immutable) +field, named <id> of type <typ>. +# <id> is sugar for an (immutable) field, named +<id> of type ().

+

Sugar

+

When enclosed by an actor object type, +<id> <typ-params>? <typ1> : <typ2> +is syntactic sugar for an immutable field named <id> +of shared function type +shared <typ-params>? <typ1> → <typ2>.

+

When enclosed by a non-actor object type, +<id> <typ-params>? <typ1> : <typ2> +is syntactic sugar for an immutable field named <id> +of ordinary function type +<typ-params>? <typ1> → <typ2>.

+

Type parameters

+
<typ-params> ::=                              type parameters
+  < typ-param,* >
+<typ-param>
+  <id> <: <typ>                               constrained type parameter
+  <id>                                        unconstrained type parameter
+

A type constructors, function value or function type may be +parameterised by a vector of comma-separated, optionally constrained, +type parameters.

+

<id> <: <typ> declares a type parameter +with constraint <typ>. Any instantiation of +<id> must subtype <typ> (at that +same instantiation).

+

Syntactic sugar <id> declares a type parameter +with implicit, trivial constraint Any.

+

The names of type parameters in a vector must be distinct.

+

All type parameters declared in a vector are in scope within its +bounds.

+

Type arguments

+
<typ-args> ::=                                type arguments
+  < <typ>,* >
+

Type constructors and functions may take type arguments.

+

The number of type arguments must agree with the number of declared +type parameters of the type constructor.

+

For a function, the number of type arguments, when provided, must +agree with the number of declared type parameters of the function’s +type. Note that type arguments in function applications can typically be +omitted and inferred by the compiler.

+

Given a vector of type arguments instantiating a vector of type +parameters, each type argument must satisfy the instantiated bounds of +the corresponding type parameter.

+

Well-formed types

+

A type T is well-formed only if (recursively) its +constituent types are well-formed, and:

+
    +
  • if T is async U or +async* U then U is shared, and

  • +
  • if T is +shared <query>? U -> V:

    +
      +
    • U is shared and,
    • +
    • V == () and <query>? is absent, +or
    • +
    • V == async W with W shared, and
    • +
  • +
  • if T is C<T0, …​, Tn> where:

    +
      +
    • a declaration +type C<X0 <: U0, Xn <: Un> = …​ is in scope, +and

    • +
    • Ti <: Ui[ T0/X0, …​, Tn/Xn ], for each +0 <= i <= n.

    • +
  • +
  • if T is actor { …​ } then all fields in +…​ are immutable and have shared function +type.

  • +
+

Subtyping

+

Two types T, U are related by subtyping, +written T <: U, whenever, one of the following +conditions is true:

+
    +
  • T equals U (reflexivity).

  • +
  • U equals Any.

  • +
  • T equals None.

  • +
  • T is a type parameter X declared with +constraint U.

  • +
  • T is Nat and U is +Int.

  • +
  • T is a tuple (T0, …​, Tn), +U is a tuple (U0, …​, Un), and for each +0 <= i <= n, Ti <: Ui.

  • +
  • T is an immutable array type [ V ], +U is an immutable array type [ W ] and +V <: W.

  • +
  • T is a mutable array type [ var V ], +U is a mutable array type [ var W ] and +V == W.

  • +
  • T is Null and U is an +option type ? W for some W.

  • +
  • T is ? V, U is +? W and V <: W.

  • +
  • T is a future async V, U +is a future async W, and V <: W.

  • +
  • T is an object type +<sort0> { fts0 }, U is an object type +<sort1> { fts1 } and

    +
      +
    • <sort0> == <sort1>, and, +for all fields,

    • +
    • if field id : W is in fts1 then +id : V is in fts0 and V <: W, +and

    • +
    • if mutable field var id : W is in fts1 +then var id : V is in fts0 and +V == W.

      +

      (That is, object type T is a subtype of object type +U if they have same sort, every mutable field in +U super-types the same field in T and every +mutable field in U is mutable in T with an +equivalent type. In particular, T may specify more fields +than U. Note that this clause defines subtyping for all +sorts of object type, whether module, object +or actor.)

    • +
  • +
  • T is a variant type { fts0 }, +U is a variant type { fts1 } and

    +
      +
    • if field # id : V is in fts0 then +# id : W is in fts1 and +V <: W.

      +

      (That is, variant type T is a subtype of variant type +U if every field of T subtypes the same field +of U. In particular, T may specify fewer +variants than U.)

    • +
  • +
  • T is a function type +<shared>? <X0 <: V0, ..., Xn <: Vn> T1 -> T2, +U is a function type +<shared>? <X0 <: W0, ..., Xn <: Wn> U1 -> U2 +and

    +
      +
    • T and U are either both equivalently +<shared>?, and

    • +
    • assuming constraints X0 <: W0, …​, Xn <: Wn +then

      +
        +
      • for all i, Wi == Vi, and

      • +
      • U1 <: T1, and

      • +
      • T2 <: U2.

        +

        (That is, function type T is a subtype of function type +U if they have same <shared>? +qualification, they have the same type parameters (modulo renaming) and +assuming the bounds in U, every bound in T +supertypes the corresponding parameter bound in U +(contra-variance), the domain of T supertypes the domain of +U (contra-variance) and the range of T +subtypes the range of U (co-variance).)

      • +
    • +
  • +
  • T (respectively U) is a constructed +type C<V0, …​, Vn> that is equal, by definition of +type constructor C, to W, and +W <: U (respectively U <: W).

  • +
  • For some type V, T <: V and +V <: U (transitivity).

  • +
+

Sharability

+

A type T is shared if it is

+
    +
  • Any or None, or

  • +
  • a primitive type other than Error, or

  • +
  • an option type ? V where V is shared, +or

  • +
  • a tuple type (T0, …​, Tn) where all Ti +are shared, or

  • +
  • an immutable array type [V] where V is +shared, or

  • +
  • an object type where all fields are immutable and +have shared type, or

  • +
  • a variant type where all tags have shared type, or

  • +
  • a shared function type, or

  • +
  • an actor type.

  • +
+

Stability

+

Stability extends sharability to include mutable types. More +precisely:

+

A type T is stable if it is

+
    +
  • Any or None, or

  • +
  • a primitive type other than Error, or

  • +
  • an option type ? V where V is stable, +or

  • +
  • a tuple type (T0, …​, Tn) where all Ti +are stable, or

  • +
  • a (mutable or immutable) array type [var? V] where +V is stable, or

  • +
  • an object type where all fields have stable type, +or

  • +
  • a variant type where all tags have stable type, or

  • +
  • a shared function type, or

  • +
  • an actor type.

  • +
+

This definition implies that every shared type is a stable type. The +converse does not hold: there are types that are stable but not shared +(notably types with mutable components).

+

The types of actor fields declared with the stable +qualifier must have stable type.

+

The (current) value of such a field is preserved upon +upgrade, whereas the values of other fields are reinitialized +after an upgrade.

+

Static and dynamic semantics

+

Below, we give a detailed account of the semantics of Motoko +programs.

+

For each expression form and each declaration form, we summarize its +semantics, both in static terms (based on typing) and dynamic terms +(based on program evaluation).

+

Programs

+

A program <imp>;* <dec>;* has type +T provided:

+
    +
  • <dec>;* has type T under the static +environment induced by the imports in <imp>;*.
  • +
+

All type and value declarations within <dec>;* are +mutually-recursive.

+

A program evaluates by (transitively) evaluating the imports, binding +their values to the identifiers in <imp>;* and then +evaluating the sequence of declarations in +<dec>;*.

+

Libraries

+

Restrictions on the syntactic form of modules means that libraries +can have no side-effects.

+

The imports of a library are local and not re-exported in its +interface.

+

Multiple imports of the same library can be safely deduplicated +without loss of side-effects.

+

Module libraries

+

A library +<imp>;* module <id>? <obj-body> is a +sequence of imports <import>;* followed by a single +module declaration.

+

A library has module type T provided

+
    +
  • module <id>? <obj-body> has (module) type +T under the static environment induced by the imports in +<import>;*.
  • +
+

A module library evaluates by (transitively) evaluating its imports, +binding their values to the identifiers in <imp>;* +and then evaluating +module <id>? <obj-body>.

+

Actor class libraries

+

The actor class library <imp>;* <dec> where +<dec> is of the form +<shared-pat>? actor class <id> <typ-params>? <pat> (: <typ>)? <class-body> +has type:

+
module {
+  type <id> = T;
+  <id> : (U1,...,Un) -> async T
+}
+

provided that:

+
    +
  • the actor class declaration <dec> has function +type (U1, ...​, Un) -> async T under the static +environment induced by the imports in +<import>;*.
  • +
+

Notice that the imported type of the function <id> +must be asynchronous.

+

An actor class library evaluates by (transitively) evaluating its +imports, binding their values to the identifiers in +<imp>;*, and evaluating the (derived) module:

+
module {
+  <dec>
+}
+

On the Internet Computer, if this library is imported as identifier +Lib, then calling +await Lib.<id>(<exp1>, ..., <expn>), +installs a fresh instance of the actor class as an isolated IC canister, +passing the values of <exp1>, ...​, +<expn> as installation arguments, and returns a +reference to a (remote) actor of type +Lib.<id>, that is, T. Installation is +(necessarily) asynchronous.

+

Actor class management

+

On the Internet Computer, the primary constructor of an imported +actor class always creates a new principal and installs a fresh instance +of the class as the code for that principal. While that is one way to +install a canister on the IC, it is not the only way.

+

To provide further control over the installation of actor classes, +Motoko endows each imported actor class with an extra, secondary +constructor, for use on the Internet Computer. This constructor takes an +additional first argument that tailors the installation. The constructor +is only available via special syntax that stresses its +system functionality.

+

Given some actor class constructor:

+
Lib.<id> : (U1, ...​, Un) -> async T
+

Its secondary constructor is accessed as +(system Lib.<id>) with typing:

+
(system Lib.<id>) :
+  { #new : CanisterSettings;
+    #install : Principal;
+    #reinstall : actor {} ;
+    #upgrade : actor {} }  ->
+    (U1, ...​, Un) -> async T
+

where

+
  type CanisterSettings = {
+     settings : ?{
+        controllers : ?[Principal];
+        compute_allocation : ?Nat;
+        memory_allocation : ?Nat;
+        freezing_threshold : ?Nat;
+     }
+  }
+

Calling +(system Lib.<id>)(<exp>)(<exp1>, ...​, <expn>) +uses the first argument <exp>, a variant value, to +control the installation of the canister further. Arguments +(<exp1>, ..., <expn>) are just the +user-declared constructor arguments of types U1, ..., Un +that would also be passed to the primary constructor.

+

If <exp> is

+
    +
  • #new s, where s has type +CanisterSettings: the call creates a fresh Internet +Computer principal p, with settings s, and +installs the instance to principal p.
  • +
  • #install p, where p has type +Principal, the call installs the actor to an already +created Internet Computer principal p. The principal must +be empty (have no previously installed code) or the call will return an +error.
  • +
  • #upgrade a, where a has type (or +supertype) actor {}, the call installs the instance as an +upgrade of actor a, using its current stable +storage to initialize stable variables and stable memory of the new +instance.
  • +
  • #reinstall a, where a has type (or +supertype) actor {}, reinstalls the instance over the +existing actor a, discarding its stable variables and +stable memory.
  • +
+

:::note

+

On the Internet Computer, calling the primary constructor +Lib.<id> is equivalent to calling the secondary +constructor (system Lib.<id>) with argument +(#new {settings = null}) (i.e. using default settings).

+

:::

+

:::note

+

On the Internet Computer, calls to Lib.<id> and +(system Lib.<id>)(#new ...) must be provisioned with +enough cycles for the creation of a new principal. Other call variants +will use the cycles of the already allocated principal or actor.

+

:::

+

:::danger

+

The use of #upgrade a may be unsafe. Motoko will +currently not verify that the upgrade is compatible with the code +currently installed at a. (A future extension may verify +compatibilty with a dynamic check.)

+

The use of #reinstall a may be unsafe. Motoko cannot +verify that the reinstall is compatible with the code currently +installed in actor a (even with a dynamic check). A change +in interface may break any existing clients of a. The +current state of a will be lost.

+

:::

+

Imports and Urls

+

An import import <pat> =? <url> declares a +pattern <pat> bound to the contents of the text +literal <url>.

+

<url> is a text literal that designates some +resource: a local library specified with a relative path, a named module +from a named package, or an external canister, referenced either by +numeric canister id or by a named alias, and imported as a Motoko +actor.

+

In detail, if <url> is of the form:

+
    +
  • "<filepath>" then <pat> is +bound to the library module defined in file +<filepath>.mo. <filepath> is +interpreted relative to the absolute location of the enclosing file. +Note the .mo extension is implicit and should not +be included in <url>. For example, +import U "lib/Util" defines U to reference the +module in local file ./lib/Util.

  • +
  • "mo:<package-name>/<path>" then +<pat> is bound to the library module defined in file +<package-path>/<path>.mo in directory +<package-path> referenced by package alias +<package-name>. The mapping from +<package-name> to <package-path> +is determined by a compiler command-line argument +--package <package-name> <package-path>. For +example, import L "mo:base/List" defines L to +reference the List library in package alias +base.

  • +
  • "ic:<canisterid>" then +<pat> is bound to a Motoko actor whose Motoko type is +determined by the canister’s IDL interface. The IDL interface of +canister <canisterid> must be found in file +<actorpath>/<canisterid>.did. The compiler +assumes that <actorpath> is specified by command line +argument --actor-idl <actorpath> and that file +<actorpath>/<canisterid>.did exists. For +example, import C "ic:lg264-qjkae" defines C +to reference the actor with canister id lg264-qjkae and IDL +file lg264-qjkae.did.

  • +
  • "canister:<name>" is a symbolic reference to +canister alias <name>. The compiler assumes that the +mapping of <name> to <canisterid> +is specified by command line argument +--actor-alias <name> ic:<canisterid>. If so, +"canister:<name>" is equivalent to +"ic:<cansterid>" (see above). For example, +import C "canister:counter" defines C to +reference the actor otherwise known as counter.

  • +
+

The case sensitivity of file references depends on the host operating +system so it is recommended not to distinguish resources by filename +casing alone.

+

(Remark: when building multi-canister projects with the IC +SDK, Motoko programs can typically import canisters by alias (e.g. +import C "canister:counter"), without specifying low-level +canister ids (e.g. import C "ic:lg264-qjkae"). The SDK +tooling takes care of supplying the appropriate command-line arguments +to the Motoko compiler.)

+

(Remark: sensible choices for <pat> are +identifiers, such as Array, or object patterns like +{ cons; nil = empty }, which allow selective importing of +individual fields, under original or other names.)

+

Declaration fields

+

A declaration field +<vis>? <stab>? <dec> defines zero or more +fields of an actor or object, according to the set of variables defined +by <dec>.

+

Any identifier bound by a public declaration appears in +the type of enclosing object, module or actor and is accessible via the +dot notation.

+

An identifier bound by a private or system +declaration is excluded from the type of the enclosing object, module or +actor and thus inaccessible.

+

The declaration field has type T provided:

+
    +
  • <dec> has type T;

  • +
  • if <stab>? is stable then +T must be a stable type (see Stability).

  • +
+

(Actor fields declared flexible (implicitly or +explicitly) can have any type, but will not be preserved across +upgrades.)

+

Sequences of declaration fields are evaluated in order by evaluating +their constituent declarations, with the following exception:

+

During an upgrade only, the value of a stable +declaration is obtained as follows:

+
    +
  • if the stable declaration was previously declared stable in the +retired actor, its initial value is inherited from the retired +actor.

  • +
  • if the stable declaration was not declared stable in the retired +actor, and is thus new, its value is obtained by evaluating +<dec>.

  • +
+

For an upgrade to be safe:

+
    +
  • every stable identifier declared with type T in the +retired actor and declared stable and of type U in the +replacement actor, must satisfy T <: U.
  • +
+

This condition ensures that every stable variable is either fresh, +requiring initialization, or its value can be safely inherited from the +retired actor. Note that stable variables may be removed across +upgrades, or may simply be deprecated by an upgrade to type +Any.

+

System fields

+

The declaration <dec> of a system +field must be a manifest func declaration with one of the +following names and types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nametypedescription
heartbeat() -> async ()heartbeat action
timer(Nat64 -> ()) -> async ()timer action
inspect{ caller : Principal; msg : <Variant>; arg : Blob } -> Boolmessage predicate
preupgrade() -> ()pre upgrade action
postupgrade() -> ()post upgrade action
+
    +
  • heartbeat, when declared, is called on every +Internet Computer subnet heartbeat, scheduling an +asynchronous call to the heartbeat function. Due to its +async return type, a heartbeat function may send messages +and await results. The result of a heartbeat call, including any trap or +thrown error, is ignored. The implicit context switch means that the +time the heartbeat body is executed may be later than the time the +heartbeat was issued by the subnet.

  • +
  • timer, when declared, is called as a response of the +canister global timer's expiration. The canister's global timer can be +manipulated with the passed-in function argument of type +Nat64 -> () (taking an absolute time in nanoseconds) +upon which libraries can build their own abstractions. When not declared +(and in absence of the -no-timer flag), this system action +is provided with default implementation by the compiler (additionally +setTimer and cancelTimer are available as +primitives).

  • +
  • inspect, when declared, is called as a predicate on +every Internet Computer ingress message (with the exception of HTTP +query calls). The return value, a Bool, indicates whether +to accept or decline the given message. The argument type depends on the +interface of the enclosing actor (see Inspect).

  • +
  • preupgrade, when declared, is called during an +upgrade, immediately before the (current) values of the +(retired) actor’s stable variables are transferred to the replacement +actor.

  • +
  • postupgrade, when declared, is called during an +upgrade, immediately after the (replacement) actor body has +initialized its fields (inheriting values of the retired actors' stable +variables), and before its first message is processed.

  • +
+

These preupgrade and postupgrade system +methods provide the opportunity to save and restore in-flight data +structures (e.g. caches) that are better represented using non-stable +types.

+

During an upgrade, a trap occurring in the implicit call to +preupgrade() or postupgrade() causes the +entire upgrade to trap, preserving the pre-upgrade actor.

+
inspect
+

Given a record of message attributes, this function produces a +Bool that indicates whether to accept or decline the +message by returning true or false. The +function is invoked (by the system) on each ingress message issue as an +Internet Computer update call (i.e. excluding non-replicated +query calls). Similar to a query, any side-effects of an invocation are +transient and discarded. A call that traps due to some fault has the +same result as returning false (message denial).

+

The argument type of inspect depends on the interface of +the enclosing actor. In particular, the formal argument of +inspect is a record of fields of the following types:

+
    +
  • caller : Principal: the principal, possibly +anonymous, of the caller of the message;

  • +
  • arg : Blob: the raw, binary content of the message +argument;

  • +
  • msg : <variant>: a variant of +decoding functions, where +<variant> == {…​; #<id>: () → T; …​} contains one +variant per shared or shared query function, +<id>, of the actor. The variant’s tag identifies the +function to be called; The variant’s argument is a function that, when +applied, returns the (decoded) argument of the call as a value of type +T.

  • +
+

Using a variant, tagged with #<id>, allows the +return type, T, of the decoding function to vary with the +argument type (also T) of the shared function +<id>.

+

The variant’s argument is a function so that one can avoid the +expense of message decoding (when appropriate).

+

:::danger

+

An actor that fails to declare system field inspect will +simply accept all ingress messages.

+

:::

+

:::note

+

Any shared composite query function in the interface is +not included in <variant> since, unlike a +shared query, it can only be invoked as a non-replicated +query call, never as an update call.

+

:::

+

Sequence of declarations

+

A sequence of declarations <dec>;* occurring in a +block, a program or embedded in the <dec-field>;* +sequence of an object body has type T provided:

+
    +
  • <dec>;* is empty and T == (); +or

  • +
  • <dec>;* is non-empty and:

  • +
  • all value identifiers bound by <dec>;* are +distinct, and

  • +
  • all type identifiers bound by <dec>;* are +distinct, and

  • +
  • under the assumption that each value identifier +<id> in <dec>;* has type +var_id? Tid, and assuming the type definitions in +<dec>;*:

  • +
  • each declaration in <dec>;* is well-typed, +and

  • +
  • each value identifier <id> in bindings +produced by <dec>;* has type +var_id? Tid, and

  • +
  • all but the last <dec> in +<dec>;* of the form <exp> has type +();

  • +
  • the last declaration in <dec>;* has type +T.

  • +
+

Declarations in <dec>;* are evaluated +sequentially. The first declaration that traps causes the entire +sequence to trap. Otherwise, the result of the declaration is the value +of the last declaration in <dec>;*. In addition, the +set of value bindings defined by <dec>;* is the union +of the bindings introduced by each declaration in +<dec>;*.

+

It is a compile-time error if any declaration in +<dec>;* might require the value of an identifier +declared in <dec>;* before that identifier’s +declaration has been evaluated. Such use-before-define errors +are detected by a simple, conservative static analysis not described +here.

+

Patterns

+

Patterns bind function parameters, declare identifiers and decompose +values into their constituent parts in the cases of a +switch expression.

+

Matching a pattern against a value may succeed, +binding the corresponding identifiers in the pattern to their +matching values, or fail. Thus the result of a match is either +a successful binding, mapping identifiers of the pattern to values, or +failure.

+

The consequences of pattern match failure depends on the context of +the pattern.

+
    +
  • In a function application or let-binding, failure to +match the formal argument pattern or let-pattern causes a +trap.

  • +
  • In a case branch of a switch +expression, failure to match that case’s pattern continues with an +attempt to match the next case of the switch, trapping only when no such +case remains.

  • +
+

Wildcard pattern

+

The wildcard pattern _ matches a single value without +binding its contents to an identifier.

+

Identifier pattern

+

The identifier pattern <id> matches a single value +and binds it to the identifier <id>.

+

Literal pattern

+

The literal pattern <unop>? <lit> matches a +single value against the constant value of literal +<lit> and fails if they are not (structurally) equal +values.

+

For integer literals only, the optional <unop> +determines the sign of the value to match.

+

Tuple pattern

+

The tuple pattern ( <pat>,* ) matches a n-tuple +value against an n-tuple of patterns (both the tuple and pattern must +have the same number of items). The set of identifiers bound by each +component of the tuple pattern must be distinct.

+

The empty tuple pattern () is called the unit +pattern.

+

Pattern matching fails if one of the patterns fails to match the +corresponding item of the tuple value. Pattern matching succeeds if +every pattern matches the corresponding component of the tuple value. +The binding returned by a successful match is the disjoint union of the +bindings returned by the component matches.

+

Object pattern

+

The object pattern { <pat-field>;* } matches an +object value, a collection of named field values, against a sequence of +named pattern fields. The set of identifiers bound by each field of the +object pattern must be distinct. The names of the pattern fields in the +object pattern must be distinct.

+

Object patterns support punning for concision. A punned +field <id> is shorthand for +<id> = <id>; Similarly, a typed, punned field +<id> : <typ> is short-hand for +<id> = <id> : <typ>. Both bind the +matched value of the field named <id> to the +identifier <id>.

+

Pattern matching fails if one of the pattern fields fails to match +the corresponding field value of the object value. Pattern matching +succeeds if every pattern field matches the corresponding named field of +the object value. The binding returned by a successful match is the +union of the bindings returned by the field matches.

+

The <sort> of the matched object type must be +determined by an enclosing type annotation or other contextual type +information.

+

Variant pattern

+

The variant pattern # <id> <pat>? matches a +variant value (of the form # <id'> v) against a +variant pattern. An absent <pat>? is shorthand for +the unit pattern (()). Pattern matching fails if the tag +<id'> of the value is distinct from the tag +<id> of the pattern (i.e. <id> +<> <id'>); or the tags are equal but the value +v does not match the pattern <pat>?. +Pattern matching succeeds if the tag of the value is +<id> (i.e. <id'> = +<id>) and the value v matches the +pattern <pat>?. The binding returned by a successful +match is just the binding returned by the match of v +against <pat>?.

+

Annotated pattern

+

The annotated pattern <pat> : <typ> matches +value of v type <typ> against the +pattern <pat>.

+

<pat> : <typ> is not a dynamic type +test, but is used to constrain the types of identifiers bound in +<pat>, e.g. in the argument pattern to a +function.

+

Option pattern

+

The option ? <pat> matches a value of option type +? <typ>.

+

The match fails if the value is null. If the +value is ? v, for some value v, then the +result of matching ? <pat> is the result of matching +v against <pat>.

+

Conversely, the null literal pattern may be used to test +whether a value of option type is the value null and not +? v for some v.

+

Or pattern

+

The or pattern <pat1> or <pat2> is a +disjunctive pattern.

+

The result of matching <pat1> or <pat2> +against a value is the result of matching <pat1>, if +it succeeds, or the result of matching <pat2>, if the +first match fails.

+

(Note, an or-pattern may contain identifier +(<id>) patterns with the restriction that both +alternatives must bind the same set of identifiers. Each identifier's +type is the least upper bound of its type in <pat1> +and <pat2>.

+

Expression declaration

+

The declaration <exp> has type T +provided the expression <exp> has type T +. It declares no bindings.

+

The declaration <exp> evaluates to the result of +evaluating <exp> (typically for +<exp>'s side-effect).

+

Note that if <exp> appears within a sequence of +declarations, but not as the last declaration of that sequence, then +T must be ().

+ + +

Let declaration

+

The let declaration +let <pat> = <exp> has type T and +declares the bindings in <pat> provided:

+
    +
  • <exp> has type T, and

  • +
  • <pat> has type T.

  • +
+

The declaration let <pat> = <exp> evaluates +<exp> to a result r. If r +is trap, the declaration evaluates to trap. If +r is a value v then evaluation proceeds by +matching the value v against <pat>. If +matching fails, then the result is trap. Otherwise, the +result is v and the binding of all identifiers in +<pat> to their matching values in v.

+

All bindings declared by a let (if any) are +immutable.

+

Let-else declaration

+

The let-else declaration +let <pat> = <exp> else <block-or-exp> has +type T and declares the bindings in +<pat> provided:

+
    +
  • <exp> has type T,

  • +
  • <pat> has type T, and

  • +
  • <block-or-exp> has type +None.

  • +
+

The declaration +let <pat> = <exp> else <block-or-exp> +evaluates <exp> to a result r. If +r is trap, the declaration evaluates to +trap. If r is a value v then +evaluation proceeds by matching the value v against +<pat>. If matching succeeds, the result is +v and the binding of all identifiers in +<pat> to their matching values in v. If +matching fails, then evaluation continues with +<block-or-exp>, which, having type None, +cannot proceed to the end of the declaration but may still alter +control-flow to, for example return or throw +to exit an enclosing function, break` from an enclosing expression or +simply diverge.

+

All bindings declared by a let-else (if any) are +immutable.

+

Handling pattern match +failures

+

In the presence of refutable patterns, the pattern in a +let declaration may fail to match the value of its +expression. In such cases, the let-declaration will +evaluate to a trap. The compiler emits a warning for any +let-declaration than can trap due to pattern match +failure.

+

Instead of trapping, a user may want to explicitly handle pattern +match failures. The let-else declaration, +let <pat> = <exp> else <block-or-exp>, +has mostly identical static and dynamic semantics to let, +but diverts the program's control flow to +<block-or-exp> when pattern matching fails, allowing +recovery from failure. The else expression, +<block-or-exp>, must have type None and +typically exits the declaration using imperative control flow constructs +such as throw, return, break or +non-returning functions such as Debug.trap(...) (that all +produce a result of type None). Any compilation warning +that is produced for a let can be silenced by handling the +potential pattern-match failure using let-else.

+

Var declaration

+

The variable declaration +var <id> (: <typ>)? = <exp> declares a +mutable variable <id> with initial value +<exp>. The variable’s value can be updated by +assignment.

+

The declaration var <id> has type () +provided:

+
    +
  • <exp> has type T; and

  • +
  • If the annotation (:<typ>)? is present, then +T == <typ>.

  • +
+

Within the scope of the declaration, <id> has type +var T (see Assignment).

+

Evaluation of +var <id> (: <typ>)? = <exp> proceeds by +evaluating <exp> to a result r. If +r is trap, the declaration evaluates to +trap. Otherwise, the r is some value +v that determines the initial value of mutable variable +<id>. The result of the declaration is +() and <id> is bound to a fresh location +that contains v.

+

Type declaration

+

The declaration +type <id> <typ-params>? = <typ> declares +a new type constructor <id>, with optional type +parameters <typ-params> and definition +<typ>.

+

The declaration +type C< X0 <: T0, …​, Xn <: Tn > = U is +well-formed provided:

+
    +
  • type parameters X0, …​, Xn are distinct, +and

  • +
  • assuming the constraints X0 <: T0, …​, +Xn <: Tn:

  • +
  • constraints T0, …​, Tn are +well-formed.

  • +
  • definition U is well-formed.

  • +
  • it is productive (see Productivity).

  • +
  • it is non-expansive (see Expansiveness).

  • +
+

In scope of the declaration +type C< X0<:T0, …​, Xn <: Tn > = U, any +well-formed type C< U0, …​, Un > is equivalent to its +expansion U [ U0/X0, …​, Un/Xn ]. Distinct type expressions +that expand to identical types are inter-changeable, regardless of any +distinction between type constructor names. In short, the equivalence +between types is structural, not nominal.

+

Productivity

+

A type is productive if recursively expanding any outermost +type constructor in its definition eventually produces a type other than +the application of a type constructor.

+

Motoko requires all type declarations to be productive.

+

For example, the type definitions:

+
  type Person = { first : Text; last : Text };
+
+  type List<T> = ?(T, List<T>);
+
+  type Fst<T, U> = T;
+
+  type Ok<T> = Fst<Any, Ok<T>>;
+

are all productive and legal.

+

But the type definitions,

+
  type C = C;
+
+  type D<T, U> = D<U, T>;
+
+  type E<T> = F<T>;
+  type F<T> = E<T>;
+
+  type G<T> = Fst<G<T>, Any>;
+

are all non-productive, since each definition will enter a loop after +one or more expansions of its body.

+

Expansiveness

+

A set of mutually recursive type or class declarations will be +rejected if the set is expansive.

+

Expansiveness is a syntactic criterion. To determine whether a set of +singly or mutually recursive type definitions, say

+
  type C<...,Xi,...> = T;
+  ...
+  type D<...,Yj,...> = U;
+

is expansive, construct a directed graph whose vertices are the +formal type parameters (identified by position), C#i, with +the following {0,1}-labeled edges:

+
    +
  • For each occurrence of parameter C#i as immediate, +j-th argument to type D<…​,C#i,…​>, add a +non-expansive, 0-labeled +edge,C#i -0-> D#j.

  • +
  • For each occurrence of parameter C#i as a proper +sub-expression of the j-th argument to type +D<…​,T[C#i],..> add an expansive +1-labeled edge, C#i -1-> D#j.

  • +
+

The graph is expansive if, and only if, it contains a cycle with at +least one expansive edge.

+

For example, the type definition:

+
  type List<T> = ?(T, List<T>);
+

that recursively instantiates List at the same parameter +T, is non-expansive and accepted, but the similar looking +definition:

+
  type Seq<T> = ?(T, Seq<[T]>);
+

that recursively instantiates Seq with a larger type, +[T], containing T, is expansive and +rejected.

+
    +
  • Type List<T> is non-expansive because its +graph, { List#0 -0-> List#0 }, though cyclic, has no +expansive edge.

  • +
  • Type Seq<T>, on the other hand, is expansive, +because its graph, { Seq#0 -1-> Seq#0 }, has a cycle +that includes an expansive edge.

  • +
+

Object declaration

+

Declaration <sort> <id>? <obj-body>, +where <obj_body> is of the form +=? { <dec-field>;* }, declares an object with +optional identifier <id> and zero or more fields +<dec-field>;*. Fields can be declared with +public or private visibility; if the +visibility is omitted, it defaults to private.

+

The qualifier <sort> (one of actor, +module or object) specifies the sort +of the object’s type. The sort imposes restrictions on the types of the +public object fields.

+

Let +T = <sort> { [var0] id0 : T0, …​ , [varn] idn : T0 } +denote the type of the object. Let <dec>;* be the +sequence of declarations embedded in <dec-field>;*. +The object declaration has type T provided that:

+
    +
  1. type T is well-formed for sort sort, +and

  2. +
  3. under the assumption that <id> : T,

    +
      +
    • the sequence of declarations <dec>;* has type +Any and declares the disjoint sets of private and public +identifiers, Id_private and Id_public +respectively, with types T(id) for id in +Id == Id_private union Id_public, and

    • +
    • { id0, …​, idn } == Id_public, and

    • +
    • for all i in 0 <= i <= n, +[vari] Ti == T(idi).

    • +
  4. +
  5. If <sort> is module, then the +declarations in <dec>;* must be static (see +Static declarations).

  6. +
+

Note that requirement 1. imposes further constraints on the field +types of T. In particular, if the sort is +actor then:

+
    +
  • all public fields must be non-var (immutable) +shared functions (the public interface of an actor can only +provide asynchronous messaging via shared functions);
  • +
+

Because actor construction is asynchronous, an actor declaration can +only occur in an asynchronous context (i.e. in the body of a +(non-<query>) shared function, +async expression or async* expression).

+

Evaluation of +<sort>? <id>? =? { <dec-field>;* } +proceeds by binding <id> (if present), to the +eventual value v, and evaluating the declarations in +<dec>;*. If the evaluation of +<dec>;* traps, so does the object declaration. +Otherwise, <dec>;* produces a set of bindings for +identifiers in Id. let v0, …​, vn +be the values or locations bound to identifiers +<id0>, …​, <idn>. The result of the +object declaration is the object +v == sort { <id0> = v1, …​, <idn> = vn}.

+

If <id>? is present, the declaration binds +<id> to v. Otherwise, it produces the +empty set of bindings.

+

:::danger

+

Actor declaration is (implicitly) asynchronous and the state of the +enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

:::

+

Static declarations

+

A declaration is static if it is:

+
    +
  • a type declaration, or

  • +
  • a class declaration, or

  • +
  • a let declaration with a static pattern and a static +expression, or

  • +
  • a module, function or object declaration that desugars to a +static let declaration, or

  • +
  • a static expression.

  • +
+

An expression is static if it is:

+
    +
  • a literal expression, or

  • +
  • a tuple of static expressions, or

  • +
  • an object of static expressions, or

  • +
  • a variant or option with a static expression, or

  • +
  • an immutable array, or

  • +
  • field access and projection from a static expression, or

  • +
  • a module expression, or

  • +
  • a function expression, or

  • +
  • a static declaration, or

  • +
  • an ignore of a static expression, or

  • +
  • a block, all of whose declarations are static, or

  • +
  • a type annotation with a static expression.

  • +
+

A pattern is static if it is:

+
    +
  • an identifier, or

  • +
  • a wildcard, or

  • +
  • a tuple of static patterns, or

  • +
  • type annotation with a static pattern.

  • +
+ + +

Static phrases are designed to be side-effect free, allowing the +coalescing of duplicate library imports (a.k.a deduplication).

+

Function declaration

+

The function declaration +<shared-pat>? func <id>? <typ-params>? <pat> (: <typ>)? =? <exp> +is syntactic sugar for a named let or anonymous declaration +of a function expression.

+

That is, when <id>? is present and the function is +named:

+
<shared-pat>? func <id> <typ-params>? <pat> (: <typ>)? =? <block-or-exp> :=
+  let <id> = <shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp>
+

But when <id>? is absent and the function is +anonymous:

+
<shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp> :=
+  <shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp>
+

Named function definitions support recursion (a named function can +call itself).

+

:::note

+

In compiled code, shared functions can only appear as +public actor fields.

+

:::

+

Class declaration

+

The class declaration +<shared-pat>? <sort>? class <id>? <typ-params>? <pat> (: <typ>)? <class-body> +is sugar for pair of a type and function declaration:

+
<shared-pat>? <sort>? class <id> <typ-params>? <pat> (: <typ>)? <class-body> :=
+  type <id> <typ-params> = <sort> { <typ-field>;* };
+  <shared-pat>? func <id> <typ-params>? <pat> : async? <id> <typ-args> =
+    async? <sort> <id_this>? <obj-body>
+

where:

+
    +
  • <shared-pat>?, when present, requires +<sort> == actor, and provides access to +the caller of an actor constructor, +and

  • +
  • <typ-args>? is the sequence of type +identifiers bound by <typ-params>? (if any), +and

  • +
  • <typ-field>;* is the set of public field types +inferred from <dec-field>;*.

  • +
  • <obj-body> is the object body of +<class-body>.

  • +
  • <id_this>? is the optional this +(a.k.a self), parameter of +<class-body>.

  • +
  • async? is present, if only if, +<sort> == actor.

  • +
+

Note <shared-pat>? must not be of the form +shared <query> <pat>?: a constructor, unlike a +function, cannot be a query or +composite query.

+

An absent <shared-pat>? defaults to +shared when sort = actor.

+

If sort is actor, then:

+
    +
  • <typ-args>? must be absent or empty +(actor classes cannot have type parameters);

  • +
  • <pat>'s type must be shared (see Sharability).

  • +
  • (: <typ>)?, if present, must be of the form +: async T for some actor type T (actor +instantiation is asynchronous).

  • +
+

If (: <typ>) is present, then the type +<async?> <sort> { <typ_field>;* } must +be a subtype of the annotation <typ>. In particular, +the annotation is used only to check, but not affect, the inferred type +of function <id>.

+

The class declaration has the same type as function +<id> and evaluates to the function value +<id>.

+

Identifiers

+

The identifier expression <id> has type +T provided <id> is in scope, defined and +declared with explicit or inferred type T.

+

The expression <id> evaluates to the value bound +to <id> in the current evaluation environment.

+

Literals

+

A literal has type T only when its value is within the +prescribed range of values of type T.

+

The literal (or constant) expression <lit> +evaluates to itself.

+

Unary operators

+

The unary operator <unop> <exp> has type +T provided:

+
    +
  • <exp> has type T, and

  • +
  • The category of <unop> is a category of +T.

  • +
+

The unary operator expression <unop> <exp> +evaluates <exp> to a result. If the result is a value +v, it returns the result of <unop> v. If +the result is trap, the entire expression results in +trap.

+

Binary operators

+

The binary operator expression +<exp1> <binop> <exp2> has type +T provided:

+
    +
  • <exp1> has type T, and

  • +
  • <exp2> has type T, and

  • +
  • The category of <binop> is a category of +T.

  • +
+

The binary operator expression +<exp1> <binop> <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 and r2 are values +v1 and v2 and the expression returns the +result of v1 <binop> v2.

+

Relational operators

+

The relational expression +<exp1> <relop> <exp2> has type +Bool provided:

+
    +
  • <exp1> has type T, and

  • +
  • <exp2> has type T, and

  • +
  • <relop> is equality == or +inequality !=, T is shared, and +T is the least type such that <exp1> and +<exp2> have type T;

  • +
  • the category O (Ordered) is a category of T and +<relop>; or

  • +
+

The binary operator expression +<exp1> <relop> <exp2> evaluates +<exp1> to a result r1. If +r1 is trap, the expression results in +trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 and r2 are values +v1 and v2 and the expression returns the +Boolean result of v1 <relop> v2.

+

For equality and inequality, the meaning of +v1 <relop> v2 depends on the compile-time, static +choice of T (not the run-time types of v1 and +v2, which, due to subtyping, may be more precise).

+

Pipe operators and +placeholder expressions

+

The pipe expression <exp1> |> <exp2> +binds the value of <exp1> to the special placeholder +expression _, that can be referenced in +<exp2> (and recursively in +<exp1>). Referencing the placeholder expression +outside of a pipe operation is a compile-time error.

+

The pipe expression <exp1> |> <exp2> is +just syntactic sugar for a let binding to a placeholder +identifier, p:

+
do { let p = <exp1>; <exp2> }
+

The placeholder expression _ is just syntactic sugar for +the expression referencing the placeholder identifier:

+
p
+

The placeholder identifier, p, is a fixed, reserved +identifier that cannot be bound by any other expression or pattern other +than a pipe operation, and can only be referenced using the placeholder +expression _.

+

|> has lowest precedence amongst all operators except +: and associates to the left.

+

Judicious use of the pipe operator allows one to express a more +complicated nested expression by piping arguments of that expression +into their nested positions within that expression.

+

For example:

+
Iter.range(0, 10) |>
+  Iter.toList _ |>
+    List.filter<Nat>(_, func n { n % 3 == 0 }) |>
+      { multiples = _ };
+

may, according to taste, be a more readable rendition of:

+
{ multiples =
+   List.filter<Nat>(
+     Iter.toList(Iter.range(0, 10)),
+     func n { n % 3 == 0 }) };
+

Above, each occurence of _ refers to the value of the +left-hand-size of the nearest enclosing pipe operation, after +associating nested pipes to the left.

+

Note that the evaluation order of the two examples is different, but +consistently left-to-right.

+

:::note

+

Although syntactically identical, the placeholder expression is +semantically distinct from, and should not be confused with, the +wildcard pattern _. Occurrences of the forms can be +distinguished by their syntactic role as pattern or expression.

+

:::

+

Tuples

+

Tuple expression (<exp1>, …​, <expn>) has +tuple type (T1, …​, Tn), provided <exp1>, +…​, <expn> have types T1, …​, +Tn.

+

The tuple expression (<exp1>, …​, <expn>) +evaluates the expressions exp1 …​ expn in +order, trapping as soon as some expression <expi> +traps. If no evaluation traps and exp1, …​, +<expn> evaluate to values +v1,…​,vn then the tuple expression returns the +tuple value (v1, …​ , vn).

+

The tuple projection <exp> . <nat> has type +Ti provided <exp> has tuple type +(T1, …​, Ti, …​, Tn), <nat> == +i and 1 <= i <= n.

+

The projection <exp> . <nat> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a tuple (v1,…​,vi,…​,vn) and the +result of the projection is the value vi.

+

The empty tuple expression () is called the unit +value.

+

Option expressions

+

The option expression ? <exp> has type +? T provided <exp> has type +T.

+

The literal null has type Null. Since +Null <: ? T for any T, literal +null also has type ? T and signifies the +"missing" value at type ? T.

+

Variant injection

+

The variant injection # <id> <exp> has +variant type {# id T} provided:

+
    +
  • <exp> has type T.
  • +
+

The variant injection # <id> is just syntactic +sugar for # <id> ().

+

The variant injection # <id> <exp> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a value v and the result of the +injection is the tagged value # <id> v.

+

The tag and contents of a variant value can be tested and accessed +using a variant pattern.

+

Objects

+

Objects can be written in literal form +{ <exp-field>;* }, consisting of a list of expression +fields:

+
<exp-field> ::=                                object expression fields
+  var? <id> (: <typ>) = <exp>                    field
+  var? <id> (: <typ>)                            punned field
+

Such an object literal, sometimes called a record, is +equivalent to the object declaration +object { <dec-field>;* } where the declaration fields +are obtained from the expression fields by prefixing each of them with +public let, or just public in case of +var fields. However, unlike declarations, the field list +does not bind each <id> as a local name within the +literal, i.e., the field names are not in scope in the field +expressions.

+

Object expressions support punning for concision. A punned +field <id> is shorthand for +<id> = <id>; Similarly, a typed, punned field +<id> : <typ> is short-hand for +<id> = <id> : <typ>. Both associate the +field named <id> with the value of the identifier +<id>.

+

Object combination/extension

+

Objects can be combined and/or extended using the and +and with keywords.

+

A record expression +{ <exp> (and <exp>)* (with <exp-field>;+)? } +merges the objects (or modules) specified as base expressions, +and augments the result to also contain the specified fields. The +with <exp-field>;+ clause can be omitted when at +least two bases appear and none have common field labels. Thus the field +list serves to:

+
    +
  • disambiguate field labels occurring more than once in the +bases,
  • +
  • define new fields,
  • +
  • override existing fields and their types, and
  • +
  • add new var fields
  • +
  • redefine existing var fields from some base to prevent +aliasing.
  • +
+

The resulting type is determined by the bases' (and explicitly given +fields') static type.

+

Any var field from some base must be overwritten in the +explicit field list. This prevents introducing aliases of +var fields.

+

The record expression +{ <exp1> and ... <expn> with <exp-field1>; ... <exp_fieldn>; } +has type T provided:

+
    +
  • The record +{ <exp-field1>; ... <exp_fieldm>; } has record +type +{ field_tys } == { var? <id1> : U1; ... var? <idm> : Um }.

  • +
  • Let newfields == { <id1> , ..., <idm> } +be the set of new field names.

  • +
  • Considering value fields:

    +
      +
    • Base expression <expi> has object or module type +sorti { field_tysi } == sorti { var? <idi1> : Ti1, …​, var? <idik> : Tik } +where sorti <> Actor.
    • +
    +

    Let fields(i) == { <idi1>, ..., <idik> } be +the set of static field names of base i. Then

    +
      +
    • fields(i) is disjoint from newfields +(possibly by applying subtyping to the type of +<expi>);
    • +
    • no field in field_tysi is a var +field;
    • +
    • fields(i) is disjoint from fields(j) for +j < i.
    • +
  • +
  • Considering type fields:

    +
      +
    • Base expression <expi> has object or module type +sorti { typ_fieldsi } == sorti { type <idj1> = … , …, type <idik> = … } +where sorti <> Actor.
    • +
    • typ_fieldsi agrees with +typ_fieldsj for j < i.
    • +
  • +
  • T is +{ typ_fieldsi fields_tys1 ... typ_fieldsm fields_tysm field_tys }.

  • +
+

Here, two sequences of type fields agree only when any two +type fields of the same name in each sequence have equivalent +definitions.

+ + +

The record expression +{ <exp1> and ... <expn> with <exp-field1>; ... <exp_fieldm>; } +evaluates records <exp1> through +<expn> and +{ exp-field1; ... <exp_fieldm } to results +r1 through rn and r, trapping on +the first result that is a trap. If none of the expressions produces a +trap, the results are objects sort1 { f1 }, +sortn { fn } and object { f }, where +f1 ... fn and f are maps from +identifiers to values or mutable locations.

+

The result of the entire expression is the value +object { g } where g is the partial map with +domain fields(1) union fields(n) union newfields mapping +identifiers to unique values or locations such that +g(<id>) = fi(<id>) if <id> +is in fields(i), for some i, or +f(<id>) if <id> is in +newfields.

+

Object projection (member +access)

+

The object projection <exp> . <id> has type +var? T provided <exp> has object type +sort { var1? <id1> : T1, …​, var? <id> : T, …​, var? <idn> : Tn } +for some sort sort.

+

The object projection <exp> . <id> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be an object value +{ <id1> = v1,…​, id = v, …​, <idm> = vm } and the +result of the projection is the value w obtained from value +or location v in field id.

+

If var is absent from var? T then the value +w is just the value v of immutable field +<id>, otherwise:

+
    +
  • if the projection occurs as the target of an assignment +expression then w is just v, the mutable +location in field <id>.

  • +
  • otherwise, w (of type T) is the value +currently stored at the mutable location v in field +<id>.

  • +
+

Special member access

+

The iterator access <exp> . <id> has type +T provided <exp> has type +U, and U,<id> and +T are related by a row of the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
U<id>TDescription
TextsizeNatsize (or length) in characters
Textchars{ next: () -> Char? }character iterator, first to last
BlobsizeNatsize in bytes
Blobvals{ next: () -> Nat8? }byte iterator, first to last
[var? T]sizeNatnumber of elements
[var? T]getNat -> Tindexed read function
[var? T]keys{ next: () -> Nat? }index iterator, by ascending index
[var? T]vals{ next: () -> T? }value iterator, by ascending index
[var T]put(Nat, T) -> ()indexed write function (mutable arrays only)
+

The projection <exp> . <id> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a value of type U and the result of +the projection is a value of type T whose semantics is +given by the Description column of the previous table.

+

:::note

+

the chars, vals, keys and +vals members produce stateful iterator +objects than can be consumed by for expressions +(see For).

+

:::

+

Assignment

+

The assignment <exp1> := <exp2> has type +() provided:

+
    +
  • <exp1> has type var T, +and

  • +
  • <exp2> has type T.

  • +
+

The assignment expression <exp1> := <exp2> +evaluates <exp1> to a result r1. If +r1 is trap, the expression results in +trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise r1 and r2 are (respectively) a +location v1 (a mutable identifier, an item of a mutable +array or a mutable field of an object) and a value v2. The +expression updates the current value stored in v1 with the +new value v2 and returns the empty tuple +().

+

Unary compound assignment

+

The unary compound assignment <unop>= <exp> +has type () provided:

+
    +
  • <exp> has type var T, +and

  • +
  • <unop>'s category is a category of +T.

  • +
+

The unary compound assignment <unop>= <exp> +evaluates <exp> to a result r. If +r is trap the evaluation traps, otherwise +r is a location storing value v and +r is updated to contain the value +<unop> v.

+

Binary compound assignment

+

The binary compound assignment +<exp1> <binop>= <exp2> has type +() provided:

+
    +
  • <exp1> has type var T, +and

  • +
  • <exp2> has type T, and

  • +
  • <binop>'s category is a category of +T.

  • +
+

For binary operator <binop>, the compound +assignment expression +<exp1> <binop>= <exp2> evaluates +<exp1> to a result r1. If +r1 is trap, the expression results in +trap. Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise r1 and r2 are (respectively) a +location v1 (a mutable identifier, an item of a mutable +array or a mutable field of object) and a value v2. The +expression updates the current value, w stored in +v1 with the new value w <binop> v2 and +returns the empty tuple ().

+

Arrays

+

The expression [ var? <exp>,* ] has type +[var? T] provided each expression <exp> +in the sequence <exp>,* has type T.

+

The array expression +[ var <exp0>, …​, <expn> ] evaluates the +expressions exp0 …​ expn in order, trapping as +soon as some expression <expi> traps. If no +evaluation traps and exp0, …​, <expn> +evaluate to values v0,…​,vn then the array +expression returns the array value [var? v0, …​ , vn] (of +size n+1).

+

Array indexing

+

The array indexing expression +<exp1> [ <exp2> ] has type var? T +provided:

+
    +
  • <exp> has (mutable or immutable) array type +[var? T1].
  • +
+

The expression <exp1> [ <exp2> ] evaluates +exp1 to a result r1. If r1 is +trap, then the result is trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 is an array value, +var? [v0, …​, vn], and r2 is a natural integer +i. If i > n the index expression returns +trap.

+

Otherwise, the index expression returns the value v, +obtained as follows:

+

If var is absent from var? T then the value +v is the constant value vi.

+

Otherwise,

+
    +
  • if the indexing occurs as the target of an assignment expression +then v is the i-th mutable location in the +array;

  • +
  • otherwise, v is vi, the value currently +stored in the i-th location of the array.

  • +
+

Function calls

+

The function call expression +<exp1> <T0,…​,Tn>? <exp2> has type +T provided:

+
    +
  • the function <exp1> has function type +<shared>? < X0 <: V0, ..., Xn <: Vn > U1-> U2; +and

  • +
  • if <T0,…​,Tn>? is absent but n > 0 then +there exists minimal T0, …​, Tn (inferred by the compiler) +such that:

  • +
  • each type argument satisfies the corresponding type parameter’s +bounds: for each 1 <= i <= n, +Ti <: [T0/X0, …​, Tn/Xn]Vi; and

  • +
  • the argument <exp2> has type +[T0/X0, …​, Tn/Xn]U1, and

  • +
  • T == [T0/X0, …​, Tn/Xn]U2.

  • +
+

The call expression +<exp1> <T0,…​,Tn>? <exp2> evaluates +exp1 to a result r1. If r1 is +trap, then the result is trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 is a function value, +<shared-pat>? func <X0 <: V0, …​, n <: Vn> <pat1> { <exp> } +(for some implicit environment), and r2 is a value +v2. If <shared-pat> is present and of +the form shared <query>? <pat> then evaluation +continues by matching the record value {caller = p} against +<pat>, where p is the +Principal invoking the function (typically a user or +canister). Matching continues by matching v1 against +<pat1>. If pattern matching succeeds with some +bindings, then evaluation returns the result of <exp> +in the environment of the function value (not shown) extended with those +bindings. Otherwise, some pattern match has failed and the call results +in trap.

+

:::note

+

The exhaustiveness side condition on shared function +expressions ensures that argument pattern matching cannot fail (see Functions).

+

:::

+

:::note

+

Calls to local functions with async return type and +shared functions can fail due to a lack of canister +resources. Such failures will result in the call immediately throwing an +error with code #call_error { err_code = n }, +where n is the non-zero err_code value +returned by the Internet Computer. Earlier versions of Motoko would trap +in such situations, making it difficult for the calling canister to +mitigate such failures. Now, a caller can handle these errors using +enclosing try ... catch ... expressions, if desired.

+

:::

+

Functions

+

The function expression +<shared-pat>? func < X0 <: T0, …​, Xn <: Tn > <pat1> (: U2)? =? <block-or-exp> +has type +<shared>? < X0 <: T0, ..., Xn <: Tn > U1-> U2 +if, under the assumption that +X0 <: T0, …​, Xn <: Tn:

+
    +
  • <shared-pat>? is of the form +shared <query>? <pat> if and only if +<shared>? is shared <query>? (the +<query> modifiers must agree, i.e. are either both +absent, both query, or both +composite query);

  • +
  • all the types in T0, …​, Tn and U2 are +well-formed and well-constrained;

  • +
  • pattern <pat> has context type +{ caller : Principal };

  • +
  • pattern <pat1> has type +U1;

  • +
  • if the function is shared then +<pat> and <pat1> must be +exhaustive;

  • +
  • expression <block-or-exp> has type return type +U2 under the assumption that <pat1> has +type U1.

  • +
+

<shared-pat>? func <typ-params>? <pat1> (: <typ>)? =? <block-or-exp> +evaluates to a function value (a.k.a. closure), denoted +<shared-pat>? func <typ-params>? <pat1> = <exp>, +that stores the code of the function together with the bindings from the +current evaluation environment (not shown) needed to evaluate calls to +the function value.

+

Note that a <shared-pat> function may itself be +shared <pat> or shared query <pat> +or shared composite query <pat>.

+
    +
  • A shared <pat> function may be invoked from a +remote caller. Unless causing a trap, the effects on the callee persist +beyond completion of the call.

  • +
  • A shared query <pat> function may be also be +invoked from a remote caller, but the effects on the callee are +transient and discarded once the call has completed with a result +(whether a value or error).

  • +
  • A shared composite query <pat> function may +only be invoked as an ingress message, not from a remote caller. Like a +query, the effects on the callee are transient and discarded once the +call has completed with a result (whether a value or error). In +addition, intermediate state changes made by the call are not observable +by any of its own query or composite query +callees.

  • +
+

In either case, <pat> provides access to a context +value identifying the caller of the shared (query) +function.

+

:::note

+

The context type is a record to allow extension with further fields +in future releases.

+

:::

+

Shared functions have different capabilities dependent on their +qualification as shared, shared query or +shared composite query.

+

A shared function may call any shared or +shared query function, but no +shared composite query function. A +shared query function may not call any shared, +shared query or shared composite query +function. A shared composite query function may call any +shared query or shared composite query +function, but no shared function.

+

All varieties of shared functions may call unshared functions.

+

Composite queries, though composable, can only be called externally +(from a frontend) and cannot be initiated from an actor.

+

Blocks

+

The block expression { <dec>;* } has type +T provided the last declaration in the sequence +<dec>;* has type T. All identifiers +declared in block must be distinct type identifiers or distinct value +identifiers and are in scope in the definition of all other declarations +in the block.

+

The bindings of identifiers declared in { dec;* } are +local to the block.

+

The type system ensures that a value identifier cannot be evaluated +before its declaration has been evaluated, precluding run-time errors at +the cost of rejection some well-behaved programs.

+

Identifiers whose types cannot be inferred from their declaration, +but are used in a forward reference, may require an additional type +annotation (see Annotated pattern) to +satisfy the type checker.

+

The block expression { <dec>;* } evaluates each +declaration in <dec>;* in sequence (program order). +The first declaration in <dec>;* that results in a +trap causes the block to result in trap, without evaluating +subsequent declarations.

+

Do

+

The do expression do <block> allows the use of a +block as an expression, in positions where the syntax would not directly +allow a block.

+

The expression do <block> has type T +provided <block> has type T.

+

The do expression evaluates by evaluating +<block> and returning its result.

+

Option block

+

The option block do ? <block> introduces scoped +handling of null values.

+

The expression do ? <block> has type +?T provided <block> has type +T.

+

The do ? <block> expression evaluates +<block> and returns its result as an optional +value.

+

Within <block> the null break expression +<exp1> ! exits the nearest enclosing +do ? block with value null whenever +<exp1> has value null, or continues +evaluation with the contents of <exp1>'s option +value. (See Null break.)

+

Option blocks nest with the target of a null break determined by the +nearest enclosing option block.

+

Null break

+

The null break expression <exp> ! invokes scoped +handling of null values and returns the contents of an option value or +changes control-flow when the value is null.

+

It has type T provided:

+
    +
  • the expression appears in the body, <block>, +of an enclosing option block of the form do ? <block> +(see Option block).

  • +
  • <exp> has option type +? T.

  • +
+

The expression <exp> ! evaluates +<exp> to a result r. If r +is trap, then the result is trap; if +r is null, execution breaks with value +null from the nearest enclosing option block of form +do ? <block>; otherwise, r is +? v and execution continues with value v.

+

Not

+

The not expression not <exp> has type +Bool provided <exp> has type +Bool.

+

If <exp> evaluates to trap, the +expression returns trap. Otherwise, +<exp> evaluates to a Boolean value v and +the expression returns not v, (the Boolean negation of +v).

+

And

+

The and expression <exp1> and <exp2> has +type Bool provided <exp1> and +<exp2> have type Bool.

+

The expression <exp1> and <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap. +Otherwise r1 is a Boolean value v. If +v == false the expression returns the value +false (without evaluating <exp2>). +Otherwise, the expression returns the result of evaluating +<exp2>.

+

Or

+

The or expression <exp1> or <exp2> has type +Bool provided <exp1> and +<exp2> have type Bool.

+

The expression <exp1> and <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap. +Otherwise r1 is a Boolean value v. If +v == true the expression returns the value +true (without evaluating <exp2>). +Otherwise, the expression returns the result of evaluating +<exp2>.

+

If

+

The expression +if <exp1> <exp2> (else <exp3>)? has type +T provided:

+
    +
  • <exp1> has type Bool

  • +
  • <exp2> has type T

  • +
  • <exp3> is absent and () <: T, +or

  • +
  • <exp3> is present and has type +T.

  • +
+

The expression evaluates <exp1> to a result +r1. If r1 is trap, the result is +trap. Otherwise, r1 is the value +true or false. If r1 is +true, the result is the result of evaluating +<exp2>. Otherwise, r1 is +false and the result is () (if +<exp3> is absent) or the result of +<exp3> (if <exp3> is present).

+

Switch

+

The switch expression +switch <exp> { (case <pat> <block-or-exp>;)+ } +has type T provided:

+
    +
  • exp has type U; and

  • +
  • for each case case <pat> <block-or-exp> +in the sequence (case <pat> <block-or-exp>;)+ +:

  • +
  • pattern <pat> has type U; +and,

  • +
  • expression <block-or-exp> has type +T

  • +
+

The expression evaluates <exp> to a result +r. If r is trap, the result is +trap. Otherwise, r is some value +v. Let case <pat> <block-or-exp>; +be the first case in +(case <pat> <block-or-exp>;)+ such that +<pat> matches v for some binding of +identifiers to values. Then result of the switch is the +result of evaluating <block-or-exp> under that +binding. If no case has a pattern that matches v, the +result of the switch is trap.

+

While

+

The expression while <exp1> <exp2> has type +() provided:

+
    +
  • <exp1> has type Bool, +and

  • +
  • <exp2> has type ().

  • +
+

The expression evaluates <exp1> to a result +r1. If r1 is trap, the result is +trap. Otherwise, r1 is the value +true or false. If r1 is +true, the result is the result of re-evaluating +while <exp1> <exp2>. Otherwise, the result is +().

+

Loop

+

The expression loop <block-or-exp> has type +None provided <block-or-exp> has type +().

+

The expression evaluates <block-or-exp> to a +result r1. If r1 is trap, the +result is trap. Otherwise, the result is the result of +(re-)evaluating loop <block-or-exp>.

+

Loop-while

+

The expression +loop <block-or-exp1> while <exp2> has type +() provided:

+
    +
  • <block-or-exp1> has type (), +and

  • +
  • <exp2> has type Bool.

  • +
+

The expression evaluates <block-or-exp1> to a +result r1. If r1 is trap, the +result is trap. Otherwise, evaluation continues with +<exp2>, producing result r2. If +r2 is trap the result is trap. +Otherwise, if r2 is true, the result is the +result of re-evaluating +loop <block-or-exp1> while <exp2>. Otherwise, +r2 is false and the result is ().

+

For

+

The iterator expression +for ( <pat> in <exp1> ) <block-or-exp2> +has type () provided:

+
    +
  • <exp1> has type +{ next : () → ?T },

  • +
  • pattern <pat> has type T, +and

  • +
  • expression <block-or-exp2> has type +() (in the environment extended with the bindings of +<pat>).

  • +
+

The for-expression is syntactic sugar for

+
for ( <pat> in <exp1> ) <block-or-exp2> :=
+  {
+    let x = <exp1>;
+    label l loop {
+      switch (x.next()) {
+        case (? <pat>) <block-or-exp2>;
+        case (null) break l;
+      }
+    }
+  }
+

where x and l are fresh identifiers.

+

In particular, the for loop will trap if evaluation of +<exp1> traps; as soon as x.next() traps, +or the value of x.next() does not match pattern +<pat>, or when <block-or-exp2> +traps.

+

:::note

+

Although general purpose, for loops are commonly used to +consume iterators produced by Special +member access to, for example, loop over the indices +(a.keys()) or values (a.vals()) of some array +(here a).

+

:::

+

Label

+

The label-expression +label <id> (: <typ>)? <block-or-exp> has +type T provided:

+
    +
  • (: <typ>)? is absent and T is +unit; or (: <typ>)? is present and +T == <typ>;

  • +
  • <block-or-exp> has type T in the +static environment extended with label l : T.

  • +
+

The result of evaluating +label <id> (: <typ>)? <block-or-exp> is +the result of evaluating <block-or-exp>.

+

Labeled loops

+

If <exp> in +label <id> (: <typ>)? <exp> is a looping +construct:

+
    +
  • while (exp2) <block-or-exp1>,

  • +
  • loop <block-or-exp1> (while (<exp2>))?, +or

  • +
  • for (<pat> in <exp2>) <block-or-exp1>

  • +
+

the body, <exp1>, of the loop is implicitly +enclosed in label <id_continue> (…​) allowing early +continuation of the loop by the evaluation of expression +continue <id>.

+

<id_continue> is fresh identifier that can only be +referenced by continue <id> (through its implicit +expansion to break <id_continue>).

+

Break

+

The expression break <id> is equivalent to +break <id> ().

+

The expression break <id> <exp> has type +None provided:

+
    +
  • The label <id> is declared with type +label <id> : T.

  • +
  • <exp> has type T.

  • +
+

The evaluation of break <id> <exp> evaluates +exp to some result r. If r is +trap, the result is trap. If r is +a value v, the evaluation abandons the current computation +up to dynamically enclosing declaration label <id> …​ +using the value v as the result of that labelled +expression.

+

Continue

+

The expression continue <id> is equivalent to +break <id_continue>, where +<id_continue> is implicitly declared around the +bodies of <id>-labelled looping constructs (see Labeled loops).

+

Return

+

The expression return is equivalent to +return ().

+

The expression return <exp> has type +None provided:

+
    +
  • <exp> has type T and

  • +
  • T is the return type of the nearest enclosing +function (with no intervening async expression), +or

  • +
  • async T is the type of the nearest enclosing +(perhaps implicit) async expression (with no intervening +function declaration)

  • +
+

The return expression exits the corresponding dynamic +function invocation or completes the corresponding dynamic +async or async* expression with the result of +<exp>.

+

Async

+

The async expression async <block-or-exp> has type +async T provided:

+
    +
  • <block-or-exp> has type +T;

  • +
  • T is shared.

  • +
+

Any control-flow label in scope for +async <block-or-exp> is not in scope for +<block-or-exp>. However, +<block-or-exp> may declare and use its own, local, +labels.

+

The implicit return type in <block-or-exp> is +T. That is, the return expression, +<exp0>, (implicit or explicit) to any enclosed +return <exp0>? expression, must have type +T.

+

Evaluation of async <block-or-exp> queues a +message to evaluate <block-or-exp> in the nearest +enclosing or top-level actor. It immediately returns a future of type +async T that can be used to await the result +of the pending evaluation of <exp>.

+

:::note

+

Because it involves messaging, evaluating an async +expression can fail due to a lack of canister resources. Such failures +will result in the call immediately throwing an error with +code #call_error { err_code = n }, where +n is the non-zero err_code value returned by +the Internet Computer. Earlier version of Motoko would trap in such +situations, making it difficult for the producer of the async expression +to mitigate such failures. Now, the producer can handle these errors +using an enclosing try ... catch ... expression, if +desired.

+

:::

+

Await

+

The await expression await <exp> has +type T provided:

+
    +
  • <exp> has type async T,

  • +
  • T is shared,

  • +
  • the await is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression await <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a future. If the future is incomplete, +that is, its evaluation is still pending, await <exp> +suspends evaluation of the neared enclosing async or +shared-function, adding the suspension to the wait-queue of +the future. Execution of the suspension is resumed once the +future is completed (if ever). If the future is complete with value +v, then await <exp> suspends evaluation +and schedules resumption of execution with value v. If the +future is complete with (thrown) error value e, then +await <exp> suspends evaluation and schedules +resumption of execution by re-throwing the error e.

+

Note: suspending computation on await, regardless of the +dynamic status of the future, ensures that all tentative state changes +and message sends prior to the await are committed and +irrevocable.

+

:::danger

+

Between suspension and resumption of a computation, the state of the +enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

Using await signals that the computation will +commit its current state and suspend execution.

+

:::

+

:::note

+

Because it involves additional messaging, an await on a +completed future can, in rare circumstances, fail due to a lack of +canister resources. Such failures will result in the call immediately +throwing an error with code +#call_error { err_code = n }, where n is the +non-zero err_code value returned by the Internet Computer +The error is produced eagerly, without suspending nor committing state. +Earlier versions of Motoko would trap in such situations, making it +difficult for the consumer of the await to mitigate such +failures. Now, the consumer can handle these errors by using an +enclosing try ... catch ... expression, if desired.

+

:::

+

Async*

+

The async expression async* <block-or-exp> has +type async* T provided:

+
    +
  • <block-or-exp> has type +T;

  • +
  • T is shared.

  • +
+

Any control-flow label in scope for +async* <block-or-exp> is not in scope for +<block-or-exp>. However, +<block-or-exp> may declare and use its own, local, +labels.

+

The implicit return type in <block-or-exp> is +T. That is, the return expression, +<exp0>, (implicit or explicit) to any enclosed +return <exp0>? expression, must have type +T.

+

Evaluation of async* <block-or-exp> produces a +delayed computation to evaluate <block-or-exp>. It +immediately returns a value of type async* T. The delayed +computation can be executed using await*, producing one +evaluation of the computation <block-or-exp>.

+

:::danger

+

Note that async <block-or-exp> has the effect of +scheduling a single asynchronous computation of +<exp>, regardless of whether its result, a future, is +consumed with an await. Moreover, each additional +consumption by an await just returns the previous result, +without repeating the computation.

+

In comparison, async* <block-or_exp>, has no +effect until its value is consumed by an await*. +Moreover, each additional consumption by an await* will +trigger a new evaluation of <block-or-exp>, including +repeated effects.

+

Be careful of this distinction, and other differences, when +refactoring code.

+

:::

+

:::note

+

The async* and corresponding await* +constructs are useful for efficiently abstracting asynchronous code into +re-useable functions. In comparison, calling a local function that +returns a proper async type requires committing state and +suspending execution with each await of its result, which +can be undesirable.

+

:::

+

Await*

+

The await* expression await* <exp> +has type T provided:

+
    +
  • <exp> has type async* T,

  • +
  • T is shared,

  • +
  • the await* is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression await* <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a delayed computation +<block-or-exp>. The evaluation of +await* <exp> proceeds with the evaluation of +<block-or-exp>, executing the delayed +computation.

+

:::danger

+

During the evaluation of <block-or-exp>, the state +of the enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

:::

+

:::note

+

Unlike await, which, regardless of the dynamic status of +the future, ensures that all tentative state changes and message sends +prior to the await are committed and irrevocable, +await* does not, in itself, commit any state changes, nor +does it suspend computation. Instead, evaluation proceeds immediately +according to <block-or-exp> (the value of +<exp>), committing state and suspending execution +whenever <block-or-exp> does (but not otherwise).

+

:::

+

:::note

+

Evaluation of a delayed async* block is synchronous +while possible, switching to asynchronous when necessary due to a proper +await.

+

Using await* signals that the computation may +commit state and suspend execution during the evaluation of +<block-or-exp>, that is, that evaluation of +<block-or-exp> may perform zero or more proper +awaits and may be interleaved with the execution of other, +concurrent messages.

+

:::

+

Throw

+

The throw expression throw <exp> has +type None provided:

+
    +
  • <exp> has type Error,

  • +
  • the throw is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression throw <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is an error value e. Execution proceeds from +the catch clause of the nearest enclosing +try <block-or-exp1> catch <pat> <block-or-exp2> +whose pattern <pat> matches value e. If +there is no such try expression, e is stored +as the erroneous result of the async value of the nearest +enclosing async, async* expression or +shared function invocation.

+

Try

+

The try expression +try <block-or-exp1> catch <pat> <block-or-exp2> +has type T provided:

+
    +
  • <block-or-exp1> has type +T,

  • +
  • <pat> has type Error and +<block-or-exp2> has type T in the +context extended with <pat>, and

  • +
  • the try is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression +try <block-or-exp1> catch <pat> <block-or-exp2> +evaluates <block-or-exp1> to a result r. +If evaluation of <block-or-exp1> throws an uncaught +error value e, the result of the try is the +result of evaluating <block-or-exp2> under the +bindings determined by the match of e against +pat.

+

:::note

+

Because the Error type is opaque, the pattern match +cannot fail (typing ensures that <pat> is an +irrefutable wildcard or identifier pattern).

+

:::

+

See Error type.

+

Assert

+

The assert expression assert <exp> has type +() provided <exp> has type +Bool.

+

Expression assert <exp> evaluates +<exp> to a result r. If r +is trap evaluation returns trap. Otherwise +r is a Boolean value v. The result of +assert <exp> is:

+
    +
  • the value (), when v is +true; or

  • +
  • trap, when v is +false.

  • +
+

Type annotation

+

The type annotation expression <exp> : <typ> +has type T provided:

+
    +
  • <typ> is T, and

  • +
  • <exp> has type U where +U <: T.

  • +
+

Type annotation may be used to aid the type-checker when it cannot +otherwise determine the type of <exp> or when one +wants to constrain the inferred type, U of +<exp> to a less-informative super-type T +provided U <: T.

+

The result of evaluating <exp> : <typ> is +the result of evaluating <exp>.

+

:::note

+

Type annotations have no-runtime cost and cannot be used to perform +the (checked or unchecked) down-casts available in other +object-oriented languages.

+

:::

+

Candid Serialization

+

The Candid serialization expression +to_candid ( <exp>,*) has type Blob +provided:

+
    +
  • (<exp>,*) has type (T1,…​,Tn), and +each Ti is shared.
  • +
+

Expression to_candid ( <exp>,* ) evaluates the +expression sequence ( <exp>,* ) to a result +r. If r is trap, evaluation +returns trap. Otherwise, r is a sequence of +Motoko values vs. The result of evaluating +to_candid ( <exp>,* ) is some Candid blob +b = encode((T1,...,Tn))(vs), encoding vs.

+

The Candid deserialization expression +from_candid <exp> has type ?(T1,…​,Tn) +provided:

+
    +
  • ?(T1,…​,Tn) is the expected type from the +context;

  • +
  • <exp> has type Blob; and

  • +
  • ?(T1,…​,Tn) is shared.

  • +
+

Expression from_candid <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a binary blob b. If b +Candid-decodes to Candid value sequence Vs of type +ea((T1,...,Tn)) then the result of from_candid +is ?v where v = decode((T1,...,Tn))(Vs). If +b Candid-decodes to a Candid value sequence Vs +that is not of Candid type ea((T1,...,Tn)) (but well-formed +at some other type) then the result is null. If +b is not the encoding of any well-typed Candid value, but +some arbitrary binary blob, then the result of from_candid +is a trap.

+

(Informally, here ea(_) is the Motoko-to-Candid type +sequence translation and encode/decode((T1,...,Tn))(_) are +type-directed Motoko-Candid value translations.)

+ + +

:::note

+

Operation from_candid returns null when the +argument is a valid Candid encoding of the wrong type. It traps if the +blob is not a valid Candid encoding at all.

+

:::

+

:::note

+

Operations to_candid and from_candid are +syntactic operators, not first-class functions, and must be fully +applied in the syntax.

+

:::

+

:::danger

+

The Candid encoding of a value as a blob is not unique and the same +value may have many different Candid representations as a blob. For this +reason, blobs should never be used to, for instance, compute hashes of +values or determine equality, whether across compiler versions or even +just different programs.

+

:::

+

Declaration

+

The declaration expression <dec> has type +T provided the declaration <dec> has +type T.

+

Evaluating the expression <dec> proceeds by +evaluating <dec>, returning the result of +<dec> but discarding the bindings introduced by +<dec> (if any).

+

(The expression <dec> is actually shorthand for +the block expression { <dec> }.)

+

Ignore

+

The expression ignore <exp> has type +() provided the expression <exp> has +type Any .

+

The expression ignore <exp> evaluates +<exp> (typically for some side-effect) but discards +its value.

+

Ignore is useful for evaluating an expression within a +sequence of declarations when that expression has non-unit +type (and the simpler <exp> declaration would be +ill-typed). Then the semantics is equivalent to +let _ = <exp> : Any.

+

Debug

+

The debug expression debug <block-or-exp> has type +() provided the expression +<block-or-exp> has type ().

+

When the program is compiled or interpreted with (default) flag +--debug, evaluating the expression +debug <exp> proceeds by evaluating +<block-or-exp>, returning the result of +<block-or-exp>.

+

When the program is compiled or interpreted with flag +--release, evaluating the expression +debug <exp> immediately returns the unit value +(). The code for <block-or-exp> is never +executed, nor is its code included in the compiled binary.

+

Actor references

+

The actor reference actor <exp> has expected type +T provided:

+
    +
  • the expression is used in a context expecting an expression of +type T (typically as the subject of a type annotation, +typed declaration or function argument); and

  • +
  • T is an some actor type actor { …​ }; +and

  • +
  • <exp> has type Text.

  • +
+

The argument <exp> must be, or evaluate to, the +textual format of an IC canister identifier (specified elsewhere), +otherwise the expression traps. The result of the expression is an actor +value representing that canister.

+

The validity of the canister identifier and its asserted type +T are promises and taken on trust.

+

An invalid canister identifier or type may manifest itself, if at +all, as a later dynamic failure when calling a function on the actor’s +proclaimed interface, which will either fail or be rejected.

+

:::note

+

The argument to actor should not include the +ic: resource locator used to specify an +import. For example, use actor "lg264-qjkae", +not actor "ic:lg264-qjkae".

+

:::

+

:::danger

+

Although they do not compromise type safety, actor references can +easily introduce latent, dynamic errors. Accordingly, actor references +should be used sparingly and only when needed.

+

:::

+

Parentheses

+

The parenthesized expression ( <exp> ) has type +T provided <exp> has type +T.

+

The result of evaluating ( <exp> ) is the result +of evaluating <exp>.

+

Subsumption

+

Whenever <exp> has type T and +T <: U (T subtypes U) then by +virtue of implicit subsumption, <exp> also +has type U (without extra syntax).

+

In general, this means that an expression of a more specific type may +appear wherever an expression of a more general type is expected, +provided the specific and general types are related by subtyping. This +static change of type has no runtime cost.

+

References

+
    +
  • IEEE Standard for Floating-Point Arithmetic, in IEEE Std +754-2019 (Revision of IEEE 754-2008), vol., no., pp.1-84, 22 July 2019, +doi: 10.1109/IEEESTD.2019.8766229.
  • +
+ + diff --git a/docs/html/local-objects-classes.html b/docs/html/local-objects-classes.html new file mode 100644 index 00000000000..3ed4dc23434 --- /dev/null +++ b/docs/html/local-objects-classes.html @@ -0,0 +1,557 @@ + + + + + + + md/local-objects-classes.md + + + + +
+

md/local-objects-classes.md

+
+ +

Local objects and classes

+ + +

In Motoko, an object may encapsulate local state +(var-bound variables) by packaging this state with +public methods that access and update it.

+

As in other typed languages, Motoko programs benefit from the ability +to encapsulate state as objects with abstract types.

+

However, Motoko objects that include mutable state are not +shareable, and this is a critical security-oriented design +decision.

+

If they were shareable, that would mean either conceptually moving a +mobile object’s code among actors and executing it remotely, a security +risk, or sharing state with remote logic, another security risk. +(Notably, as a subcase, objects may be pure records and those +are shareable, since they are free from mutable state.)

+

To compensate for this necessary limitation, actor +objects are shareable, but always execute remotely. They +communicate with shareable Motoko data only. Local objects interact in +less restricted ways with themselves, and can pass any Motoko data to +each other’s methods, including other objects. In most other ways, local +objects (and classes) are non-shareable counterparts to actor objects +(and classes).

+

The Mutable state introduced +declarations of private mutable state, in the form of +var-bound variables and (mutable) array allocation. In this +chapter, we use mutable state to implement simple objects, much like how +we would implement simple objects in object-oriented programming.

+

We illustrate this support via a running example, which continues in +the next chapter. The following example illustrates a general evolution +path for Motoko programs. Each object, if important enough, has +the potential to be refactored into an Internet service, by +refactoring this (local) object into an actor +object.

+

Object classes. Frequently, one needs a +family of related objects to perform a task. When objects exhibit +similar behavior, it makes sense to fabricate them according to the same +blueprint, but with customizable initial state. To this end, Motoko +provides a syntactical construct, called a class +definition, which simplifies building objects of the same type and +implementation. We introduce these after discussing objects.

+

Actor classes. When an object class exposes a service (asynchronous behavior), the +corresponding Motoko construct is an actor +class, which follows a similar (but distinct) design.

+

Example: The counter +object

+

Consider the following object declaration of the object +value counter:

+
object counter {
+  var count = 0;
+  public func inc() { count += 1 };
+  public func read() : Nat { count };
+  public func bump() : Nat {
+    inc();
+    read()
+  };
+};
+

This declaration introduces a single object instance named +counter, whose entire implementation is given above.

+

In this example, the developer exposes three public +functions inc, read and bump +using keyword public to declare each in the object body. +The body of the object, like a block expression, consists of a list of +declarations.

+

In addition to these three functions, the object has one (private) +mutable variable count, which holds the current count, +initially zero.

+

Object types

+

This object counter has the following object +type, written as a list of field-type pairs, enclosed in braces +({ and }):

+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+

Each field type consists of an identifier, a colon :, +and a type for the field content. Here, each field is a function, and +thus has an arrow type form (_ → _).

+

In the declaration of object, the variable +count was explicitly declared neither as +public nor as private.

+

By default, all declarations in an object block are +private, as is count here. Consequently, the +type for count does not appear in the type of the object, +and its name and presence are both inaccessible from the +outside.

+

The inaccessibility of this field comes with a powerful benefit: By +not exposing this implementation detail, the object has a more +general type (fewer fields), and as a result, is interchangeable +with objects that implement the same counter object type differently, +without using such a field.

+

Example: The +byteCounter object

+

To illustrate the point just above, consider this variation of the +counter declaration above, of byteCounter:

+
import Nat8 "mo:base/Nat8";
+object byteCounter {
+  var count : Nat8 = 0;
+  public func inc() { count += 1 };
+  public func read() : Nat { Nat8.toNat(count) };
+  public func bump() : Nat { inc(); read() };
+};
+

This object has the same type as the previous one, and thus from the +standpoint of type checking, this object is interchangeable with the +prior one:

+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+

Unlike the first version, however, this version does not use the same +implementation of the counter field. Rather than use an ordinary natural +Nat that never overflows, but may also grow without bound, +this version uses a byte-sized natural number (type Nat8) +whose size is always eight bits.

+

As such, the inc operation may fail with an overflow for +this object, but never the prior one, which may instead (eventually) +fill the program’s memory, a different kind of application failure.

+

Neither implementation of a counter comes without some complexity, +but in this case, they share a common type.

+

In general, a common type shared among two implementations (of an +object or service) affords the potential for the internal implementation +complexity to be factored away from the rest of the application that +uses it. Here, the common type abstracts over the simple choice of a +number’s representation. In general, the implementation choices would +each be more complex, and more interesting.

+

Object subtyping

+

To illustrate the role and use of object subtyping in Motoko, +consider implementing a simpler counter with a more general type (fewer +public operations):

+
object bumpCounter {
+  var c = 0;
+  public func bump() : Nat {
+    c += 1;
+    c
+  };
+};
+

The object bumpCounter has the following object type, +exposing exactly one operation, bump:

+
{
+  bump : () -> Nat ;
+}
+

This type exposes the most common operation, and one that only +permits certain behavior. For instance, the counter can only ever +increase, and can never decrease or be set to an arbitrary value.

+

In other parts of a system, we may in fact implement and use a +less general version, with more operations:

+
fullCounter : {
+  inc   : () -> () ;
+  read  : () -> Nat ;
+  bump  : () -> Nat ;
+  write : Nat -> () ;
+}
+

Here, we consider a counter named fullCounter with a +less general type than any given above. In addition to inc, +read and bump, it additionally includes +write, which permits the caller to change the current count +value to an arbitrary one, such as back to 0.

+

Object subtyping. In Motoko, objects have types that +may relate by subtyping, as the various types of counters do above. As +is standard, types with more fields are less general +(are subtypes of) types with fewer +fields. For instance, we can summarize the types given in the +examples above as being related in the following subtyping order:

+
    +
  • Most general:
  • +
+
{ bump : () -> Nat }
+
    +
  • Middle generality:
  • +
+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+
    +
  • Least generality:
  • +
+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+  write : Nat -> () ;
+}
+

If a function expects to receive an object of the first type +({ bump: () → Nat }), any of the types given above +will suffice, since they are each equal to, or a subtype of, this (most +general) type.

+

However, if a function expects to receive an object of the last, +least general type, the other two will not suffice, since they +each lack the needed write operation, to which this +function rightfully expects to have access.

+

Object classes

+

In Motoko, an object encapsulates state, and an object +class is a package of two entities that share a common +name.

+

Consider this example class for counters that start at +zero:

+
class Counter() {
+  var c = 0;
+  public func inc() : Nat {
+    c += 1;
+    return c;
+  }
+};
+

The value of this definition is that we can construct new +counters, each starting with their own unique state, initially at +zero:

+
let c1 = Counter();
+let c2 = Counter();
+

Each is independent:

+
let x = c1.inc();
+let y = c2.inc();
+(x, y)
+

We could achieve the same results by writing a function that returns +an object:

+
func Counter() : { inc : () -> Nat } =
+  object {
+    var c = 0;
+    public func inc() : Nat { c += 1; c }
+  };
+

Notice the return type of this constructor function (an +object type):

+
{ inc : () -> Nat }
+

We may want to name this type, for example, Counter, as +follows, for use in further type declarations:

+
type Counter = { inc : () -> Nat };
+

In fact, the class keyword syntax shown above is nothing +but a shorthand for these two definitions for Counter: a +factory function Counter that constructs objects, and the +type Counter of these objects. Classes do not provide any +new functionality beyond this convenience.

+

Class constructor

+

An object class defines a constructor function that may carry zero or +more data arguments and zero or more type arguments.

+

The Counter example above has zero of each.

+

The type arguments, if any, parameterize both the type and the +constructor function for the class.

+

The data arguments, if any, parameterize (only) the constructor +function for the class.

+

Data arguments

+

Suppose we want to initialize the counter with some non-zero value. +We can supply that value as a data argument to the class +constructor:

+
class Counter(init : Nat) {
+  var c = init;
+  public func inc() : Nat { c += 1; c };
+};
+

This parameter is available to all methods.

+

For instance, we can reset the Counter to +its initial value, a parameter:

+
class Counter(init : Nat) {
+  var c = init;
+  public func inc() : Nat { c += 1; c };
+  public func reset() { c := init };
+};
+

Type arguments

+

Suppose we want the counter to actually carry data that it counts +(like a specialized Buffer).

+

When classes use or contain data of arbitrary type, they carry a type +argument (or equivalently, type parameter) for that unknown +type, just as with functions.

+

The scope of this type parameter covers the entire +class, just as with data parameters. As such, the methods +of the class can use (and need not re-introduce) these type +parameters.

+
import Buffer "mo:base/Buffer";
+
+class Counter<X>(init : Buffer.Buffer<X>) {
+  var buffer = init.clone();
+  public func add(x : X) : Nat {
+    buffer.add(x);
+    buffer.size()
+  };
+
+  public func reset() {
+    buffer := init.clone()
+  };
+};
+

Type annotation

+

Optionally, the class constructor may also carry a type annotation +for its "return type" (the type of objects that it produces). When +supplied, Motoko checks that this type annotation is compatible with the +body of the class (an object definition). This check ensures that each +object produced by the constructor meets the supplied specification.

+

For example, we repeat the Counter as a buffer, and +annotate it with a more general type Accum<X> that +permits adding, but not resetting the counter. This annotation ensures +that the objects are compatible with the type +Accum<X>.

+
import Buffer "mo:base/Buffer";
+
+type Accum<X> = { add : X -> Nat };
+
+class Counter<X>(init : Buffer.Buffer<X>) : Accum<X> {
+  var buffer = init.clone();
+  public func add(x : X) : Nat { buffer.add(x); buffer.size() };
+  public func reset() { buffer := init.clone() };
+};
+

Full syntax

+

In full, classes are defined by the keyword class, +followed by: - a name for the constructor and type being defined (for +example, Counter) - optional type arguments (for example, +omitted, or <X>, or <X, Y>) - an +argument list (for example, (), or +(init : Nat), etc.) - an optional type annotation for the +constructed objects (for example, omitted, or +Accum<X>), - the class "body" is an object +definition, parameterized by the type and value arguments (if any).

+

The constituents of the body marked public contribute to +the resulting objects' type and these types compared against the +(optional) annotation, if given.

+
Another example: Bits
+

As another example, let’s consider the task of walking the bits of a +natural number (type Nat). For this example, we could +define the following:

+
class Bits(n : Nat) {
+  var state = n;
+  public func next() : ?Bool {
+    if (state == 0) { return null };
+    let prev = state;
+    state /= 2;
+    ?(state * 2 != prev)
+  }
+}
+

The above class definition is equivalent to the simultaneous +definition of a structural type synonym and a factory function, both +named Bits:

+
type Bits = {next : () -> ?Bool};
+func Bits(n : Nat) : Bits = object {
+  // class body
+};
+

Structural subtyping

+

Object subtyping in Motoko uses structural subtyping, not +nominal subtyping.

+

Recall that in nominal typing, the question of two types equality +depends on choosing consistent, globally-unique type names (across +projects and time).

+

In Motoko, the question of two types' equality is based on their +structure, not their names.

+

Due to structural typing, naming the class type provides a convenient +abbreviation.

+

For typing purposes, however, all that matters is the +structure of the corresponding object type: two classes with +different names but equivalent definitions produce type-compatible +objects.

+

When the optional type annotation is supplied in a class declaration, +conformance is checked: the object type must be a subtype of the +annotation. The annotation does not affect the type of the class, +however, even if it only describes a proper super-type of the object +type.

+

Formally, subtyping relationships in Motoko extend to all types, not +just object types.

+

Most cases are standard, and follow conventional programming language +theory (for structural subtyping, specifically).

+

Other notable cases in Motoko for new programmers include array, +options, variants and number type inter-relationships.

+ + diff --git a/docs/html/message-inspection.html b/docs/html/message-inspection.html new file mode 100644 index 00000000000..8d8f5dc9aee --- /dev/null +++ b/docs/html/message-inspection.html @@ -0,0 +1,325 @@ + + + + + + + md/message-inspection.md + + + + +
+

md/message-inspection.md

+
+ +

Message inspection

+

On the Internet Computer, a canister can selectively inspect +and accept or decline ingress messages submitted +through the HTTP interface:

+
+

A canister can inspect ingress messages before executing them. When +the IC receives an update call from a user, the IC will use the canister +method canister_inspect_message to determine whether the +message shall be accepted. If the canister is empty (i.e. does not have +a Wasm module), then the ingress message will be rejected. If the +canister is not empty and does not implement +canister_inspect_message, then the ingress message will be +accepted.

+

In canister_inspect_message, the canister can accept the +message by invoking ic0.accept_message : () → (). This +function traps if invoked twice. If the canister traps in +canister_inspect_message or does not call +ic0.accept_message, then the access is denied.

+

The canister_inspect_message is not invoked for +HTTP query calls, inter-canister calls or calls to the management +canister.

+

IC +Interface Specification

+
+

Message inspection mitigates some denial of service attacks, designed +to drain canisters of cycles by placing unsolicited free calls.

+

:::note

+

You can think of method inspection as providing the "Collect call +from name. Do you accept charges?" prologue of an +old-fashioned, operator-assisted, collect phone call.

+

:::

+

In Motoko, actors can elect to inspect and accept or decline ingress +messages by declaring a particular system function called +inspect. Given a record of message attributes, this +function produces a Bool that indicates whether to accept +or decline the message by returning true or +false. The function is invoked (by the system) on each +ingress message. Similar to a query, any side-effects of an invocation +are discarded and transient. A call that traps due to some fault has the +same result as returning false (message declination).

+

Unlike other system functions, that have a fixed argument type, the +argument type of inspect depends on the interface of the +enclosing actor. In particular, the formal argument of +inspect is a record of fields of the following types:

+
    +
  • caller : Principal: the principal, possibly +anonymous, of the caller of the message;

  • +
  • arg : Blob: the raw, binary content of the message +argument;

  • +
  • msg : <variant>: a variant of +decoding functions, where +<variant> == {…​; #<id>: () → T; …​} contains one +variant per shared function, <id>, of the actor. The +variant’s tag identifies the function to be called; The variant’s +argument is a function that, when applied, returns the (decoded) +argument of the call as a value of type T.

  • +
+

Using a variant, tagged with #<id>, allows the +return type, T, of the decoding function to vary with the +argument type (also T) of the shared function +<id>.

+

The variant’s argument is a function so that one can avoid the +expense of message decoding (when appropriate).

+

Exploiting subtyping, the formal argument can omit record fields it +does not require, or selectively ignore the arguments of particular +shared functions, for example, in order to simply dispatch on the name +of a function without inspecting its actual argument.

+

:::note

+

Confusingly, a shared query function can be +called using a regular HTTP update call to obtain a certified response: +this is why the variant type also includes shared query +functions. A shared composite query function, on the other +hand, cannot be called as an update call, and only with the +faster, but uncertified, HTTP query call. This is why the +inspect variant type includes shared query +functions, but not shared composite query functions.

+

:::

+

:::danger

+

An actor that fails to declare system field inspect will +simply accept all ingress messages.

+

:::

+

:::danger

+

System function inspect should not be +used for definitive access control. This is because inspect +is executed by a single replica, without full consensus, and its result +could be spoofed by a malicious boundary node. Reliable access control +checks can only be performed within the shared functions +guarded by inspect.

+

:::

+

Example

+

A simple, contrived example of method inspection is a counter actor, +that inspects some of its messages in detail, and others only +superficially:

+
+

Note that, due to subtyping, all of the following variations, in +order of increasing argument specificity, are legal definitions of +inspect.

+

Blanket denial of all ingress messages, ignoring further +information:

+
+

Declining anonymous calls:

+
+

Declining large messages, based on the raw size (in bytes) of +arg (prior to any decoding from Candid binary blob to +Motoko value):

+
+

Declining messages by name only, ignoring message arguments (note the +use of type Any as message argument variants):

+
+

A combination of the previous three, specifying the argument types of +some variants while ignoring others at type Any and using +pattern matching to conflate identical cases.

+
+

Tips on authoring +inspect

+

Implementing inspect after the fact, once all shared +functions of an actor have already been implemented, can be tedious, +since you’ll need to declare a correctly typed variant for each shared +function. A simple trick is to first implement the function +incorrectly, with a () argument, compile the code, +then use the compiler’s error message to obtain the required argument +type.

+

For example, in the actor from the previous section, incorrectly +declaring:

+
+

forces the compiler to report the expected type below:

+
Inspect.mo:12.4-14.5: type error [M0127], system function inspect is declared with type
+  () -> Bool
+instead of expected type
+  {
+    arg : Blob;
+    caller : Principal;
+    msg :
+      {
+        #inc : () -> ();
+        #read : () -> ();
+        #reset : () -> ();
+        #set : () -> Nat
+      }
+  } -> Bool
+

which you can now cut-and-paste into your code.

+ + diff --git a/docs/html/modules-and-imports.html b/docs/html/modules-and-imports.html new file mode 100644 index 00000000000..d866aeb9c2b --- /dev/null +++ b/docs/html/modules-and-imports.html @@ -0,0 +1,350 @@ + + + + + + + md/modules-and-imports.md + + + + +
+

md/modules-and-imports.md

+
+ +

Modules and imports

+

This section provides examples of different scenarios for using the +module and import keywords.

+

To illustrate how these keywords are used, let’s step through some +sample code.

+

Importing from the +Motoko base library

+

One of the most common import scenarios is one that you see +illustrated in the examples in this guide, in the Motoko projects in the +examples repository, and in the tutorials involves importing modules +from the Motoko base library. Importing modules from the base library +enables you to re-use the values, functions and types defined in those +modules rather than writing similar ones from scratch.

+

The following two lines import functions from the Array +and Result modules:

+
import Array "mo:base/Array";
+import Result "mo:base/Result";
+

Notice that the import declaration includes the mo: +prefix to identify the module as a Motoko module and that the +declaration does not include the .mo file type +extension.

+

Above example uses an identifier pattern to import modules wholesale, +but you can also selectively import a subset of symbols from a module by +resorting to the object pattern syntax:

+
import { map; find; foldLeft = fold } = "mo:base/Array";
+

In this example, the functions map and find +are imported unaltered, while the foldLeft function is +renamed to fold.

+

Importing local files

+

Another common approach to writing programs in Motoko involves +splitting up the source code into different modules. For example, you +might design an application to use the following model:

+
    +
  • a main.mo file to contain the actor and functions +that change state.

  • +
  • a types.mo file for all of your custom type +definitions.

  • +
  • a utils.mo file for functions that do work outside +of the actor.

  • +
+

In this scenario, you might place all three files in the same +directory and use a local import to make the functions available where +they are needed.

+

For example, the main.mo contains the following lines to +reference the modules in the same directory:

+
import Types "types";
+import Utils "utils";
+

Because these lines import modules from the local project instead of +the Motoko library, these import declarations don’t use the +mo: prefix.

+

In this example, both the types.mo and +utils.mo files are in the same directory as the +main.mo file. Once again, import does not use the +.mo file suffix.

+

Importing from +another package or directory

+

You can also import modules from other packages or from directories +other than the local directory.

+

For example, the following lines import modules from a +redraw package that is defined as a dependency:

+
import Render "mo:redraw/Render";
+import Mono5x5 "mo:redraw/glyph/Mono5x5";
+

You can define dependencies for a project using the Vessel package +manager or in the project dfx.json configuration file.

+

In this example, the Render module is in the default +location for source code in the redraw package and the +Mono5x5 module is in a redraw package +subdirectory called glyph.

+

Importing actor classes

+

While module imports are typically used to import libraries of local +functions and values, they can also be used to import actor classes. +When an imported file consists of a named actor class, the client of the +imported field sees a module containing the actor class.

+

This module has two components, both named after the actor class:

+
    +
  • a type definition, describing the interface of the class, +and

  • +
  • an asynchronous function, that takes the class parameters as +arguments an asynchronously returns a fresh instance of the +class.

  • +
+

For example, a Motoko actor can import and instantiate the +Counter class described in Actors and async +data as follows:

+

Counters.mo:

+
+

CountToTen.mo:

+
+

The call to Counters.Counter(1) installs a fresh counter +on the network. Installation is asynchronous, so the caller must +await the result.

+

The type annotation : Counters.Counter is redundant +here. It’s included only to illustrate that the type of the actor class +is available when required.

+

Importing from +another canister smart contract

+

In addition to the examples above that import Motoko modules, you can +also import actors (and their shared functions) from canister smart +constracts by using the canister: prefix in place of the +mo: prefix.

+

:::note

+

Unlike a Motoko library, an imported canister can be implemented in +any other Internet Computer language that emits Candid interfaces for +its canister smart contracts (for instance Rust). It could even be an +older or newer version of Motoko.

+

:::

+

For example, you might have a project that produces the following +three canisters:

+
    +
  • BigMap (implemented in Rust)

  • +
  • Connectd (implemented in Motoko)

  • +
  • LinkedUp (implemented in Motoko)

  • +
+

These three canisters are declared in the project’s +dfx.json configuration file and compiled by running +dfx build.

+

You can then use the following lines to import the +BigMap and Connectd canisters as actors in the +Motoko LinkedUp actor:

+
import BigMap "canister:BigMap";
+import Connectd "canister:connectd";
+

When importing canisters, it is important to note that the type for +the imported canister corresponds to a Motoko actor +instead of a Motoko module. This distinction can affect +how some data structures are typed.

+

For the imported canister actor, types are derived from the Candid +file — the project-name.did file — for the canister rather than +from Motoko itself.

+

The translation from Motoko actor type to Candid service type is +mostly, but not entirely, one-to-one, and there are some distinct Motoko +types that map to the same Candid type. For example, the Motoko +Nat32 and Char types both exported as Candid +type nat32, but nat32 is canonically imported +as Motoko Nat32, not Char.

+

The type of an imported canister function, therefore, might differ +from the type of the original Motoko code that implements it. For +example, if the Motoko function had type +shared Nat32 -> async Char in the implementation, its +exported Candid type would be (nat32) -> (nat32) but the +Motoko type imported from this Candid type will actually be the +correct—but perhaps unexpected—type +shared Nat32 -> async Nat32.

+

Naming imported modules

+

Although the most common convention is to identify imported modules +by the module name as illustrated in the examples above, there’s no +requirement for you to do so. For example, you might want to use +different names to avoid naming conflicts or to simplify the naming +scheme.

+

The following examples illustrate different names you might use when +importing the List base library module, avoiding a clash +with another List library from a fictional +collections package.

+
import List "mo:base/List:";
+import Sequence "mo:collections/List";
+import L "mo:base/List";
+ + diff --git a/docs/html/motoko-grammar.html b/docs/html/motoko-grammar.html new file mode 100644 index 00000000000..252d8ff6a81 --- /dev/null +++ b/docs/html/motoko-grammar.html @@ -0,0 +1,181 @@ + + + + + + + md/motoko-grammar.md + + + + +
+

md/motoko-grammar.md

+
+ +

Motoko grammar

+

This section describes the concrete syntax, or grammar, of Motoko. +The specification is auto-generated with a tool.

+
+ + diff --git a/docs/html/motoko-introduction.html b/docs/html/motoko-introduction.html new file mode 100644 index 00000000000..e554cbc5125 --- /dev/null +++ b/docs/html/motoko-introduction.html @@ -0,0 +1,384 @@ + + + + + + + md/motoko-introduction.md + + + + +
+

md/motoko-introduction.md

+
+ +

Introduction

+

Motoko is a modern, general-purpose programming language you can use +specifically to author Internet +Computer canister smart contracts. Although aimed squarely at the +Internet Computer, its design is general enough to support future +compilation to other targets.

+

Approachability

+

Motoko is a modern language designed to be approachable for +programmers who have some basic familiarity with modern object-oriented +and/or functional programming idioms in either JavaScript, or another +modern programming language, such as Rust, Swift, TypeScript, C#, or +Java.

+

Asynchronous +messaging and type sound execution

+

Motoko permits modern programming idioms, including special +programming abstractions for distributed applications (dapps). Each dapp +consists of one or more actors that communicate solely by +asynchronous message passing. The state of an actor is isolated +from all other actors, supporting distribution. There is no way to share +state between several actors. The actor-based programming abstractions +of Motoko permit human-readable message-passing patterns, and they +enforce that each network interaction obeys certain rules and avoids +certain common mistakes.

+

Specifically, Motoko programs are type sound since Motoko +includes a practical, modern type system that checks each one before it +executes. The Motoko type system statically checks that each Motoko +program will execute safely, without dynamic type errors, on all +possible inputs. Consequently, entire classes of common programming +pitfalls that are common in other languages, and web programming +languages in particular, are ruled out. This includes null reference +errors, mis-matched argument or result types, missing field errors and +many others.

+

To execute, Motoko statically compiles to WebAssembly, a portable +binary format that abstracts cleanly over modern computer hardware, and +thus permits its execution broadly on the Internet, and the Internet Computer.

+

Each canister smart +contract as an actor

+

Motoko provides an actor-based programming model to +developers to express services, including those of canister +smart contracts on the Internet +Computer.

+

An actor is similar to an object, but is special in that its state is +completely isolated, and all its interactions with the world are by +asynchronous messaging.

+

All communication with and between actors involves passing messages +asynchronously over the network using the Internet Computer’s messaging +protocol. An actor’s messages are processed in sequence, so state +modifications never admit race conditions (unless explicitly allowed by +punctuating await expressions).

+

The Internet Computer ensures that each message that is sent receives +a response. The response is either success with some value, or an error. +An error can be the explicit rejection of the message by the receiving +canister, a trap due to an illegal instruction such as division by zero, +or a system error due to distribution or resource constraints. For +example, a system error might be the transient or permanent +unavailability of the receiver (either because the receiving actor is +oversubscribed or has been deleted).

+

Asynchronous actors

+

Like other modern programming languages, Motoko permits an +ergonomic syntax for asynchronous communication among +components.

+

In the case of Motoko, each communicating component is an actor.

+

As an example of using actors, perhaps as an actor +ourselves, consider this three-line program:

+
let result1 = service1.computeAnswer(params);
+let result2 = service2.computeAnswer(params);
+finalStep(await result1, await result2)
+

We can summarize the program’s behavior with three steps:

+
    +
  1. The program makes two requests (lines 1 and 2) to two distinct +services, each implemented as a Motoko actor or canister smart contract +implemented in some other language.

  2. +
  3. The program waits for each result to be ready (line 3) using the +keyword await on each result value.

  4. +
  5. The program uses both results in the final step (line 3) by +calling the finalStep function.

  6. +
+

Generally-speaking, the services interleave their executions +rather than wait for one another, since doing so reduces overall +latency. However, if we try to reduce latency this way without +special language support, such interleaving will quickly sacrifice +clarity and simplicity.

+

Even in cases where there are no interleaving executions +(for example, if there were only one call above, not two), the +programming abstractions still permit clarity and simplicity, for the +same reason. Namely, they signal to the compiler where to transform the +program, freeing the programmer from contorting the program’s logic in +order to interleave its execution with the underlying system’s +message-passing loop.

+

Here, the program uses await in line 3 to express that +interleaving behavior in a simple fashion, with human-readable syntax +that is provided by Motoko.

+

In language settings that lack these abstractions, developers would +not merely call these two functions directly, but would instead employ +very advanced programming patterns, possibly registering +developer-provided “callback functions” within system-provided “event +handlers”. Each callback would handle an asynchronous event that arises +when an answer is ready. This kind of systems-level programming is +powerful, but very error-prone, since it decomposes a high-level data +flow into low-level system events that communicate through shared state. +Sometimes this style is necessary, but here it is not.

+

Our program instead eschews that more cumbersome programming style +for this more natural, direct style, where each request +resembles an ordinary function call. This simpler, stylized programming +form has become increasingly popular for expressing practical systems +that interact with an external environment, as most modern +software does today. However, it requires special compiler and +type-system support, as we discuss in more detail below.

+

Support for +asynchronous behavior

+

In an asynchronous computing setting, a program and its +running environment are permitted to perform internal +computations that occur concurrently with one another.

+

Specifically, asynchronous programs are ones where the program’s +requests of its environment do not (necessarily) require the program to +wait for the environment. In the meantime, the program is permitted to +make internal progress within this environment while the environment +proceeds to complete the request. In the example, above, the program +issues the second request before waiting for the first request to +complete.

+

Symmetrically, the environment’s requests of the program do not +(necessarily) require the environment to wait for the program’s answer: +the environment can make external progress while the answer is +produced.

+

We do not show an example of this “notify” pattern above, since it +uses callbacks (and higher-order functions and control flow) +and is thus more complex.

+

Syntactic forms +async and await

+

To address the need for clarity and simplicity, Motoko adopts the +increasingly-common program constructs async and +await, which afford the programmer a structured +language for describing potentially-complex asynchronous dependency +graphs.

+

The async syntax introduces +futures. A future value represents a promise of a result +that will be delivered, asynchronously, sometime in the future +(not shown in the first example above). You’ll learn more about futures +when we introduce actors in Actors and async +data.

+

Here, we merely use the ones that arise from calling +service1.computeAnswer(params) and +service2.computeAnswer(params).

+

The syntax await synchronizes on a future, and suspends +computation until the future is completed by its producer. We see two +uses of await in the example above, to obtain the results +from two calls to services.

+

When the developer uses these keywords, the compiler transforms the +program as necessary, often doing complex transformations to the +program’s control- and data-flow that would be tedious to perform by +hand in a purely synchronous language. Meanwhile, the type system of +Motoko enforces certain correct usage patterns for these constructs, +including that types flowing between consumers and producers always +agree, and that the types of data sent among services are permitted to +flow there, and do not (for example) contain private mutable state.

+

Types are static

+

Like other modern programming languages, Motoko permits each variable +to carry the value of a function, object, or a primitive datum (for +example, a string, word, or integer). Other types of values exist too, +including records, tuples, and “tagged data” called +variants.

+

Motoko enjoys the formal property of type safety, also known as +type soundness. We often summarize this idea with the phrase: +Well-typed Motoko programs +don’t go wrong, meaning that the only operations that will be +performed on data are those permitted by its static type.

+

For example, each variable in a Motoko program carries an associated +type, and this type is known statically, before the +program executes. Each use of each variable is checked by the compiler +to prevent runtime type errors, including null reference errors, invalid +field access and the like.

+

In this sense, Motoko types provide a form of trustworthy, +compiler-verified documentation in the program +source code.

+

As usual, dynamic testing can check properties that are beyond the +reach of the Motoko type system. While modern, the Motoko type system is +intentionally not “advanced” or particularly exotic. Rather, +the type system of Motoko integrates standard concepts from modern, but +well-understood, modern type systems +to provide an approachable, expressive yet safe language for programming +general-purpose, distributed applications.

+ + diff --git a/docs/html/motoko.html b/docs/html/motoko.html new file mode 100644 index 00000000000..1e01f575e5d --- /dev/null +++ b/docs/html/motoko.html @@ -0,0 +1,307 @@ + + + + + + + md/motoko.md + + + + +
+

md/motoko.md

+
+ +

Motoko Programming Language

+

:::tip

+

The Motoko programming language continues to evolve with each release +of the IC +SDK and with ongoing updates to the Motoko compiler. Check back +regularly to try new features and see what’s changed.

+

:::

+

The Motoko programming language is a new, modern and type safe +language for developers who want to build the next generation of +distributed applications to run on the Internet Computer blockchain +network. Motoko is specifically designed to support the unique features +of the Internet Computer and to provide a familiar yet robust +programming environment. As a new language, Motoko is constantly +evolving with support for new features and other improvements.

+

The Motoko compiler, documentation and other tooling is open source and released +under the Apache 2.0 license. Contributions are welcome.

+

Native canister smart +contract support

+

Motoko has native support for Internet Computer canister smart +contracts.

+

A canister smart contract (or canister for short) is expressed as a +Motoko actor. An actor is an autonomous object that fully encapsulates +its state and communicates with other actors only through asynchronous +messages.

+

For example, this code defines a stateful Counter +actor.

+
+

Its single public function, inc(), can be invoked by +this and other actors, to both update and read the current state of its +private field value.

+

Code sequentially in direct +style

+

On the Internet Computer, canisters can communicate with other +canisters by sending asynchronous messages.

+

Asynchronous programming is hard, so Motoko enables you to author +asynchronous code in much simpler, sequential style. Asynchronous +messages are function calls that return a future, and the +await construct allows you to suspend execution until a +future has completed. This simple feature avoids the "callback hell" of +explicit asynchronous programming in other languages.

+
+

Modern type system

+

Motoko has been designed to be intuitive to those familiar with +JavaScript and other popular languages, but offers modern features such +as sound structural types, generics, variant types, and statically +checked pattern matching.

+
+

Autogenerated IDL files

+

A Motoko actor always presents a typed interface to its clients as a +suite of named functions with argument and (future) result types.

+

The Motoko compiler (and SDK) can emit this interface in a language +neutral format called Candid, so other canisters, browser resident code +and smart phone apps that support Candid can use the actor’s services. +The Motoko compiler can consume and produce Candid files, allowing +Motoko to seamlessly interact with canisters implemented in other +programming languages (provided they support Candid).

+

For example, the previous Motoko Counter actor has the +following Candid interface:

+
service Counter : {
+  inc : () -> (nat);
+}
+

Orthogonal persistence

+

The Internet Computer persists the memory and other state of your +canister as it executes. Thus the state of a Motoko actor, including its +in-memory data structures, survive indefinitely. Actor state does not +need to be explicitly "restored" and "saved" to external storage, with +every message.

+

For example, in the following Registry actor (canister), +that assigns sequential IDs to textual names, the state of the hash +table is preserved across calls, even though the state of the actor is +replicated across many Internet Computer node machines, and typically +not resident in memory.

+
+

Upgrades

+

Motoko provides numerous features to help you leverage orthogonal +persistence, including language features that allow you to retain a +canister’s data as you upgrade the code of the canister.

+

For example, Motoko lets you declare certain variables as +stable. The values of stable variables are +automatically preserved across canister upgrades.

+

Consider a stable counter:

+
+

It can be installed, incremented n times, and then upgraded, +without interruption, to, for example, the richer implementation:

+
+

Because value was declared stable, the +current state, n, of the service is retained after the upgrade. +Counting will continue from n, not restart from +0.

+

Because the new interface is compatible with the previous one, +existing clients referencing the canister will continue to work, but new +clients will be able to exploit its upgraded functionality (the +additional reset function).

+

For scenarios that can’t be solved using stable variables alone, +Motoko provides user-definable upgrade hooks that run immediately before +and after upgrade, and allow you to migrate arbitrary state to stable +variables.

+

And more …​

+

Motoko provides many other developer productivity features, including +subtyping, arbitrary precision arithmetic and garbage collection.

+

Motoko is not, and is not intended to be, the only language for +implementing canister smart contracts. If it doesn’t suit your needs, +there is a canister development kit (CDK) for the Rust programming +language. Our goal is to enable any language (with a compiler that +targets WebAssembly) to be able to produce canister smart contracts that +run on the Internet Computer and interoperate with other, perhaps +foreign, canister smart contracts through language neutral Candid +interfaces.

+

Its tailored design means Motoko should be the easiest and safest +language for coding on the Internet Computer, at least for the +forseeable future.

+ + diff --git a/docs/html/mutable-state.html b/docs/html/mutable-state.html new file mode 100644 index 00000000000..1dcd67aa1b2 --- /dev/null +++ b/docs/html/mutable-state.html @@ -0,0 +1,485 @@ + + + + + + + md/mutable-state.md + + + + +
+

md/mutable-state.md

+
+ +

Mutable state

+

Each actor in Motoko may use, but may never directly share, +internal mutable state.

+

Later, we discuss sharing among actors, +where actors send and receive immutable data, and also handles +to each others external entry points, which serve as shareable +functions. Unlike those cases of shareable data, a key Motoko +design invariant is that mutable data is kept +internal (private) to the actor that allocates it, and is never +shared remotely.

+

In this chapter, we continue using minimal examples to show how to +introduce (private) actor state, and use mutation operations to change +it over time.

+

In local objects and classes, +we introduce the syntax for local objects, and a minimal +counter actor with a single mutable variable. In the following chapter, we show an actor with the +same behavior, exposing the counter variable indirectly behind an +associated service interface for using it remotely.

+

Immutable versus mutable +variables

+

The var syntax declares mutable variables in a +declaration block:

+
let text  : Text = "abc";
+let num  : Nat = 30;
+
+var pair : (Text, Nat) = (text, num);
+var text2 : Text = text;
+

The declaration list above declares four variables. The first two +variables (text and num) are lexically-scoped, +immutable variables. The final two variables (pair +and text2) are lexically-scoped, +mutable variables.

+

Assignment to mutable memory

+

Mutable variables permit assignment, and immutable variables do +not.

+

If we try to assign new values to either text or +num above, we will get static type errors; these variables +are immutable.

+

However, we may freely update the value of mutable variables +pair and text2 using the syntax for +assignment, written as :=, as follows:

+
text2 := text2 # "xyz";
+pair := (text2, pair.1);
+pair
+

Above, we update each variable based on applying a simple “update +rule” to their current values (for example, we update +text2 by appending string constant "xyz" to +its suffix). Likewise, an actor processes some calls by performing +updates on its internal (private) mutable variables, using the +same assignment syntax as above.

+

Special assignment +operations

+

The assignment operation := is general, and works for +all types.

+

Motoko also includes special assignment operations that combine +assignment with a binary operation. The assigned value uses the binary +operation on a given operand and the current contents of the assigned +variable.

+

For example, numbers permit a combination of assignment and +addition:

+
var num2 = 2;
+num2 += 40;
+num2
+

After the second line, the variable num2 holds +42, as one would expect.

+

Motoko includes other combinations as well. For example, we can +rewrite the line above that updates text2 more concisely +as:

+
text2 #= "xyz";
+text2
+

As with +=, this combined form avoids repeating the +assigned variable’s name on the right hand side of the (special) +assignment operator #=.

+

The full table assignment operators +lists numerical, logical, and textual operations over appropriate types +(number, boolean and text values, respectively).

+

Reading from mutable memory

+

When we updated each variable, we also first read from the +mutable contents, with no special syntax.

+

This illustrates a subtle point: Each use of a mutable variable +looks like the use of an immutable variable, but does not +act like one. In fact, its meaning is more complex. As in many +languages (JavaScript, Java, C#, etc.), but not all, the syntax of each +use hides the memory effect that accesses the memory cell +identified by that variable, and gets its current value. Other languages +from functional traditions (SML, OCaml, Haskell, etc), generally expose +these effects syntactically.

+

Below, we explore this point in detail.

+

Understanding +var- versus let-bound variables

+

Consider the following two variable declarations, which look +similar:

+
let x : Nat = 0
+

and:

+
var x : Nat = 0
+

The only difference in their syntax is the use of keyword +let versus var to define the variable +x, which in each case the program initializes to +0.

+

However, these programs carry different meanings, and in the context +of larger programs, the difference in meanings will impact the meaning +of each occurrence of x.

+

For the first program, which uses let, each such +occurrence means 0. Replacing each occurrence with +0 will not change the meaning of the program.

+

For the second program, which uses var, each occurrence +means: “read and produce the current value of the mutable +memory cell named x.” In this case, each occurrence’s value +is determined by dynamic state: the contents of the mutable memory cell +named x.

+

As one can see from the definitions above, there is a fundamental +contrast between the meanings of let-bound and +var-bound variables.

+

In large programs, both kinds of variables can be useful, and neither +kind serves as a good replacement for the other.

+

However, let-bound variables are more +fundamental.

+

To see why, consider encoding a var-bound variable using +a one-element, mutable array, itself bound using a +let-bound variable.

+

For instance, instead of declaring x as a mutable +variable initially holding 0, we could instead use +y, an immutable variable that denotes a mutable array with +one entry, holding 0:

+
var x : Nat       = 0 ;
+let y : [var Nat] = [var 0] ;
+

We explain mutable arrays in more detail below.

+

Unfortunately, the read and write syntax required for this encoding +reuses that of mutable arrays, which is not as readable as that of +var-bound variables. As such, the reads and writes of +variable x will be easier to read than those of variable +y.

+

For this practical reason, and others, var-bound +variables are a core aspect of the language design.

+

Immutable arrays

+

Before discussing mutable arrays, we +introduce immutable arrays, which share the same projection syntax, but +do not permit mutable updates (assignments) after allocation.

+

Allocate an immutable +array of constants

+
let a : [Nat] = [1, 2, 3] ;
+

The array a above holds three natural numbers, and has +type [Nat]. In general, the type of an immutable array is +[_], using square brackets around the type of the array’s +elements, which must share a single common type, in this case +Nat.

+

Project from (read from) +an array index

+

We can project from (read from) an array using the usual +bracket syntax ([ and ]) around the index we +want to access:

+
let x : Nat = a[2] + a[0] ;
+

Every array access in Motoko is safe. Accesses that are out of bounds +will not access memory unsafely, but instead will cause the program to +trap, as with an assertion +failure.

+

The Array module

+

The Motoko standard library provides basic operations for immutable +and mutable arrays. It can be imported as follows,

+
import Array "mo:base/Array";
+

In this section, we discuss some of the most frequently used array +operations. For more information about using arrays, see the Array library descriptions.

+

Allocate an +immutable array with varying content

+

Above, we showed a limited way of creating immutable arrays.

+

In general, each new array allocated by a program will contain a +varying number of varying elements. Without mutation, we need a way to +specify this family of elements "all at once", in the argument to +allocation.

+

To accommodate this need, the Motoko language provides the +higher-order array-allocation function Array.tabulate, +which allocates a new array by consulting a user-provided "generation +function" gen for each element.

+
func tabulate<T>(size : Nat,  gen : Nat -> T) : [T]
+

Function gen specifies the array as a function +value of arrow type Nat → T, where T is +the final array element type.

+

The function gen actually functions as the +array during its initialization: It receives the index of the array +element, and it produces the element (of type T) that +should reside at that index in the array. The allocated output array +populates itself based on this specification.

+

For instance, we can first allocate array1 consisting of +some initial constants, and then functionally-update some of +the indices by "changing" them (in a pure, functional way), to produce +array2, a second array that does not destroy the first.

+
let array1 : [Nat] = [1, 2, 3, 4, 6, 7, 8] ;
+
+let array2 : [Nat] = Array.tabulate<Nat>(7, func(i:Nat) : Nat {
+    if ( i == 2 or i == 5 ) { array1[i] * i } // change 3rd and 6th entries
+    else { array1[i] } // no change to other entries
+  }) ;
+

Even though we "changed" array1 into array2 +in a functional sense, notice that both arrays and both variables are +immutable.

+

Next, we consider mutable arrays, which are fundamentally +distinct.

+

Mutable arrays

+

Above, we introduced immutable arrays, which share the same +projection syntax as mutable arrays, but do not permit mutable updates +(assignments) after allocation. Unlike immutable arrays, each mutable +array in Motoko introduces (private) mutable actor state.

+

Because Motoko’s type system enforces that remote actors do not share +their mutable state, the Motoko type system introduces a firm +distinction between mutable and immutable arrays that impacts typing, +subtyping and the language abstractions for asynchronous +communication.

+

Locally, the mutable arrays can not be used in places that expect +immutable ones, since Motoko’s definition of subtyping for arrays (correctly) +distinguishes those cases for the purposes of type soundness. +Additionally, in terms of actor communication, immutable arrays are safe +to send and share, while mutable arrays can not be shared or otherwise +sent in messages. Unlike immutable arrays, mutable arrays have +non-shareable types.

+

Allocate a mutable array +of constants

+

To indicate allocation of mutable arrays (in contrast to the +forms above, for immutable ones), the mutable array syntax +[var _] uses the var keyword, in both the +expression and type forms:

+
let a : [var Nat] = [var 1, 2, 3] ;
+

As above, the array a above holds three natural numbers, +but has type [var Nat].

+

Allocate a mutable +array with dynamic size

+

To allocate mutable arrays of non-constant size, use the +Array_init primitive, and supply an initial value:

+
func init<T>(size : Nat,  x : T) : [var T]
+

For example:

+
var size : Nat = 42 ;
+let x : [var Nat] = Array.init<Nat>(size, 3);
+

The variable size need not be constant here; the array +will have size number of entries, each holding the initial +value 3.

+

Mutable updates

+

Mutable arrays, each with type form [var _], permit +mutable updates via assignment to an individual element, in this case +element index 2 gets updated from holding 3 to +instead hold value 42:

+
let a : [var Nat] = [var 1, 2, 3];
+a[2] := 42;
+a
+

Subtyping +does not permit mutable to be used as immutable

+

Subtyping in Motoko does not permit us to use a mutable array of type +[var Nat] in places that expect an immutable one of type +[Nat].

+

There are two reasons for this. First, as with all mutable state, +mutable arrays require different rules for sound subtyping. In +particular, mutable arrays have a less flexible subtyping definition, +necessarily. Second, Motoko forbids uses of mutable arrays across asynchronous communication, where mutable +state is never shared.

+ + diff --git a/docs/html/overview.html b/docs/html/overview.html new file mode 100644 index 00000000000..8b175fd7f51 --- /dev/null +++ b/docs/html/overview.html @@ -0,0 +1,1064 @@ + + + + + + + md/overview.md + + + + +
+

md/overview.md

+
+ +

Concise overview of Motoko

+

This is terse, slide-like introduction to Motoko and its +features.

+

(For a gentler introduction, visit the other sections on this +site.)

+

Motivation and Goals

+

A simple, useful language for the Internet Computer (IC)

+
    +
  • Familiar syntax

  • +
  • Safe by default

  • +
  • Incorporating actor model for canister smart +contracts

  • +
  • Seamless integration of Internet Computer features

  • +
  • Making most of present and future WebAssembly

  • +
+

Key Design Points

+
    +
  • Object-oriented, functional & imperative

  • +
  • Objects as records of functions

  • +
  • async/await for sequential programming +of asynchronous messaging

  • +
  • Structural typing with simple generics and subtyping

  • +
  • Safe arithmetic (both unbounded and checked)

  • +
  • Non-nullable types by default

  • +
  • Garbage collected (no manual memory management)

  • +
  • JavaScript-like syntax but statically typed & sane

  • +
+

Inspirations: Java, JavaScript, C#, Swift, Pony, ML, Haskell

+

Semantics

+
    +
  • call-by-value (like Java, C, JS, ML; unlike Haskell)

  • +
  • declarations are locally mutually recursive

  • +
  • parametric, bounded polymorphism

  • +
  • subtyping as zero-cost subsumption, not coercion

  • +
  • no dynamic casts

  • +
  • no inheritance

  • +
+

Implementation(s)

+
    +
  • implemented in OCaml (leverages wasm +libary)

  • +
  • simple reference interpreter

  • +
  • less simple compiler to WebAssembly

    +
      +
    • multipass with typed IR in each pass.

    • +
    • uniform representation, unboxed arithmetic

    • +
    • copying GC, compacting GC, or generational GC (select which with +compiler flag)

    • +
    • GC invoked after messages (for now)

    • +
  • +
  • polymorphism by erasure

  • +
+

The language

+

Expressions

+
    +
  • Identifiers:
    +x, foo_bar, test123, +List, Map

  • +
  • Parentheses ( … ) for grouping

  • +
  • Braces { … } for scoping (and records)

  • +
  • ; for sequencing

  • +
  • Type annotations (to help type inference):
    +(42 : Int)
    +(zero cost)

  • +
+

Libraries

+
import Debug "mo:base/Debug";
+import Int "mo:base/Int";
+

(import MyLib "src/MyLib" imports a library from the +local file system.)

+

Specific bindings can be imported from the module using object +patterns

+
import { push; nil } = "mo:base/List";
+

Libraries continued

+
import Debug "mo:base/Debug";
+import Int "mo:base/Int";
+import Trie "mo:base/Trie";
+
+type Users = Trie.Trie<Text, Nat>; // reference types
+
+Debug.print(Int.toText(7)); // reference functions/values
+

Blocks and declarations

+
type Delta = Nat;
+func print() {
+  Debug.print(Int.toText(counter));
+};
+let d : Delta = 42;
+var counter = 1;
+counter := counter + d;
+print();
+
    +
  • Semicolon after each declaration!

  • +
  • Mutually recursive

  • +
  • Mutable variables marked explicitly

  • +
+

Control flow

+

The usual suspects…​

+
    +
  • do { … }

  • +
  • if b …

  • +
  • if b … else …

  • +
  • switch e { case pat1 e1; …; case _ en }

  • +
  • while b …

  • +
  • loop …

  • +
  • loop … while b

  • +
  • for (pat in e) …

  • +
  • return, return e

  • +
  • label l e, break l e

  • +
  • do ? { … e! … }

  • +
  • async e, await e +(restricted)

  • +
  • throw, try … catch x { … } +(restricted)

  • +
+

Primitive types

+

Unbounded integers

+

Int

+

{ …​, -2, 1, 0, 1, 2, …​ }

+

Inferred by default for negative literals.

+

Literals: 13, 0xf4, -20, ++1, 1_000_000

+

Unbounded naturals

+

Nat

+

{ 0, 1, 2, …​ }

+

Non-negative, trap on underflow.

+

Inferred by default for non-negative literals

+

Literals: 13, 0xf4, +1_000_000

+

Nat <: Int

+

Nat is a subtype of Int

+

(you can supply a Nat wherever an Int is +expected)

+

Bounded numbers (trapping)

+

Nat8, Nat16, Nat32, +Nat64, Int8, Int16, +Int32, Int64

+

Trap on over- and underflow; wrap-around and bit-manipulating +operations available separately

+

Needs type annotations (somewhere)

+

Literals: 13, 0xf4, -20, +1_000_000

+

Floating point numbers

+

Float

+

IEEE 754 double precision (64 bit) semantics, normalized NaN

+

Inferred for fractional literals

+

Literals: 0, -10, 2.71, -0.3e+15, +3.141_592_653_589_793_12

+

Numeric operations

+

No surprises here

+

- x
+a + b
+a % b
+a & b
+a << b
+…

+

a +% b, a -% b, … for wrapping, modular arithmetic +(where appropriate)

+

Characters and Text

+

Char, Text

+

Unicode! Character = Unicode scalar value; no random access on +text

+
    +
  • 'x', '\u{6a}', +'☃',

  • +
  • "boo", "foo \u{62}ar ☃"

  • +
  • "Concat" # "enation"

  • +
+

Booleans

+

Bool

+

Literals: true, false

+

a or b
+a and b
+not b
+if (b) e1 else e2

+

Functions

+

Function types

+
    +
  • Simple functions:

    +
    Int.toText : Int -> Text
  • +
  • multiple arguments and return values

    +
    divRem : (Int, Int) -> (Int, Int)
  • +
  • can be generic/polymorphic

    +
    Option.unwrapOr : <T>(?T, default : T) -> T
  • +
  • first-class (can be passed around, stored)

    +
    map : <A, B>(f : A -> B, xs : [A]) -> [B]
    +let funcs : [<T>(T) -> T] = …
  • +
+

Function Declarations & Use

+
func add(x : Int, y : Int) : Int = x + y;
+
+func applyNTimes<T>(n : Int, x : T, f : T -> ()) {
+  if (n <= 0) return;
+  f(x);
+  applyNTimes(n-1, x, f);
+};
+
+applyNTimes<Text>(3, "Hello!", func(x) { Debug.print(x) } );
+
    +
  • func() { … } short for +func() : () = { … }

  • +
  • Parametric functions

  • +
  • Type instantiations may sometimes be omitted

  • +
  • Anonymous functions (a.k.a. lambdas)

  • +
+

Composite types

+

Tuples

+

(Bool, Float, Text)

+

immutable, heterogeneous, fixed size

+
let tuple = (true or false, 0.6 * 2.0, "foo" # "bar");
+
tuple.1;
+
let (_,_,t) = tuple;
+t
+

Options

+

?Text

+

is either a value of that type, e.g. ?"hello", or +null.

+
func display(x : ?Text) : Text {
+  switch x {
+    case (null) { "No value" };
+    case (?y) { "Value: " # y };
+  };
+};
+
(display(null), display(?"Test"))
+

Option blocks

+

Switching on every option value can be inconvenient …​

+

The option block, do ? { … }, allow you to +safely access option values with a postfix null break +! expression.

+

Within do ? { … }, which returns an option, the +expression e! immediately exits the block with +null when the value of option e is +null or continues with the option’s contents.

+
func add(x : ?Nat, y: ?Nat) : ?Nat {
+  do ? { x! + y! };
+};
+
+(add(null, null), add (?1,null), add (?1,?2), add (null,?2));
+

Arrays (immutable)

+

[Text]

+
let days = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ];
+
+assert(days.size() == 7);
+
+assert(days[1] == "Tue");
+
+// days[7] will trap (fixed size)
+
+for (d in days.vals()) { Debug.print(d) };
+

Arrays (mutable)

+

[var Nat]

+
let counters = [var 1, 2, 3];
+
+assert(counters.size() == 3);
+
+counters[1] := counters[1] + 1;
+
+// counters[3] will trap (fixed size)
+
+counters;
+

Records

+

{first : Text; last : Text; salary : var Nat}

+
let employee = {first = "John"; last = "Doe"; var salary = 81_932};
+
+Debug.print(
+  employee.first # " " # employee.last # " earns " #
+    Int.toText(employee.salary) # " pounds."
+);
+
+employee.salary += 79_496;
+
+employee;
+

Objects

+

{first : Text; last : Text; get : () → Nat; add : Nat → ()}

+
object self {
+  public let first = "John";
+  public let last = "Doe";
+  var salary : Nat = 81_932; // private by default
+  public func get() : Nat = salary;
+  public func add(bump : Nat) { salary += bump };
+}
+

Classes

+
class Employee(fst : Text, lst : Text) {
+  public let first = fst;
+  public let last = lst;
+  var salary : Nat = 0;
+  public func get() : Nat = salary;
+  public func add(bump : Nat) { salary += bump };
+}
+

Classes are factories for constructing objects.
+A class introduces a type and a function (for constructing +instances).

+

Just sugar for:

+
type Employee = {first : Text; last : Text; get : () -> Nat; add : Nat -> ()};
+
+func Employee(fst : Text, lst : Text) : Employee = object { … }
+

Variants

+

{#sun; #mon; #tue; #wed; #thu; #fri; #sat}

+
type Day = {#sun; #mon; #tue; #wed; #thu; #fri; #sat};
+
+func toText(d : Day) : Text {
+  switch d {
+     case (#sun) "Sunday";
+     case (#mon) "Monday";
+     case (#tue) "Tuesday";
+     case (#wed) "Wednesday";
+     case (#thu) "Thursday";
+     case (#fri) "Friday";
+     case (#sat) "Saturday";
+   };
+};
+
+func sort(d : Day) : { #weekDay; #weekEnd } {
+  switch d {
+    case (#sun or #sat) #weekEnd;  // or pattern
+    case _ #weekDay;  // wildcard pattern
+  };
+};
+

Recursive Types

+
type List = {
+  #item : {head : Text; tail : List}; // variant with payload!
+  #empty                     // ^^^^ recursion!
+};
+
+func reverse(l : List) : List {
+  func rev(l : List, r : List) : List {
+    switch l {
+      case (#empty) { r };
+      case (#item { head; tail }) { // nested patterns
+        rev(tail, #item {head; tail = r})
+      }
+    }
+  };
+  rev(l, #empty);
+};
+
+let l = reverse(#item {head = "A"; tail = #item {head = "B"; tail = #empty}});
+

Generic types

+
type List<T> = {
+  #item : {head : T; tail : List<T>};
+  #empty
+};
+
+func reverse<T>(l : List<T>) : List<T> {
+  func rev(l : List<T>, r : List<T>) : List<T> {
+    switch l {
+      case (#empty) { r };
+      case (#item { head; tail }) { // a nested pattern
+        rev(tail, #item {head; tail = r})
+      }
+    }
+  };
+  rev(l, #empty);
+};
+
+let s : List<Text> =
+  reverse(#item {head = "A"; tail = #item {head = "B"; tail = #empty}});
+
+let ns : List<Nat> =
+  reverse(#item {head = 0; tail = #item {head = 1; tail = #empty}})
+

Packages and modules

+

Modules

+
// the type of base/Int.mo
+module {
+  type Int = Prim.Types.Int;
+  toText : Int -> Text;
+  abs : Int -> Nat;
+  // ...
+}
+

modules contain named types and values (like objects),
+but are restricted to static content (pure, no state, …)

+

Module imports

+
import Debug "mo:base/Debug";  // import from package
+import Int "mo:base/Int";
+import MyLib "lib/MyLib";  // import from local file MyLib.mo
+

base package provides basic features as separate +modules.

+

More libraries popping up!

+

MyLib.mo must contain a module or actor class, +eg:

+
module {
+  public type List<T> = …;
+
+  public func reverse<T>(l : List<T>) : List<T> { … };
+}
+

Platform features

+

Actor types

+

Like object types, but marked as actor:

+
type Broadcast = actor {
+  register : Receiver -> ();
+  send : Text -> async Nat;
+};
+
+type Receiver = actor {
+  recv : query Text -> async Nat
+};
+

sharable arguments and no or async result +type.

+
    +
  • register is a oneway IC method +(unawaitable).

  • +
  • send is an IC update method

  • +
  • recv is IC query method

  • +
+

IC canister with Candid interface ≈ Motoko actor

+

sharable ≈ serializable

+

Sharable:

+
    +
  • all primitive types

  • +
  • records, tuples, arrays, variants, options
    +with immutable sharable components

  • +
  • actor types

  • +
  • shared function type

  • +
+

Not sharable:

+
    +
  • mutable things

  • +
  • local functions

  • +
  • objects (with methods)

  • +
+

A complete actor

+
import Array "mo:base/Array";
+
+actor Broadcast {
+  type Receiver = actor {recv : query Text -> async Nat};
+
+  var r : [Receiver] = [];
+
+  public func register(a : Receiver) {
+    r := Array.append(r, [a]);
+  };
+
+  public func send(t : Text) : async Nat {
+    var sum = 0;
+    for (a in r.vals()) {
+      sum += await a.recv(t);
+    };
+    return sum;
+  };
+}
+

a typical actor/canister main file

+

Async/await

+

async T

+

asychronous future or promise

+

introduced by async { … }
+(implicit in async function declaration)

+

await e
+suspends computation pending e’s result:
+if the result is a value, continues with that value,
+if the result is an Error, throws the +error.

+
  public func send(t : Text) : async Nat {
+    var sum = 0;
+    for (a in r.vals()) {
+      sum += await a.recv(t); // may return Nat or `throw` error
+    };
+    return sum;
+  };
+

(Errors can be handled using try … catch …)

+

Concurrency Hazards

+

Functions that await are not atomic.
+Suspension introduces concurrency hazards.

+

A bad implementation of send:

+
  var sum = 0; // shared state!
+  public func send(t : Text) : async Nat {
+    sum := 0;
+    for (a in r.vals()) {
+      sum += await a.recv(t);
+    };
+    return sum;
+  };
+

(Concurrent sends will share and clobber +sum.)

+

Beware of race conditions!

+

Actor import

+
import Broadcast "canister:Broadcast";
+/* or
+import Broadcast "ic:r7inp-6aaaa-aaaaa-aaabq-cai";
+*/
+actor Self {
+
+  var count = 0;
+
+  public func go() {
+    Broadcast.register(Self);
+  };
+
+  public query func recv(msg : Text) : async Nat {
+    return count;
+  }
+}
+

(assumes there is a Candid file describing the interface of the +import)

+

A Candid interface file

+

Broadcast's Candid file (produced by +moc --idl Broadcast.mo compiler).

+

Broadcast.did:

+
type Receiver =
+ service {
+   recv: (text) -> (nat) query;
+ };
+service : {
+  register: (Receiver) -> () oneway;
+  send: (text) -> (nat);
+}
+

A language independent interface definition.

+

Could just as easily describe a Rust implementation of +Broadcast.

+

Principal and caller

+
import Principal "mo:base/Principal";
+
+actor Self {
+
+  public shared(context) func hello() : async Text {
+    let myself : Principal = Principal.fromActor(Self);
+    if (context.caller == myself) {
+      "Talking to yourself is the first sign of madness";
+    } else {
+      "Hello, nice to see you";
+    };
+  };
+
+}
+

Errors

+
import Principal "mo:base/Principal";
+import Error "mo:base/Error";
+
+actor Self {
+
+  public shared(context) func hello() : async Text {
+    let myself : Principal = Principal.fromActor(Self);
+    if (context.caller == myself) {
+      throw Error.reject("Talking to yourself is the first sign of madness");
+    } else {
+      "Hello, nice to see you";
+    };
+  };
+
+};
+
+async {
+  let t = try Self.hello() catch (e) { Error.message(e); }
+};
+

Similar to exceptions in other languages,
+but only available in async contexts, e.g. shared functions; +async blocks

+

Stable variables

+

If we upgrade the Broadcast actor, all current +registrations are lost.
+To preserve them, declare the state variable r as +stable.

+
import Array "mo:base/Array";
+
+actor Broadcast {
+
+  type Receiver = actor {recv : query Text -> async Nat};
+
+  stable var r : [Receiver] = []; // declare r `stable`
+
+  public func register(a : Receiver) { … }
+  public func send(t : Text) : async Nat { … }
+
+  // optional pre-upgrade action
+  system func preupgrade() { Debug.print("saving receivers"); }
+
+  // optional post-upgrade action
+  system func postupgrade() {  Debug.print("restoring receivers"); }
+}
+

stable variables must have stable types (see manual)
+system hooks can’t send messages

+

Type system

+

Structural

+
/*
+type List = {
+  #item : {head : Text; tail : List};
+  #empty
+};
+
+func reverse(l : List) : List { //... };
+*/
+type Stack = {
+   #empty;
+   #item : {tail : Stack; head : Text};
+};
+
+let stack : Stack = #empty;
+
+let revStack = reverse(stack); // works though reverse defined on List (not Stack)
+

Type definitions
+do not create types,
+but name existing types

+

Despite their different names, Stack and +List are equivalent types.

+

Subtyping (Variants)

+

WeekDay <: Day

+
type WeekDay = {#mon; #tue; #wed; #thu; #fri};
+
+type Day = {#sun; #mon; #tue; #wed; #thu; #fri; #sat};
+
+func toText(d : Day) : Text {
+  switch d
+   { case (#sun) "Sunday";
+     case (#mon) "Monday";
+     //...
+   };
+};
+
+let mon : WeekDay = #mon;
+let t = toText(mon); // also works, since WeekDay <: Day
+

t1 <: t2: t1 can be used wherever +t2 is expected

+

Employee <: Person

+
type Employee = {first : Text; last : Text; var salary : Nat};
+type Person = {first : Text; last : Text};
+
+func toText(p : Person) : Text {
+  p.last # "," # p.first;
+};
+
+let employee : Employee =
+  { first = "John"; last = "Doe"; var salary = 161_401};
+
+let t = toText(employee); // also works, since Employee <: Person
+

Fin

+

Not covered

+
    +
  • Polymorphic functions with type bounds

  • +
  • User defined iterator objects, supporting for +loops.

  • +
  • Actor classes

  • +
  • debug_show for conversion of almost any value to +text.

  • +
  • debug e expressions for debug-only +compilation

  • +
  • do ? { … e! … } blocks for handling/propagating +option values.

  • +
  • assert e expressions for conditional traps

  • +
  • tools:

    +
      +
    • mo_doc (generates doc from doc comments),

    • +
    • vessel (package manager)

    • +
    • mo_ide (LSP language server for VSCode, emacs +etc)

    • +
  • +
+ + + diff --git a/docs/html/pattern-matching.html b/docs/html/pattern-matching.html new file mode 100644 index 00000000000..fc7038333d6 --- /dev/null +++ b/docs/html/pattern-matching.html @@ -0,0 +1,392 @@ + + + + + + + md/pattern-matching.md + + + + +
+

md/pattern-matching.md

+
+ +

Pattern matching

+

Pattern matching is a language feature that makes it easy to both +test and decompose structured data into its constituent parts. While +most programming languages provide familiar ways to build structured +data, pattern matching enables you to take apart structured data and +bring its fragments into scope by binding them to the names you specify. +Syntactically, the patterns resemble the construction of structured +data, but generally appear in input-direction positions, such as in +function argument positions, after the case keyword in +switch expressions, and after let or +var declarations.

+

Consider the following function call:

+
let name : Text = fullName({ first = "Jane"; mid = "M"; last = "Doe" });
+

This code constructs a record with three fields and passes it to the +function fullName. The result of the call is named and +brought into scope by binding it to the identifier name. +The last, binding step is called pattern matching, and +name : Text is one of the simplest forms of pattern. For +instance, in the following implementation of the callee:

+
func fullName({ first : Text; mid : Text; last : Text }) : Text {
+  first # " " # mid # " " # last
+};
+

The input is an (anonymous) object, which is destructured into its +three Text fields, whose values are bound to the +identifiers first, mid and last. +They can be freely used in the block that forms the body of the +function. Above we have resorted to name punning (a form of +aliasing) for object field patterns, using the name of a field to also +name its contents. A more general form of field pattern allows the +content to be named separately from the field, as in +…​; mid = m : Text; …​. Here mid determines +which field to match, and m names the content of that field +within the scope of the pattern.

+

You can also use pattern matching to declare literal +patterns, which look just like literal constants. Literal patterns +are especially useful in switch expressions because they +can cause the current pattern match to fail, and thus start to +match the next pattern. For example:

+
switch ("Adrienne", #female) {
+  case (name, #female) { name # " is a girl!" };
+  case (name, #male) { name # " is a boy!" };
+  case (name, _) { name # ", is a human!" };
+}
+
    +
  1. will match the first case clause (because binding to +the identifier name cannot fail and the shorthand variant +literal #Female compares as equal), and evaluate to +"Adrienne is a girl!". The last clause showcases the +wildcard pattern _. It cannot fail, but won’t bind +any identifier.
  2. +
+

The last kind of pattern is the or pattern. As its name +suggests, these are two or more patterns that are separated by the +keyword or. Each of the sub-patterns must bind to the same +set of identifiers, and is matched from left-to-right. An +or pattern fails when its rightmost sub-pattern fails.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pattern kindexample(s)contextcan failremarks
literalnull, 42, (), +"Hi"everywherewhen the type has more than one value
namedage, xeverywherenointroduces identifiers into a new scope
wildcard_everywhereno
typedage : Nateverywhereconditional
option?0, ?valeverywhereyes
tuple( component0, component1, …​ )everywhereconditionalmust have at least two components
object{ fieldA; fieldB; …​ }everywhereconditionalallowed to mention a subset of fields
fieldage, count = 0objectconditionalage is short for age = age
variant#celsius deg, #sundayeverywhereyes#sunday is short form for #sunday ()
alternative (or-pattern)0 or 1everywheredependsno alternative may bind an identifier
+

The following table summarises the different ways of pattern +matching.

+

Additional +information about about patterns

+

Since pattern matching has a rich history and interesting mechanics, +a few additional comments are justified.

+

terminology
+The (usually structured) expression that is being matched is frequently +called the scrutinee and the patterns appearing behind the +keyword case are the alternatives. When every +possible scrutinee is matched by (at least one) alternative, then we say +that the scrutinee is covered. The patterns are tried in +top-down fashion and thus in case of overlapping patterns the +one higher-up is selected. An alternative is considered dead +(or inactive), if for every value that it matches there is +higher-up alternative that is also matched.

+

booleans
+The data type Bool can be regarded as two disjointed +altenatives (true and false) and Motoko’s +built-in if construct will eliminate the data and +turn it into control flow. if expressions are a +form of pattern matching that abbreviates the general +switch expression for the special case of boolean +scrutinees.

+

variant patterns
+Motoko’s variant types are a form of disjoint union (sometimes +also called a sum type). A value of variant type always has +exactly one discriminator and a payload which can vary from +discriminator to discriminator. When matching a variant pattern with a +variant value, the discriminators must be the same (in order to select +the alternative) and if so, the payload gets exposed for further +matching.

+

enumerated types
+Other programming languages — for example C, but not Motoko — often use +a keyword enum to introduce enumerations. These are +impoverished relatives of Motoko’s variant types, as the alternatives +are not allowed to carry any payload. Correspondingly, in those +languages the switch-like statements lack the full power of +pattern matching. Motoko provides the short-hand syntax (as in +type Weekday = { #mon; #tue; …​ }) to define basic +enumerations, for which no payloads are required.

+

error handling
+Error handling can be considered a use-case for pattern matching. When a +function returns a value that has an alternative for success and one for +failure (for example, an option value or a variant), pattern matching +can be used to distinguish between the two as discussed in Error handling.

+

irrefutable matching
+Some types contain just a single value. We call these singleton +types. Examples of these are the unit type (also known as an empty +tuple) or tuples of singleton types. Variants with a single tag and no +(or singleton-typed) payload are singleton types too. Pattern matching +on singleton types is particularly straightforward, as it only has one +possible outcome: a successful match.

+

exhaustiveness (coverage) checking
+When a pattern check alternative has the potential to fail, then it +becomes important to find out whether the whole switch +expression can fail. If this can happen the execution of the program can +trap for certain inputs, posing an operational threat. To this end, the +compiler checks for the exhaustiveness of pattern matching by keeping +track of the covered shape of the scrutinee. The compiler issues a +warning for any non-covered scrutinees (Motoko even constructs a helpful +example of a scrutinee that is not matched). A useful by-product of the +exhaustiveness check is that it identifies and warns about dead +alternatives that can never be matched.

+

In summary, pattern checking is a great tool with several use-cases. +By statically analyzing patterns, the compiler assists the programmer by +pointing out unhandled cases and unreachable code, both of which often +indicate programmer error. The static, compile-time nature of coverage +checking reliably rules out runtime failures.

+ + diff --git a/docs/html/pipes.html b/docs/html/pipes.html new file mode 100644 index 00000000000..b7973551b43 --- /dev/null +++ b/docs/html/pipes.html @@ -0,0 +1,218 @@ + + + + + + + md/pipes.md + + + + +
+

md/pipes.md

+
+ +

Piping values into +expressions

+

It can sometimes be hard to read deeply nested expressions involving +several function applications.

+
+

This expression take the range of numbers +0..10, converts it to a list, filters the list +for multiples of three and returns a record containing the result.

+

To make such expressions more readable, you can use Motoko's pipe +operator <exp1> |> <exp2>. The operator +evaluates the first argument <exp1>, and lets you +refer to its value in <exp2> using the special +placeholder expression _.

+

Using this, you can write the former expression as:

+
+

Now, the textual order of operations corresponds to our English +explanation above: "this expression takes the range of numbers +0..10, converts it to a list, filters the list +for multiples of three and returns a record containing the result".

+

The pipe expression <exp1> |> <exp2> is +just syntactic sugar for the following block binding +<exp1> to a reserved placeholder identifier, +p, before returning <exp2>:

+
do { let p = <exp1>; <exp2> }
+

The otherwise inaccessible placeholder identifier p can +only referenced by the placeholder expression _. Multiple +references to _ are allowed and refer to the same value +within the same pipe operation.

+

Note that using _ as an expression outside of a pipe +operation, where it is undefined, is an error.

+

For example:

+
let x = _;
+

produces the compile-time error "type error [M0057], unbound variable +_".

+

(Internally, the compiler uses the reserved identifier _ +as the name for the placeholder called p above, so this +let is just referencing an undefined variable).

+

See here +for more details.

+ + diff --git a/docs/html/sharing.html b/docs/html/sharing.html new file mode 100644 index 00000000000..f5c13f7cc3a --- /dev/null +++ b/docs/html/sharing.html @@ -0,0 +1,382 @@ + + + + + + + md/sharing.md + + + + +
+

md/sharing.md

+
+ +

Sharing data and behavior

+

Recall that in Motoko, mutable state is always private to an +actor.

+

However, two actors can share message data, and those messages can +refer to actors, including themselves and one another. Additionally, +messages can refer to individual functions, if those functions are +shared.

+

Through these mechanisms, two actors can coordinate their behavior +through asynchronous message passing.

+

Publisher-subscriber +pattern with actors

+

The examples in this section illustrate how actors share their +functions by focusing on variations of the publish-subscribe +pattern. In the publish-subscribe pattern, a +publishing actor records a list of +subscriber actors to notify when something notable +occurs in the publisher’s state. For example, if the publisher actor +publishes a new article, the subscriber actors are notified that a new +article is available.

+

The example below uses two actors in Motoko to build variations of +the publisher-subscriber relationship.

+

To see the complete code for a working project that uses this +pattern, see the pubsub +example in the examples +repository.

+

Subscriber actor

+

The following Subscriber actor type provides a possible +interface for the subscriber actor and the publisher actor to expose and +to call, respectively:

+
type Subscriber = actor {
+  notify : () -> ()
+};
+
    +
  • The Publisher uses this type to define a data +structure to store its subscribers as data.

  • +
  • Each Subscriber actor exposes a notify +update function as described in the Subscriber actor type +signature above.

  • +
+

Note that sub-typing enables the Subscriber actor to +include additional methods that are not listed in this type +definition.

+

For simplicity, assume that the notify function accepts +relevant notification data and returns some new status message about the +subscriber to the publisher. For example, the subscriber might return a +change to its subscription settings based on the notification data.

+

Publisher actor

+

The publisher side of the code stores an array of subscribers. For +simplicity, assume that each subscriber only subscribes itself once +using a subscribe function.

+
import Array "mo:base/Array";
+
+actor Publisher {
+    var subs: [Subscriber] = [];
+
+    public func subscribe(sub: Subscriber) {
+        subs := Array.append<Subscriber>(subs, [sub]);
+    };
+
+    public func publish() {
+        for (sub in subs.vals()) {
+          sub.notify();
+        };
+    };
+};
+

Later, when some unspecified external agent invokes the +publish function, all of the subscribers receive the +notify message, as defined in the Subscriber +type given above.

+

Subscriber methods

+

In the simplest case, the subscriber actor has the following +methods:

+
    +
  • Subscribe to notifications from the publisher using the +init method.

  • +
  • Receive notification as one of the subscribed actors as specified +by the notify function in the Subscriber type +given above).

  • +
  • Permit queries to the accumulated state, which in this sample +code is simply a get method for the number of notifications +received and stored in the count variable.

  • +
+

The following code illustrates implementing these methods:

+
actor Subscriber {
+  var count: Nat = 0;
+  public func init() {
+    Publisher.subscribe(Subscriber);
+  };
+  public func notify() {
+    count += 1;
+  };
+  public func get() : async Nat {
+    count
+  };
+}
+

The actor assumes, but does not enforce, that its init +function is only ever called once. In the init function, +the Subscriber actor passes a reference to itself, of type +actor { notify : () → () }; (locally called +Subscriber above).

+

If called more than once, the actor will subscribe itself multiple +times, and will receive multiple (duplicate) notifications from the +publisher. This fragility is the consequence of the basic +publisher-subscriber design we show above. With more care, a more +advanced publisher actor could check for duplicate subscriber actors and +ignore them, for instance.

+

Sharing functions among +actors

+

In Motoko, a shared actor function can be sent in a +message to another actor, and then later called by that actor, or by +another actor.

+

The code shown above has been simplified for illustrative purposes. +The full version offers additional features to the publisher-subscriber +relationship, and uses shared functions to make this relationship more +flexible.

+

For instance, the notification function is always designated +as notify. A more flexible design would only fix the type +of notify, and permit the subscriber to choose any of its +shared functions, specified in a subscribe +message in place of (just) the actor that is subscribing.

+

See the the +full example for details.

+

In particular, suppose that the subscriber wants to avoid being +locked into a certain naming scheme for its interface. What really +matters is that the publisher can call some function that the +subscriber chooses.

+

The shared keyword

+

To permit this flexibility, an actor needs to share a single +function that permits remote invocation from another actor, not +merely a reference to itself.

+

The ability to share a function requires that it be pre-designated as +shared, and the type system enforces that these functions +follow certain rules around the types of data that these functions +accept, return, and over which their closures close.

+

Motoko lets you omit this keyword for public actor methods +since, implicitly, any public function of an actor must be +`shared`, whether marked explicitly or not.

+

Using the shared function type, we can extend the +example above to be more flexible. For example:

+
type SubscribeMessage = { callback: shared () -> (); };
+

This type differs from the original, in that it describes a +message record type with a single field called +callback, and the original type first shown above describes +an actor type with a single method called +notify:

+
type Subscriber = actor { notify : () -> () };
+

Notably, the actor keyword means that this latter type +is not an ordinary record with fields, but rather, an actor with at +least one method, which must be called notify.

+

By using the SubscribeMessage type instead, the +Subscriber actor can choose another name for their +notify method:

+
actor Subscriber {
+  var count: Nat = 0;
+  public func init() {
+    Publisher.subscribe({callback = incr;});
+  };
+  public func incr() {
+    count += 1;
+  };
+  public query func get(): async Nat {
+    count
+  };
+};
+

Compared to the original version, the only lines that change are +those that rename notify to incr, and form the +new subscribe message payload, using the expression +{callback = incr}.

+

Likewise, we can update the publisher to have a matching +interface:

+
import Array "mo:base/Array";
+actor Publisher {
+  var subs: [SubscribeMessage] = [];
+  public func subscribe(sub: SubscribeMessage) {
+    subs := Array.append<SubscribeMessage>(subs, [sub]);
+  };
+  public func publish() {
+    for (sub in subs.vals()) {
+      sub.callback();
+    };
+  };
+};
+ + diff --git a/docs/html/stablememory.html b/docs/html/stablememory.html new file mode 100644 index 00000000000..79e8e9bdeb6 --- /dev/null +++ b/docs/html/stablememory.html @@ -0,0 +1,290 @@ + + + + + + + md/stablememory.md + + + + +
+

md/stablememory.md

+
+ +

Stable Memory

+

The ExperimentalStableMemory library provides low-level +access to Internet Computer stable memory.

+ + +

:::danger

+

The ExperimentalStableMemory library is experimental, +subject to change and may be replaced by safer alternatives in later +versions of Motoko. Use at your own risk and discretion.

+

:::

+

Motoko stable variables, while convenient to use, require +serialization and deserialization of all stable variables on upgrade +(see Stable variables and upgrade methods). +During an upgrade, the current values of stable variables are first +saved to IC stable memory, then restored from stable memory after the +new code is installed. Unfortunately, this mechanism does not scale to +canisters that maintain large amounts of data in stable +variables: there may not be enough cycle budget to store then restore +all stable variables within an upgrade, resulting in failed +upgrades.

+

To avoid this upgrade hazard, actors can elect to use a lower-level +ExperimentalStableMemory library. The library allows the +programmer to incrementally allocate pages of (64-bit) IC stable memory +and use those pages to incrementally read and write data in a +user-defined binary format.

+

The Motoko runtime system ensures there is no interference between +the abstraction presented by the ExperimentalStableMemory +library and an actor’s stable variables, even though the two +abstractions ultimately use the same underlying (concrete) stable memory +facilities available to all IC canisters. This runtime support means +that is safe for a Motoko program to exploit both stable variables and +ExperimentalStableMemory, within the same application.

+

The Library

+

Support for stable memory is provided by the ExperimentalStableMemory +library in package base.

+

The interface to the ExperimentalStableMemory library +consists of functions for querying and growing the currently allocated +set of stable memory pages, plus matching pairs of load, +store operations for most of Motoko’s fixed-size scalar +types.

+

More general loadBlob and storeBlob +operations are also available for reading/writing binary blobs and other +types that can be encoded as Blobs (e.g. Text +values) of arbitrary sizes, using Motoko supplied or user-provided +encoders and decoders.

+
module {
+
+  // Current size of the stable memory, in pages.
+  // Each page is 64KiB (65536 bytes).
+  // Initially `0`.
+  size : () -> (pages : Nat64);
+
+  // Grow current `size` of stable memory by `pagecount` pages.
+  // Each page is 64KiB (65536 bytes).
+  // Returns previous `size` when able to grow.
+  // Returns `0xFFFF_FFFF_FFFF_FFFF` if remaining pages insufficient.
+  grow : (new_pages : Nat64) -> (oldpages : Nat64);
+
+  loadNat8 : (offset : Nat64) -> Nat8;
+  storeNat8 : (offset : Nat64, value: Nat8) -> ();
+
+  // ... and similar for Nat16, Nat32, Nat64,
+  // Int8, Int16, Int32 and Int64 ...
+
+  loadFloat : (offset : Nat64) -> Float;
+  storeFloat : (offset : Nat64, value : Float) -> ();
+
+  // Load `size` bytes starting from `offset` as a `Blob`.
+  // Traps on out-of-bounds access.
+  loadBlob : (offset : Nat64, size : Nat) -> Blob;
+
+  // Write bytes of `blob` beginning at `offset`.
+  // Traps on out-of-bounds access.
+  storeBlob : (offset : Nat64, value : Blob) -> ()
+
+  // Returns a query that, when called, returns the number of bytes of
+  // (real) IC stable memory that would be occupied by persisting its
+  // current stable variables before an upgrade.
+  stableVarQuery : () -> (shared query () -> async {size : Nat64})
+}
+

Example

+

To demonstrate the ExperimentalStableMemory library, we +present a dead simple implementation of a logging actor that records +text messages in a scalable, persistent log.

+

The example illustrates the simultaneous use of stable variables and +stable memory. It uses a single stable variable to keep track of the +next available offset, but stores the contents of the log directly in +stable memory.

+
+

The auxiliary function ensure(offset) is used to grow +ExerimentalStableMemory as necessary to accommodate more +data. It computes the 64KiB page of a given offset and ensures enough +pages have been allocated to guarantee that offset is within bounds.

+

The shared log(t) function encodes its Text +argument as a Blob, allocates enough stable memory to store +it, and writes both the blob contents and its size at the next available +offset in ExperimentalStableMemory, updating +base.

+

The shared readLast(count) query reads up to +count messages from the log, traversing the log in reverse +from base.

+

Because StableLog allocates and maintains its +(potentially large) log data directly in stable memory and uses just a +small and fixed amount of storage for actual stable variables (here +base), upgrading StableLog to a new +implementation (perhaps to provide more functionality) should not +consume too many cycles, regardless of the current size of the log.

+ + diff --git a/docs/html/structural-equality.html b/docs/html/structural-equality.html new file mode 100644 index 00000000000..335c2ca8f36 --- /dev/null +++ b/docs/html/structural-equality.html @@ -0,0 +1,254 @@ + + + + + + + md/structural-equality.md + + + + +
+

md/structural-equality.md

+
+ +

Structural equality

+

Equality (==) — and by extension inequality +(!=) — is structural: two values +a and b are equal, a == b, +whenever they have equal contents, regardless of the physical +representation, or identity, of those values in memory.

+

For example, the strings "hello world" and +"hello " # "world" are equal, even though they are most +likely represented by different objects in memory.

+

Equality is defined only on shared types or on types +that don’t contain mutable fields, mutable arrays, non-shared functions, +or components of generic type.

+

For example, we can compare arrays of objects.

+
let a = [ { x = 10 }, { x = 20 } ];
+let b = [ { x = 10 }, { x = 20 } ];
+a == b;
+

Importantly, this does not compare by reference, but by +value.

+

Subtyping

+

Equality respects subtyping so +{ x = 10 } == { x = 10; y = 20 } returns +true.

+

To accommodate subtyping, two values of different types are equal if +they are equal at their most specific, common supertype, meaning they +agree on their common structure. The compiler will warn in cases where +this might lead to subtle unwanted behaviour. For example: +{ x = 10 } == { y = 20 } will return true +because the two values get compared at the empty record type. That’s +unlikely the intention, so the compiler will emit a warning here.

+
{ x = 10 } == { y = 20 };
+

Generic types

+

It is not possible to declare that a generic type variable is +shared, so equality can only be used on non-generic types. +For example, the following expression generates a warning like this:

+
func eq<A>(a : A, b : A) : Bool = a == b;
+

Comparing these two at the Any type means this +comparison will return true no matter its arguments, so +this doesn’t work as one might hope.

+

If you run into this limitation in your code, you should accept a +comparison function of type (A, A) -> Bool as an +argument, and use that to compare the values instead.

+

Let’s look at a list membership test for example. This first +implementation does not work:

+
import List "mo:base/List";
+
+func contains<A>(element : A, list : List.List<A>) : Bool {
+  switch list {
+    case (?(head, tail))
+      element == head or contains(element, tail);
+    case null false;
+  }
+};
+
+assert(not contains(1, ?(0, null)));
+

This assertion will trap because the compiler compares the type +A at Any which is always true. So +as long as the list has at least one element, this version of +contains will always return true.

+

This second implementation shows how to accept the comparison +function explicitly instead:

+
import List "mo:base/List";
+import Nat "mo:base/Nat";
+
+func contains<A>(eqA : (A, A) -> Bool, element : A, list : List.List<A>) : Bool {
+  switch list {
+    case (?(head, tail))
+      eqA(element, head) or contains(eqA, element, tail);
+    case null false;
+  }
+};
+
+assert(not contains(Nat.equal, 1, ?(0, null)));
+ + diff --git a/docs/html/style.html b/docs/html/style.html new file mode 100644 index 00000000000..4169a65c7cb --- /dev/null +++ b/docs/html/style.html @@ -0,0 +1,985 @@ + + + + + + + md/style.md + + + + +
+

md/style.md

+
+ +

Motoko style guidelines

+

To increase readability and uniformity of Motoko source code, the +style guide provides suggestions for formatting Motoko sources and other +basic conventions.

+

Layout

+

Spacing

+
    +
  • Put spaces around arithmetic operators, except to visually group +sub-expressions of more tightly binding operators.

    +
    let z = - 2*x + 3*y + 4*(x*x + y*y);
  • +
  • Put spaces around comparison operators, Boolean operators, and +assignment operators.

    +
    4 + 5 <= 5 + 4;
    +not (a or b and not c);
    +v := 0;
    +v += 1;
  • +
  • Put spaces around '='.

    +
    var v = 0;
    +let r = { a = 1; b = 2 };
  • +
  • Analogously, put spaces around :.

    +
    var v : Nat = 0;
    +func foo(x : Nat, y : Nat) : Nat { x + y }
    +func bar((x, y) : (Nat, Nat)) : Nat { x + y }
    +let w = 1 ^ 0xff : Nat16;
    +

    Rationale: ':' is to declarations what '=' is to definitions. +Moreover, the left-hand of a type annotation may generally be an +arbitrary complex expression or pattern.

  • +
  • Put a space after a comma or semicolon (but not before).

    +
    let tuple = (1, 2, 3);
    +let record = { a = 1; b = 2; c = 3 };
  • +
  • Put spaces inside braces, unless they are a simple variant or +record.

    +
    func f() { 0 };
    +f({ a = 1; b = 2; c = 3 });
    +f({a = 1; b = 2});  // okay as well
    +
    +type Vec3D = { x : Float; y : Float; y : Float };
    +type Order = { #less; #equal; #more };
    +
    +type Order = {#less; #equal; #more};  // okay as well
    +type Proc = {h : Nat; w : Nat} -> {#ok; #fail};
  • +
  • Put spaces inside brackets if they stretch multiple lines.

    +
    foo(
    +  firstArgument,
    +  ( longTupleComponent, anotherLongExpression,
    +    moreLongExpression
    +  ),
    +  [ 1, 2, 3,
    +    4, 5, 6,
    +  ],
    +  { field1 = 4; field2 = 5;
    +    field3 = 6;
    +  }
    +);
  • +
  • Put a space between statement keywords and their operands.

    +
    if (f()) A else B;
    +for (x in xs.vals()) { ... };
    +switch (compare(x, y)) {
    +  case (#less) { A };
    +  case (_) { B };
    +}
    +
    +assert (x < 100);
    +await (async (0));
  • +
  • Do not put a space between a function or variant tag and +its argument tuple or around a generic type parameter list.

    +
    type Pair<X> = (X, X);
    +type Id = <X>(X) -> X;
    +
    +let ok = #ok(5);
    +
    +func id<X>(x : X) : X { x };
    +id<Nat>(5);
  • +
  • Put a space between a function and its argument if it is +not a tuple or parenthesized expression (see Parentheses) or a record used as a named +parameter list (see Picking types).

    +
    sin 0.0;
    +g [1, 2, 3];
    +f{arg1 = 0; arg2 = 0};
  • +
+

Rationale: g[1] in particular will be misparsed as an +indexing operation.

+
    +
  • Do not put a space around access operators like +., ?, !, or index brackets.

    +
    foo(bar).baz[5]().boo;
    +foom(?(bam()! + 1));
  • +
+

Line breaks

+
    +
  • Pick a fixed right margin for lines and break definitions or +expressions that are longer than that (80 still is considered a good +limit by many).

    +
    let sum = a + b + 2*c + d +
    +  e + f + g + h + i + k +
    +  l + m + n + o + p;
    +
    +// Or:
    +let sum =
    +  a + b + 2*c + d + e +
    +  f + g + h + i + k + l +
    +  m + n + o + p;
    +

    Rationale: Among other reasons, this style of formatting:

    +
      +
    1. Avoids code being hidden to the right in a window.

    2. +
    3. Avoids random line breaks in side-by-side diffs (for example, as +shown by GitHub or similar code review tools).

    4. +
    5. Allows prettier display on paper, web sites, or other +media.

    6. +
  • +
  • Break lines after an operator.

    +
    a + b + c +
    +  d + f;
    +
    +foo(bar, baz).
    +  boo();
  • +
  • When breaking function definitions or calls with long argument +lists, put each argument on a separate line.

    +

    Also, consider using records for long parameter lists, see Picking types.

    +
    func someFunction(
    +  arg1 : FirstType,
    +  arg2 : SecondType,
    +  anotherArg : Nat,
    +  yetAnother : [Type],
    +  func : Nat -> Nat,
    +) : Nat {
    +  ...
    +};
    +
    +someFunction(
    +  veryLongArgumentExpression,
    +  anotherVeryLongArgumentExpression,
    +  3,
    +  aNestedFunctionCall(
    +    alsoWithLongArguments,
    +    andMoreSuchArguments,
    +  ),
    +  moreLongishArgument,
    +);
    +

    Rationale: This prevents overlooking an argument when reading code +and avoids re-breaking lines when changing one of the +expressions.

  • +
+

Indentation

+
    +
  • Each level of indentation should be 2 spaces.

    +
    actor A {
    +  public func f() {
    +    return;
    +  }
    +}
    +

    Rationale: There may be a lot of nesting. Using only 2 spaces avoids +wasting screen estate.

  • +
  • Indentation should not depend on the lexical contents of previous +lines.

    +

    In particular, do not vertically align indentation with inner +characters from previous lines.

    +
    let x = someFunction(
    +  arg1, arg2, arg3, arg4, arg5);               // Do this.
    +
    +let x = someFunction(arg1, arg2, arg3,
    +  arg4, arg5);                                 // Or this.
    +
    +let x =
    +  someFunction(arg1, arg2, arg3, arg4, arg5);  // Or this.
    +
    +let x = someFunction(                          // Or this.
    +  longArg1,
    +  longArg2,
    +  longArg3,
    +  longArg4,
    +  longArg5,
    +);
    +
    +// COUNTER EXAMPLE!
    +let x = someFunction(arg1, arg2, arg3,
    +                     arg4, arg5);              // DO NOT DO THIS!
    +

    Rationale: There are many problems with vertical alignment, for +example:

    +
      +
    1. It wastes a lot of horizontal space.

    2. +
    3. It creates wildly inconsistent indentation levels that obfuscate +the structure of the code.

    4. +
    5. It can produce realignment churn when changing a line, which +(even when automated by editors) inflates and obfuscates diffs.

    6. +
    7. It completely breaks with variable-width fonts.

    8. +
    +

    Rule of thumb: there should be no indentation that is not a multiple +of 2.

  • +
  • Do not use tabs.

    +

    Rationale: The interpretation of tabs varies wildly across tools and +they get lost or are displayed incorrectly in many contexts, such as web +pages, diffs, etc.

  • +
+

Grouping

+
    +
  • Separate complex multi-line definitions with empty lines. +One-liners can be put on consecutive lines.

    +
    func foo() {
    +  // This function does a lot of interesting stuff.
    +  // It's definition takes multiple lines.
    +}
    +
    +func boo() {
    +  // This is another complicated function.
    +  // It's definition also takes multiple lines.
    +}
    +
    +func add(x : Nat, y : Nat) { return x + y };
    +func mul(x : Nat, y : Nat) { return x * y };
  • +
  • Separate logic groups of definitions with two empty lines. Add a +one-line comment as a "section header" for each group.

    +
    // A very large class
    +class MuffleMiff(n : Nat) {
    +
    +
    +  // Accessors
    +
    +  public func miffMuff() : Text {
    +    ...
    +  }
    +
    +  public func sniffMiff() : Nat {
    +    ...
    +  }
    +
    +
    +  // Mutators
    +
    +  public func clearMurk() {
    +    ...
    +  }
    +
    +  public func addMuff(name : Text) {
    +    ...
    +  }
    +
    +
    +  // Processing
    +
    +  public func murkMuffle(param : List<Gnobble>) {
    +    ...
    +  }
    +
    +  public func transformSneezler() {
    +    ...
    +  }
    +
    +
    +  // Internal State
    +
    +  var miffCount = 0;
    +  var mabbleMap = Map<Nat, Text>();
    +
    +}
  • +
+

Comments

+
    +
  • Use line comments (//…​). Use block comments +(/* …​ */) only when commenting in the middle of a line or +for commenting out pieces of code during development.

    +
    // The following function runs the current
    +// pallaboom on a given snibble. It returns
    +// suitable plexus if it can.
    +func paBoom(s : Snibble) : Handle<Plexus> {
    +  let puglet = initPugs(s.crick, 0 /* size */, #local);
    +/* Don't do the odd stuff yet...
    +  ...
    +  ...
    +*/
    +  return polyfillNexus(puglet);  // for now
    +}
    +

    Rationale: Line comments make it easier to insert, remove or swap +individual lines.

  • +
  • Put short comments explaining a single line at the end of the +line, separated by at least 2 spaces.

    +
    paBoom(getSnibble()));  // create new snibble
  • +
  • Put multi-line comments before a line of code, with the same +indentation as the code it is describing.

    +
    func f() {
    +  // Try to invoke the current pallaboom with
    +  // the previous snibble. If that succeeds,
    +  // we have the new plexus; if not, complain.
    +  let plexusHandle = paBoom(getSnibble()));
    +}
  • +
  • Capitalize comments that are on separate lines. Use a proper full +stop for sentences.

  • +
+

Punctuation

+

Semicolons

+
    +
  • Motoko uniformly requires a semicolon to separate expressions or +local declarations in a block, regardless of whether the preceding +declaration ends in a closing '}'.

    +

    Rationale: This is unlike other C-style languages, which tend to have +rather ad-hoc rules.

  • +
  • Put a semicolon after the last expression in a block, unless the +whole block is written on a single line.

    +

    Similarly for types.

    +
    // No ; needed before closing } on same line
    +
    +type Vec3D = {x : Float; y : Float; z : Float};
    +type Result<A> = {#ok : A; #error : Text};
    +
    +func add(x : Nat, y : Nat) : Nat { return x + y };
    +
    +
    +// End last case with ;
    +
    +type Address = {
    +  first : Text;
    +  last : Text;
    +  street : Text;
    +  nr : Nat;
    +  zip : Nat;
    +  city : Text;
    +};
    +
    +type Expr = {
    +  #const : Float;
    +  #add : (Expr, Expr);
    +  #mul : (Expr, Expr);
    +};
    +
    +func eval(e : Expr) : Float {
    +  switch (e) {
    +    case (#const(x)) { x };
    +    case (#add(e1, e2)) { eval(e1) + eval(e2) };
    +    case (#mul(e1, e2)) { eval(e1) * eval(e2) };
    +  };
    +}
    +

    Rationale: Consistently ending lines with semicolon simplifies +adding, removing, or swapping lines.

  • +
+

Braces

+
    +
  • Put braces around function bodies, if or +case branches, and loop bodies, unless they appear nested +as an expression and only contain a single expression.

    +
    func f(x) { f1(x); f2(x) };
    +
    +let abs = if (v >= 0) v else -v;
    +let val = switch (f()) { case (#ok(x)) x; case (_) 0 };
    +func succ(x : Nat) : Nat = x + 1;
  • +
  • Use "C-style" layout for braced sub-expressions stretching +multiple lines.

    +
    func f() {
    +  return;
    +};
    +
    +if (cond) {
    +  foo();
    +} else {
    +  bar();
    +};
    +
    +switch (opt) {
    +  case (?x) {
    +    f(x);
    +  };
    +  case (null) {};
    +};
  • +
+

Parentheses

+
    +
  • Motoko supports "parenless" style, meaning that parentheses are +optional in most places, such as function parameter lists, or statement +operands, when they enclose an expression that either is bracketed +already (for example, a tuple, object, or array) or is a simple constant +or identifier.

    +
    type Op = Nat -> Nat;
    +let a2 = Array.map<Nat, Nat>(func x { x + 1 }, a);
    +
    +let y = f x;
    +let z = f {};
    +let choice = if flag { f1() } else { f2() };
    +
    +switch opt {
    +  case null { tryAgain() };
    +  case _ { proceed() };
    +};
  • +
  • Avoid overuse of parenless style.

    +

    In particular, do not omit parentheses and braces on statements at +the same time.

    +
    // COUNTER EXAMPLES!
    +let choice = if flag x + y else z;  // DO NOT DO THIS!
    +
    +switch val {
    +  case 0 f();    // DO NOT DO THIS!
    +  case n n + 1;  // OR THIS!
    +};
    +

    Rationale: Omitting both at the same time makes the code harder to +read, since there is less visual clue how it groups.

  • +
  • Similarly, do not omit parentheses around function parameters if +the function also has type parameters.

    +
    // COUNTER EXAMPLE!
    +foo<Nat> 0;   // DO NOT DO THIS!
  • +
  • Omit parentheses around argument types of a function type with a +single argument and no type parameters.

    +

    But do not omit them around when functions or classes also have type +parameters.

    +
    type Inv = Nat -> Nat;
    +type Id = <T>(T) -> T;
    +type Get = <X>(C<X>) -> X;
    +
    +// COUNTER EXAMPLE!
    +type Get = <X>C<X> -> X;   // DO NOT DO THIS!
  • +
+

Miscellaneous

+
    +
  • Use _ to group digits in numbers.

    +

    Group by 3 digits in decimal numbers and by 4 in hexadecimal +notation.

    +
    let billion = 1_000_000_000;
    +let pi = 3.141_592_653_589_793_12;
    +let mask : Nat32 = 0xff00_ff0f;
  • +
+

Naming

+

Style

+
    +
  • Use UpperCamelCase for type names (including classes +or type parameters), module names, and actor names.

  • +
  • Use lowerCamelCase for all other names, including +constants and variant fields.

    +
    module MoreMuff {
    +  type FileSize = Nat;
    +  type Weekday = {#monday; #tuesday; #wednesday};
    +  type Pair<X> = (X, X);
    +
    +  class Container<X, Y>() { ... };
    +
    +  func getValue<Name>(name : Name) : Pair<Name> { ... };
    +
    +  let zero = 0;
    +  let pair = getValue<Text>("opus");
    +  var nifty : Nat = 0;
    +
    +  object obj { ... };
    +
    +  actor ServerProxy { ... };
    +};
    +

    Rationale: The general convention is upper case for "static" entities +like types and lower case for "dynamic" values. Modules and actors are +fairly static and can export types. Objects usually don’t export types +and tend to be used mostly as dynamic values.

  • +
  • Spell acronyms as regular words.

    +
    type HttpHeader = ...;
    +func getUrl() { ... };
    +let urlDigest = ...;
  • +
  • Do not use identifier names that start with an underscore +_, except to document that a variable in a pattern is +intentionally unused.

    +
    let (width, _color, name) = rumpler();
    +...  // _color is not used here
    +
    +
    +func foo(x : Nat, _futureFlag : Bool) { ... };
    +

    Rationale: A type checker can warn about unused identifiers, which +can be suppressed by explicitly prepending _ to its name to +document intention.

    +

    This aligns with the use of the keyword _ for pattern +wildcards.

  • +
+

Conventions

+
    +
  • The name of functions returning a value should describe that +value (as a noun).

    +

    Avoid redundant get prefixes.

    +
    dict.size();
    +list.first();
    +sum(array);
  • +
  • The name of functions performing side effects or complex +operations should describe that operation (as a verb in imperative +form).

    +
    dict.clear();
    +dict.set(key, value);
    +let result = traverse(graph);
  • +
  • The name of predicate functions returning Bool +should use an is or has prefix or a similar +description of the tested property (as a verb in indicative form).

    +
    class Set<X>() {
    +  public func size() : Nat { ... };
    +
    +  public func add(x : X) { ... };
    +  public func remove(x : X) { ... };
    +
    +  public func isEmpty() : Bool { ... };
    +  public func contains(x : X) : Bool { ... };
    +};
  • +
  • Functions converting to or from a type X are named +toX and fromX, respectively, if the source, +resp. target, is either the object the function is a method of, or the +primary type of the module this function appears in.

  • +
  • In classes or objects, use a name ending with _ to +distinguish private variables from getters.

    +
    class Cart(length_ : Nat) {
    +  var width_ = 0;
    +
    +  public func length() : Nat { return length_ };
    +  public func width() : Nat { return width_ };
    +}
    +

    Rationale: In Motoko, functions are first-class values, so functions +and other value identifiers share the same name space.

    +

    Identifiers with a leading _ should not be used +for private state, since that indicates an unused name (see Style).

  • +
  • Use longer, more descriptive names for global or public +identifier or ones with large scope, and short names for local ones with +small scope.

    +

    It is fine to use single character identifiers when there is nothing +interesting to say, especially when using the same naming scheme +consistently.

    +
    func map(x : Nat, y : Nat) : Nat { x + y };
    +
    +func eval(e : Expr) : Nat {
    +  let n =
    +    switch (e) {
    +      case (#neg(e1)) { - eval(e1) };
    +      case (#add(e1, e2)) { eval(e1) + eval(e2) };
    +      case (#mul(e1, e2)) { eval(e1) * eval(e2) };
    +    };
    +  Debug.print(n);
    +  return n;
    +};
    +

    Rationale: Contrary to popular belief, overly chatty local names can +decrease readability instead of increasing it, by increasing the noise +level.

  • +
  • In suitable cases, use plural form for describing a collection of +items, such as a list or array.

    +

    This also works for short names.

    +
    func foreach<X>(xs : [X], f : X -> ()) {
    +  for (x in xs.vals()) { f(x) }
    +}
  • +
+

Types

+

Type Annotations

+
    +
  • Put type annotations on definitions that involve fixed-width +numeric types, to disambiguate the type of overloaded arithmetic +operators and constants.

    +
    let mask : Nat32 = 0xfc03_ff00;
    +let pivot : Nat32 = (size + 1)/2;
    +let vec : [Int16] = [1, 3, -4, 0];
    +

    :::note

    +

    Use floating point constants to enforce type Float +without an extra annotation. Similarly, use an explicit + +sign to produce a positive value of type Int instead of +Nat, if desired.

    +

    :::

    +
    let zero = 1.0;    // type Float
    +let offset = +1;   // type Int
  • +
  • Similarly, put inline type annotations on arithmetic expressions +with types other than Nat or Int.

    +
    if (x & mask == (1 : Nat32)) { ... };
    +

    :::note

    +

    The need to annotate constants in cases like this is a short-coming +of Motoko’s type system that we hope to address soon.

    +

    :::

    +

    An annotation is not needed on function arguments, since their type +is usually inferred from the function. The only exception is when that +argument has generic type and the type arguments have been omitted.

    +
    func foo(len : Nat32, vec : [Nat16]) { ... };
    +func bar<X>(x : X) { ... };
    +
    +foo(3, [0, 1, 2]);
    +bar<Nat16>(0);
    +bar(0 : Nat16);
  • +
  • Put type annotations on mutable variables, unless their type is +obvious.

    +
    var name = "Motoko";
    +var balance = 0;
    +
    +func f(i : Int) {
    +  var j = i;
    +};
    +
    +var balance : Int = 0;
    +var obj : Class = foo();
    +

    Rationale: Due to subtyping, inferring the type from the +initialisation would not necessarily deduce the intended type. For +example, balance would have type Nat without +the annotation, ruling out assignments of integers.

  • +
  • Put type annotations on all public fields in a class.

    +
    class C(init_ : Nat) {
    +  public let init : Nat = init_;
    +  public var count : Nat = 0;
    +}
  • +
  • Omit return type annotations of functions when the type is +().

    +
    func twiceF() { f(); f() };  // no need to write ": ()"
  • +
  • Omit type annotations on functions when they are passed as +arguments.

    +
    Array.map<Nat, Nat>(func n {n + 1}, a);
  • +
  • Put type annotations on definitions that involve numeric types +other than Nat or Int, to resolve the +overloading between arithmetic operators and constants.

    +
    let mask : Nat32 = 0xfc03_ff00;
    +let offset : Nat32 = size + 1;
  • +
+

Picking types

+
    +
  • Use Nat for any integral value that cannot be +negative.

  • +
  • Use fixed-width NatN or IntN only when +storing many values and space usage matters, when bit-fiddling requires +the low-level interpretation of a number as a vector of bits or when +matching types imposed by external requirements, such as other +canisters.

  • +
  • Avoid proliferation of option types, and therefore +null.

    +

    Limit their use to as small a scope as possible. Rule out the +null case and use non-option types wherever +possible.

  • +
  • Consider using records (objects with just data) instead of tuples +when there are more than 2 or 3 components.

    +

    Note that record types need not be declared but can be used in +place.

    +
      func nodeInfo(node : Node) : {parent : Node; left : Node; right : Node} { ... }
  • +
  • Consider using variants instead of Bool to represent +binary choices.

    +

    Note that variant types need not be declared but can be used in +place.

    +
    func capitalization(word : Text) : {#upper; #lower} { ... }
  • +
  • Where possible, use return type () for functions +whose primary purpose is to mutate state or cause other side +effects.

    +
    class Set<X>() {
    +  public func add(x : X) { ... };
    +  public func remove(x : X) { ... };
    +  ...
    +};
  • +
  • Consider using a record (an object with just data) as argument +for long parameter lists.

    +
    func process({seed : Float; delta : Float; data : [Record]; config : Config}) : Thing {
    +  ...
    +};
    +
    +process{config = Config(); data = read(); delta = 0.01; seed = 1.0};
    +

    Rationale: This expresses named parameters. This way, arguments can +be freely reordered at the call site and callers are prevented from +accidentally passing them in the wrong order.

  • +
  • Higher-order functions (functions that take a callback argument) +should put the function parameter last.

    +

    Rationale: Makes call sites more readable, and in the absence of +currying, there is no point in putting the function first, like you +often would in functional languages.

  • +
  • Do not use sentinel values, such as -1, to represent +invalid values.

    +

    Use the option type instead.

    +
    func lookup(x : key) : ?Nat { ... }
  • +
  • Data is immutable in Motoko unless explicitly stated +otherwise.

    +

    Use mutability types and definitions (var) with care and +only where needed.

    +

    Rationale: Mutable data cannot be communicated or share across +actors. It is more error-prone and much more difficult to formally +reason about, especially when concurrency is involved.

  • +
+

Features

+

Statements

+
    +
  • Use for loops instead of while loops +for iterating over a numeric range or a container.

    +
    for (i in Iter.range(1, 10)) { ... };
    +for (x in array.vals()) { ... };
    +

    Rationale: For loops are less error-prone and easier to +read.

  • +
  • Use if or switch as expressions where +appropriate.

    +
    func abs(i : Int) : Int { if (i < 0) -i else i };
    +
    +let delta = switch mode { case (#up) +1; case (#dn) -1 };
  • +
  • Motoko requires that all expressions in a block have type +(), in order to prevent accidentally dropped results.

    +

    Use ignore to explicitly drop results. Do not +use ignore when it’s not needed.

    +
    ignore async f();  // fire of a computation
  • +
  • Motoko allows to omit the return at the end of a +function, because a block evaluates to its last expression.

    +

    Use this when a function is short and in "functional" style, that is, +the function does not contain complex control flow or side effects.

    +

    Use explicit return at the end when the function +contains other return statements or imperative control +flow.

    +
    func add(i : Nat, j : Nat) : Nat { i + j };
    +
    +func foo(a : Float, b : Float) : Float {
    +  let c = a*a + b*b;
    +  c + 2*c*c;
    +};
    +
    +func gcd(i : Nat, j : Nat) : Nat {
    +  if (j == 0) i else gcd(j, i % j);
    +};
    +
    +func gcd2(i : Nat, j : Nat) : Nat {
    +  var a = i;
    +  var b = j;
    +  while (b > 0) {
    +    let c = a;
    +    a := b;
    +    b := c % b;
    +  };
    +  return a;
    +};
  • +
+

Objects and records

+
    +
  • Use the short-hand object syntax +{x1 = e1; …​ ; xN = eN} when using objects as simple +records, i.e., data structures with no private state and no +methods.

  • +
  • Use object when creating singleton objects.

  • +
  • Limit the use of objects to records where possible.

    +

    Rationale: Only records can be sent as message parameters or results +and can be stored in stable variables. Objects with methods are also +more expensive to create and represent in memory.

  • +
  • Use full objects only as a means for encapsulating state or +behaviour.

  • +
+

Classes

+
    +
  • Use class to create multiple objects of the same +shape.

  • +
  • Name classes after their conceptual functionality, not +their implementation, except when having to distinguish +multiple different implementations of the same concept (for example, +OrderedMap vs HashMap).

  • +
  • Classes are both type definitions and factory functions for +objects.

    +

    Do not use classes unless both these roles are intended; use plain +type aliases or functions returning an object in other cases.

  • +
  • Do not overuse classes.

    +

    Use a module defining a plain type and functions on it where +appropriate. Use classes only as a means for encapsulating state or +behaviour.

    +

    Rationale: Objects with methods have disadvantages over simple record +types with separate functions (see above).

  • +
  • If values of a class are meant to be sendable (shared), the class +needs to provide a pair of share/unshare +methods that convert to/from a sharable representation, for example, as +a record.

    +

    :::note

    +

    For immutable classes it may seem more natural to make +unshare a kind of static function. However, even for +immutable ones it may depend on constructor arguments (such as an +ordering function), so that the a pattern like +Map(compareInt).unshare(x) seems appropriate.

    +

    :::

  • +
  • For the time being, avoid overloading classes with too many +methods, since that is currently expensive.

    +

    Restrict to a sufficiently small set of canonical methods and make +less essential ones that can be implemented on top of those into +functions in the enclosing module.

  • +
  • Use modules for "static" classes or methods.

  • +
+

Modules

+
    +
  • Use module to group definitions (including types) +and create a name spae for them.

  • +
  • Where applicable, name modules after the main type or class they +implement or provide functions for.

  • +
  • Limit each module to a single main concept/type/class or closely +entangled family of concepts/types/classes.

  • +
+ + + diff --git a/docs/html/timers.html b/docs/html/timers.html new file mode 100644 index 00000000000..de5cfdc6fbd --- /dev/null +++ b/docs/html/timers.html @@ -0,0 +1,206 @@ + + + + + + + md/timers.md + + + + +
+

md/timers.md

+
+ +

Timers

+

Internet Computer canisters can set an arbitrary number of +single-expiration or recurring timers. See the Timer.mo module in the base +library.

+

A simple, contrived example is a periodic reminder, that logs a +new-year's message:

+
+

The underlying mechanism is a canister +global timer that, by default, is issued with appropriate callbacks +from a priority queue maintained by the Motoko runtime.

+

The timer mechanism can be disabled completely by passing the +-no-timer flag to moc.

+

When lower-level access to the canister global timer is desired, an +actor can elect to receive timer expiry messages by declaring a +system function, named timer. The function +takes one argument (to re-set the global timer), and returns a future of +unit type (async ()). If the timer system +method is declared, the Timer.mo base library module may +not function correctly and should not be used.

+

The following example of a global timer expiration callback gets +called immediately after the canister starts (i.e. after install) and +periodically every twenty seconds thereafter:

+
system func timer(setGlobalTimer : Nat64 -> ()) : async () {
+  let next = Nat64.fromIntWrap(Time.now()) + 20_000_000_000;
+  setGlobalTimer(next); // absolute time in nanoseconds
+  print("Tick!");
+}
+ + diff --git a/docs/html/upgrades.html b/docs/html/upgrades.html new file mode 100644 index 00000000000..b08024121a6 --- /dev/null +++ b/docs/html/upgrades.html @@ -0,0 +1,439 @@ + + + + + + + md/upgrades.md + + + + +
+

md/upgrades.md

+
+ +

Stable variables and +upgrade methods

+

One key feature of the Internet Computer is its ability to persist +canister smart contract state using WebAssembly memory and globals +rather than a traditional database. This means that that the entire +state of a canister is magically restored before, and saved after, each +message, without explicit user instruction. This automatic and +user-transparent preservation of state is called orthogonal +persistence.

+

Though convenient, orthogonal persistence poses a challenge when it +comes to upgrading the code of a canister. Without an explicit +representation of the canister’s state, how does one tranfer any +application data from the retired canister to its replacement?

+

Accommodating upgrades without data loss requires some new facility +to migrate a canister’s crucial data to the upgraded canister. +For example, if you want to deploy a new version of a user-registration +canister to fix an issue or add functionality, you need to ensure that +existing registrations survive the upgrade process.

+

The Internet Computer’s persistence model allows a canister to save +and restore such data to dedicated stable memory that, unlike +ordinary canister memory, is retained across an upgrade, allowing a +canister to transfer data in bulk to its replacement canister.

+

For applications written in Motoko, the language provides high-level +support for preserving state that leverages Internet Computer stable +memory. This higher-level feature, called stable storage, is +designed to accommodate changes to both the application data and to the +Motoko compiler used to produce the application code.

+

Utilizing stable storage depends on you — as the application +programmer — anticipating and indicating the data you want to retain +after an upgrade. Depending on the application, the data you decide to +persist might be some, all, or none of a given actor’s state.

+ + +

Declaring stable variables

+

In an actor, you can nominate a variable for stable storage (in +Internet Computer stable memory) by using the stable +keyword as a modifier in the variable’s declaration.

+

More precisely, every let and var variable +declaration in an actor can specify whether the variable is +stable or flexible. If you don’t provide a +modifier, the variable is declared as flexible by +default.

+ + +

The following is a simple example of how to declare a stable counter +that can be upgraded while preserving the counter’s value:

+
+

:::note

+

You can only use the stable or flexible +modifier on let and var declarations that are +actor fields. You cannot use these modifiers anywhere +else in your program.

+

:::

+

Typing

+

Because the compiler must ensure that stable variables are both +compatible with and meaningful in the replacement program after an +upgrade, the following type restrictions apply to stable state:

+
    +
  • every stable variable must have a stable +type
  • +
+

where a type is stable if the type obtained by ignoring any +var modifiers within it is shared.

+

Thus the only difference between stable types and shared types is the +former’s support for mutation. Like shared types, stable types are +restricted to first-order data, excluding local functions and structures +built from local functions (such as objects). This exclusion of +functions is required because the meaning of a function value — +consisting of both data and code — cannot easily be preserved across an +upgrade, while the meaning of plain data — mutable or not — can be.

+

:::note

+

In general, object types are not stable because they can contain +local functions. However, a plain record of stable data is a special +case of object types that is stable. Moreover, references to actors and +shared functions are also stable, allowing you to preserve their values +across upgrades. For example, you can preserve state recording a set of +actors or shared function callbacks subscribing to a service.

+

:::

+

How stable variables are +upgraded

+

When you first compile and deploy a canister, all flexible and stable +variables in the actor are initialized in sequence. When you deploy a +canister using the upgrade mode, all stable variables that +existed in the previous version of the actor are pre-initialized with +their old values. After the stable variables are initialized with their +previous values, the remaining flexible and newly-added stable variables +are initialized in sequence.

+

Preupgrade and +postupgrade system methods

+

Declaring a variable to be stable requires its type to +be stable too. Since not all types are stable, some variables cannot be +declared stable.

+

As a simple example, consider the Registry actor from +the discussion of orthogonal +persistence.

+
+

This actor assigns sequential identifiers to Text +values, using the size of the underlying map object to +determine the next identifier. Like other actors, it relies on +orthogonal persistence to maintain the state of the hashmap +between calls.

+

We’d like to make the Register upgradable, without the +upgrade losing any existing registrations.

+

Unfortunately, its state, map, has a proper object type +that contains member functions (for example, map.get), so +the map variable cannot, itself, be declared +stable.

+

For scenarios like this that can’t be solved using stable variables +alone, Motoko supports user-defined upgrade hooks that, when provided, +run immediately before and after upgrade. These upgrade hooks allow you +to migrate state between unrestricted flexible variables to more +restricted stable variables. These hooks are declared as +system functions with special names, preugrade +and postupgrade. Both functions must have type +: () → ().

+

The preupgrade method lets you make a final update to +stable variables, before the runtime commits their values to Internet +Computer stable memory, and performs an upgrade. The +postupgrade method is run after an upgrade has initialized +the replacement actor, including its stable variables, but before +executing any shared function call (or message) on that actor.

+

Here, we introduce a new stable variable, entries, to +save and restore the entries of the unstable hash table.

+
+

Note that the type of entries, being just an array of +Text and Nat pairs, is indeed a stable +type.

+

In this example, the preupgrade system method simply +writes the current map entries to entries +before entries is saved to stable memory. The +postupgrade system method resets entries to +the empty array after map has been populated from +entries to free space.

+

Stable type signatures

+

The collection of stable variable declarations in an actor can be +summarized in a stable signature.

+

The textual representation of an actor’s stable signature resembles +the internals of a Motoko actor type:

+
actor {
+  stable x : Nat;
+  stable var y : Int;
+  stable z : [var Nat];
+};
+

It specifies the names, types and mutability of the actor’s stable +fields, possibly preceded by relevant Motoko type declarations.

+

:::tip

+

You can emit the stable signature of the main actor or actor class to +a .most file using moc compiler option +--stable-types. You should never need to author your own +.most file.

+

:::

+

A stable signature <stab-sig1> is +stable-compatible with signature +<stab-sig2>, if, and only,

+
    +
  • every immutable field stable <id> : T in +<stab-sig1> has a matching field +stable <id> : U in <stab-sig2> +with T <: U.

  • +
  • every mutable field stable var <id> : T in +<stab-sig1> has a matching field +stable var <id> : U in <stab-sig2> +with T <: U.

  • +
+

Note that <stab-sig2> may contain additional +fields. Typically, <stab-sig1> is the signature of an +older version while <stab-sig2> is the signature of a +newer version.

+

The subtyping condition on stable fields ensures that the final value +of some field can be consumed as the initial value of that field in the +upgraded code.

+

:::tip

+

You can check the stable-compatiblity of two .most +files, cur.most and nxt.most (containing +stable signatures), using moc compiler option +--stable-compatible cur.most nxt.most.

+

:::

+

:::note

+

The stable-compatible relation is quite conservative. In the +future, it may be relaxed to accommodate a change in field mutability +and/or abandoning fields from <stab-sig1> (but with a +warning).

+

:::

+

Upgrade safety

+

Before upgrading a deployed canister, you should ensure that the +upgrade is safe and will not

+
    +
  • break existing clients (due to a Candid interface change); +or

  • +
  • discard Motoko stable state (due to an incompatible change in +stable declarations).

  • +
+

A Motoko canister upgrade is safe provided:

+
    +
  • the canister’s Candid interface evolves to a Candid subtype; +and

  • +
  • the canister’s Motoko stable signature evolves to a +stable-compatible one.

  • +
+

Upgrade safety does not guarantee that the upgrade process will +succeed (it can still fail due to resource constraints). However, it +should at least ensure that a successful upgrade will not break Candid +type compatibility with existing clients or unexpectedly lose data that +was marked stable.

+

:::tip

+

You can check valid Candid subtyping between two services described +in .did files, cur.did and +nxt.did (containing Candid types), using the +didc tool with argument check nxt.did cur.did. +The didc tool is available at https://github.com/dfinity/candid.

+

:::

+

Metadata sections

+

The Motoko compiler embeds the Candid interface and stable signature +of a canister as canister metadata, recorded in additional Wasm custom +sections of a compiled binary.

+

This metadata can be selectively exposed by the IC and used by tools +such as dfx to verify upgrade compatibility.

+

Upgrading +a deployed actor or canister smart contract

+

After you have deployed a Motoko actor with the appropriate +stable variables or preupgrade and +postupgrade system methods, you can use the +dfx canister install command with the +--mode=upgrade option to upgrade an already deployed +version. For information about upgrading a deployed canister, see Upgrade +a canister smart contract.

+

An upcoming version of dfx will, if appropriate, check +the safety of an upgrade by comparing the Candid and (for Motoko +canisters only) the stable signatures embedded in the deployed binary +and upgrade binary, and abort the upgrade request when unsafe.

+ + diff --git a/docs/nix-support/hydra-build-products b/docs/nix-support/hydra-build-products new file mode 100644 index 00000000000..c94a863ef48 --- /dev/null +++ b/docs/nix-support/hydra-build-products @@ -0,0 +1,2 @@ +report guide /nix/store/ybn6ph4lixm244kslqvs1s2c28hc21kl-docs html/motoko.html +report slides /nix/store/ybn6ph4lixm244kslqvs1s2c28hc21kl-docs overview-slides.html diff --git a/docs/overview-slides.html b/docs/overview-slides.html new file mode 100644 index 00000000000..5ef32d9964f --- /dev/null +++ b/docs/overview-slides.html @@ -0,0 +1,743 @@ + + + + + + + Motoko + + + + + + + + + +
+
+ +
+

Motoko

+

A comprehensive overview

+
+ +
+
+

Overview

+ +
+

Motivation and Goals

+

A simple, useful language for the Internet Computer (IC)

+
    +
  • Familiar syntax
  • +
  • Safe by default
  • +
  • Incorporating actor canister model
  • +
  • Seamless integration of IC features
  • +
  • Making most of present and future WebAssembly
  • +
+

Key Design Points

+
    +
  • Object-oriented, functional & imperative
  • +
  • Objects as records of members
  • +
  • async/await for sequential programming of +asynchronous messaging
  • +
  • Structural typing with simple generics and subtyping
  • +
  • Safe arithmetic (unbounded and checked)
  • +
  • Non-nullable types by default
  • +
  • JavaScript-like syntax but statically typed & sane
  • +
+

Inspirations: Java(Script), C#, Swift, Pony, ML, Haskell

+

Semantics

+
    +
  • call-by-value (like Java, C, JS, ML; unlike Haskell, Nix)
  • +
  • declarations are locally mutually recursive
  • +
  • parametric, bounded polymorphism
  • +
  • subtyping as subsumption, not coercion.
  • +
  • no dynamic casts
  • +
  • no inheritance
  • +
+

Implementation(s)

+
    +
  • implemented in OCaml (leverages wasm libary)
  • +
  • simple reference interpreter
  • +
  • less simple compiler to WebAssembly +
      +
    • multipass with typed IR in each pass.
    • +
    • uniform representation, unboxed arithmetic
    • +
    • two-space gc (for now), gc between messages
    • +
  • +
  • polymorphism by erasure
  • +
+
+
+

The language

+ +
+
+

Expressions

+
    +
  • Identifiers:
    +x, foo_bar, test', +List, Map

  • +
  • Parentheses for grouping

  • +
  • Type annotations (to help type inference):
    +(42 : Int)

  • +
+
+
+

Blocks and declarations

+
  type Delta = Nat;
+  func print() {
+    Debug.print(Int.toText(counter));
+  };
+  let d : Delta = 42;
+  var counter = 1;
+  counter := counter + tmp;
+  print();
+
    +
  • Semicolon after each declaration!
  • +
  • Mutually recursive
  • +
  • Mutable variables marked explicitly
  • +
+
+
+

Control flow

+
    +
  • if (b) …
  • +
  • if (b) … else …
  • +
  • switch x { case (pat1) e1; …; case _ en }
  • +
  • while (b) …
  • +
  • loop …
  • +
  • loop … while (b)
  • +
  • for (pat in e) …
  • +
+
+
+
+

Primitive types

+ +
+
+

Unbounded integers

+

Int

+

Inferred by default for negative literals.

+

Literals: 13, 0xf4, -20, ++1, 1_000_000

+
+
+

Unbounded naturals

+

Nat

+

Non-negative, trap upon underflow.

+

Inferred by default for non-negative literals

+

Literals: 13, 0xf4, +1_000_000

+
+
+

Bounded numbers (trapping)

+

Nat8, Nat16, Nat32, +Nat64, Int8, Int16, +Int32, Int64

+

Trap on over- and underflow. Wrap-on-trap and bit-manipulating +operations available.

+

Needs type annotations (somewhere)

+

Literals: 13, 0xf4, -20, +1_000_000

+
+
+

Floating point numbers

+

Float

+

IEEE 754 double precision (64 bit) semantics, normalized NaN

+

Inferred for fractional literals

+

Literals: 0, -10, 2.71, -0.3e+15, +3.141_592_653_589_793_12

+
+
+

Numeric operations

+

No surprises here

+

- x
+a + b
+a & b
+…

+
+
+

Characters and text

+

Char, Text

+

Unicode! No random access.

+
    +
  • 'x', '\u{6a}', '☃',
  • +
  • "boo", "foo \u{62}ar ☃"
  • +
  • "Concat" # "enation"
  • +
+
+
+

Booleans

+

Bool

+

Literals: true, false

+

a or b
+a and b
+not b
+if (b) e1 else e2

+
+
+
+

Functions

+ +
+
+

Function types

+
    +
  • Simple functions:

    +
    Int.toText : Int -> Text
  • +
  • multiple arguments and return values

    +
    divRem : (Int, Int) -> (Int, Int)
  • +
  • can be generic/polymorphic

    +
    Option.unwrapOr : <T>(?T, default : T) -> T
  • +
  • first-class (can be passed around, stored)

    +
    map : <A, B>(f : A -> B, xs : [A]) -> [B]
    +let funcs : [<T>(T) -> T] = …
  • +
+
+
+

Function Declarations & Use

+
func add(x : Int, y : Int) : Int = x + y;
+
+func applyNTimes<T>(n : Nat, x : T, f : T -> ()) {
+  if (n == 0) return;
+  f(x);
+  applyNTimes(n-1, x, f);
+}
+
+applyNTimes<Text>(10, "Hello!", func(x) = { Debug.print(x) } );
+
    +
  • func() { … } short for +func() : () = { … }
  • +
  • Parametric functions
  • +
  • Type instantiations may sometimes be omitted
  • +
  • Anonymous functions (a.k.a. lambdas)
  • +
+
+
+
+

Composite types

+ +
+
+

Tuples

+

(Bool, Float, Text)

+

immutable, heterogeneous, fixed size

+
let tuple = (true, 1.2, "foo");
+tuple.1 > 0.0;
+let (_,_,t) = tuple;
+
+
+

Options

+

?Text

+

is either a value of that type, or null

+
func foo(x : ?Text) : Text {
+  switch x {
+    case (null) { "No value" };
+    case (?y) { "Value: " # y };
+  };
+};
+foo(null);
+foo(?"Test");
+
+
+

Arrays (immutable)

+

[Text]

+
let days = ["Monday", "Tuesday", … ];
+assert(days.len() == 7);
+assert(days[1] == "Tuesday");
+// days[7] will trap (fixed size)
+for (d in days.vals()) { Debug.print(d) };
+
+
+

Arrays (mutable)

+

[var Nat]

+
let counters = [var 1, 2, 3];
+assert(counters.len() == 3);
+counters[1] := counters[1] + 1;
+// counters[3] will trap (fixed size)
+
+
+

Records

+

{name : Text; points : var Int}

+
let player = { name = "Joachim";  var points = 0 };
+Debug.print(
+  player.name # " has " #
+  Int.toText(player.points) # " points."
+);
+player.points += 1;
+
+
+

Objects

+

{ get : () -> Int; add : Int -> () }

+
object self {
+  var points = 0; // private by default
+  public func get() = points;
+  public func add(p : Int) { points += p };
+}
+

Different syntax, same type as records

+
+
+

Variants

+

{ #invincible; #alive : Int; #dead }

+
type Health = { #invincible; #alive : Nat; #dead };
+func takeDamage(h : Health, p : Nat) : Health {
+  switch (h) {
+    case (#invincible) #invincible;
+    case (#alive hp) {
+      if (hp > p) (#alive (hp-p)) else #dead
+    };
+    case (#dead) #dead;
+  }
+}
+
+
+
+

Packages and modules

+ +
+
+

Modules

+
// the type of base/Int.mo
+module {
+  toText : Int -> Text;
+  abs : Int -> Nat;
+  …
+}
+

types and values like objects

+

but restricted to static content (pure, no state, …)

+
+
+

Module imports

+
import Debug "mo:base/Debug";
+import Int "mo:base/Int";
+

base package provides basic features.

+

More libraries popping up!

+
+
+
+

Platform features

+ +
+
+

Actor types

+

Like object types, but marked as actor:

+
type Receiver = actor { recv : Text -> async Nat };
+type Broadcast = actor {
+  register : Receiver -> ();
+  send : Text -> async Nat;
+}
+

sharable arguments and no or async result +type.

+

“canister” ≈ “actor”

+
+
+

sharable ≈ serializable

+
    +
  • all primitive types
  • +
  • records, tuples, arrays, variants, options
    +with immutable sharable components
  • +
  • actor types
  • +
  • shared function type

    Not +sharable:
  • +
  • mutable things
  • +
  • local functions
  • +
  • objects (with methods)
  • +
+
+
+

A complete actor

+
import Array "mo:base/Array";
+actor {
+  var r : [Receiver] = [];
+  public func register(a : Receiver) {
+    r := Array.append(r, [a]);
+  };
+  public func send(t : Text) : async Nat {
+    var sum := 0;
+    for (a in r.values()) {
+      sum += await a.recv(t);
+    };
+    return sum;
+  };
+}
+

a typical canister main file

+
+
+

Async/await

+

async T

+

asychronous future or promise

+

introduced by async { … }
+(implicit in async function declaration)

+

await e
+suspends computation pending e’s result

+
+
+

Actor import

+
import Broadcast "ic:ABCDEF23";
+actor Self {
+  public func go() {
+    Broadcast.register(Self);
+  };
+  public func recv(msg : Text) : async Nat {
+    …
+  }
+}
+
+
+

Principal and caller

+
actor Self {
+  let myself : Principal = Principal.fromActor(Self);
+  public shared(context) func hello() : async Text {
+    if (context.caller == myself) {
+      "Talking to yourself is the first sign of madness";
+    } else {
+      "Hello, nice to see you";
+    };
+  };
+}
+

Principal: identity of a user or canister/actor

+
+
+
+

Type system

+ +
+
+

Structural

+
type Health1 = { #invincible; #alive : Nat; #dead };
+type Health2 = { #invincible; #alive : Nat; #dead };
+
+let takeDamage : (Health1, Nat) -> Health1 = …;
+let h : Health2 = #invincible;
+let h' = takeDamage(h, 100); // works
+

Type definitions
+do not create types,
+but name existing types

+
+
+

Subtyping

+

Mortal <: Health

+
type Health = { #invincible; #alive : Nat; #dead };
+type Mortal = { #alive : Nat; #dead };
+
+let takeDamage : (Health, Nat) -> Health = …;
+let h : Mortal = #alive 1000;
+let h' = takeDamage(h, 100); // also works
+

t1 <: t2: t1 can be used wherever +t2 is expected

+
+
+

Generic types

+
type List<T> = ?{head : T; tail : List<T>};
+
+…
+let l : List<Nat> = ?{head = 0; tail = ?{head = 1 ; tail = null }};
+
+
+
+

Fin

+ +
+
+

Not covered

+
    +
  • Polymorphic functions with type bounds
  • +
  • Classes
  • +
  • Error handling (try … catch … & +throw …)
  • +
+
+
+
+

Old slides

+ +
+

Classes

+

Classes as functions returning objects:

+
 class Counter(init : Int) {
+    private var state : Int = init;
+    public func inc() { state += 1; };
+    public func get() : Int { state; };
+  }
+

Class instantiation as function call (no new):

+
let c = Counter(666);
+c.inc();
+let 667 = c.get();
+

Generic Classes

+
class Dict< K, V > (cmp : (K,K)-> Int ) {
+  add(k: K, v: V) { ... };
+  find(k: K) : ? V { ... };
+};
+
let d = Dict<Int,Text> (func (i:Int, j:Int) : Int = i - j);
+d.add(1,"Alice");
+let ? name = d.find(1);
+

Language prelude

+
    +
  • connects internal primitives with surface syntax (types, +operations)
  • +
  • conversions like intToNat32
  • +
  • side-effecting operations debugPrintInt (tie into +execution environment)
  • +
  • utilities like hashInt, clzNat32
  • +
+
+
+

Sample App

+ +
+

Implementing Chat

+
    +
  • type example
  • +
  • one server actor
  • +
  • multiple clients, each an instance of (actor) class Client.
  • +
+

Chat Server

+
actor Server {
+  private var clients : List<Client> = null;
+
+  private shared broadcast(message : Text) {
+    var next = clients;
+    loop {
+      switch next {
+        case null { return; }
+        case (?l) { l.head.send(message); next := l.tail; };
+      };
+    };
+  };
+
  public func subscribe(client : Client) : async Post {
+    let cs = {head = client; var tail = clients};
+    clients := ?cs;
+    return broadcast;
+  };
+};
+

Example: The client class

+
type Server = actor { subscribe : Client -> async Post; };
+
+actor class Client() = this {
+  private var name : Text = "";
+  public func start(n : Text , s : Server) {
+    name := n;
+    let _ = async {
+       let post = await s.subscribe(this);
+       post("hello from " # name);
+       post("goodbye from " # name);
+    }
+  };
+
  public func send(msg : Text) {
+    debugPrint(name # " received " # msg # "\n");
+  };
+};
+

Example: test

+

test

+
let bob = Client();
+let alice = Client();
+let charlie = Client();
+
+bob.start("Bob", Server);
+alice.start("Alice", Server);
+charlie.start("Charlie", Server);
+

output

+
[nix-shell:~/motoko/guide]$ ../src/moc -r chat.mo
+charlie received hello from bob
+alice received hello from bob
+bob received hello from bob
+charlie received goodbye from bob
+alice received goodbye from bob
+bob received goodbye from bob
+charlie received hello from alice
+alice received hello from alice
+bob received hello from alice
+charlie received goodbye from alice
+alice received goodbye from alice
+bob received goodbye from alice
+charlie received hello from charlie
+alice received hello from charlie
+bob received hello from charlie
+charlie received goodbye from charlie
+alice received goodbye from charlie
+bob received goodbye from charlie
+
+
+ + + + + + + + + + + diff --git a/flamegraphs/assetstorage-reverse.svg b/flamegraphs/assetstorage-reverse.svg new file mode 100644 index 00000000000..7a02abbacc2 --- /dev/null +++ b/flamegraphs/assetstorage-reverse.svg @@ -0,0 +1,4325 @@ + + + + + + + + + + + + + + +assetstorage.mo (reverse) + +Reset Zoom +Search + + + +@serialize_go<t> (28 samples, 0.08%) + + + +$lambda (522 samples, 1.52%) + + + +$lambda (26 samples, 0.08%) + + + +Text.compare_lt (28 samples, 0.08%) + + + +insertRoot (13 samples, 0.04%) + + + +store (14 samples, 0.04%) + + + +getRec (9 samples, 0.03%) + + + +list (4 samples, 0.01%) + + + +iterate (6 samples, 0.02%) + + + +$lambda (26 samples, 0.08%) + + + +put (11 samples, 0.03%) + + + +init (166 samples, 0.48%) + + + +list (8 samples, 0.02%) + + + +@serialize_go<B> (12 samples, 0.03%) + + + +@reset_refund (16 samples, 0.05%) + + + +put (11 samples, 0.03%) + + + +compacting_gc (1,285 samples, 3.74%) +comp.. + + +retrieve (5 samples, 0.01%) + + + +store (64 samples, 0.19%) + + + +init (87 samples, 0.25%) + + + +$lambda (56 samples, 0.16%) + + + +$lambda (126 samples, 0.37%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (4 samples, 0.01%) + + + +$lambda (4 samples, 0.01%) + + + +canister_init (12 samples, 0.03%) + + + +Array.idx (24 samples, 0.07%) + + + +Buffer (104 samples, 0.30%) + + + +getRec (28 samples, 0.08%) + + + +entries (94 samples, 0.27%) + + + +list (26 samples, 0.08%) + + + +put (13 samples, 0.04%) + + + +insertRoot (13 samples, 0.04%) + + + +init (372 samples, 1.08%) + + + +retrieve (13 samples, 0.04%) + + + +@serialize<vt> (8 samples, 0.02%) + + + +$lambda (33 samples, 0.10%) + + + +store (64 samples, 0.19%) + + + +motoko_rts::text::text_get_range::hd4249e7b4d3fea44 (56 samples, 0.16%) + + + +retrieve (4 samples, 0.01%) + + + +retrieve (59 samples, 0.17%) + + + +$lambda (21 samples, 0.06%) + + + +alloc_array (3 samples, 0.01%) + + + +$lambda (14 samples, 0.04%) + + + +@deserialize<tB> (33 samples, 0.10%) + + + +__wasm_call_ctors (665 samples, 1.93%) +_.. + + +toArray (12 samples, 0.03%) + + + +anon-func-165.17 (10 samples, 0.03%) + + + +list (94 samples, 0.27%) + + + +put (13 samples, 0.04%) + + + +RBTree (65 samples, 0.19%) + + + +@serialize_go<vt> (28 samples, 0.08%) + + + +$lambda (4 samples, 0.01%) + + + +list (28 samples, 0.08%) + + + +$lambda (5 samples, 0.01%) + + + +canister_init (588 samples, 1.71%) + + + +$lambda (59 samples, 0.17%) + + + +retrieve (66 samples, 0.19%) + + + +next (121 samples, 0.35%) + + + +text_of_ptr_size (26 samples, 0.08%) + + + +$lambda (12 samples, 0.03%) + + + +$lambda (72 samples, 0.21%) + + + +Array_tabulate (89 samples, 0.26%) + + + +@deserialize<tB> (78 samples, 0.23%) + + + +store (6 samples, 0.02%) + + + +add (10 samples, 0.03%) + + + +toArray (7 samples, 0.02%) + + + +retrieve (37 samples, 0.11%) + + + +canister_init (66 samples, 0.19%) + + + +utf8_validate (371 samples, 1.08%) + + + +$lambda (18 samples, 0.05%) + + + +@deserialize_go<B> (60 samples, 0.17%) + + + +retrieve (60 samples, 0.17%) + + + +add (10 samples, 0.03%) + + + +toArray (26 samples, 0.08%) + + + +@buffer_size<vt> (33 samples, 0.10%) + + + +list (56 samples, 0.16%) + + + +init (33 samples, 0.10%) + + + +list (143 samples, 0.42%) + + + +insertRec (11 samples, 0.03%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (26 samples, 0.08%) + + + +get (95 samples, 0.28%) + + + +retrieve (81 samples, 0.24%) + + + +@serialize_go<B> (60 samples, 0.17%) + + + +list (26 samples, 0.08%) + + + +list (214 samples, 0.62%) + + + +@deserialize<tB> (15 samples, 0.04%) + + + +list (300 samples, 0.87%) + + + +$lambda (13 samples, 0.04%) + + + +memcpy (1,983 samples, 5.77%) +memcpy + + +next (143 samples, 0.42%) + + + +list (26 samples, 0.08%) + + + +retrieve (12 samples, 0.03%) + + + +@deserialize_go<t> (20 samples, 0.06%) + + + +$lambda (60 samples, 0.17%) + + + +@buffer_size<t> (4 samples, 0.01%) + + + +store (13 samples, 0.04%) + + + +next (121 samples, 0.35%) + + + +entries (26 samples, 0.08%) + + + +retrieve (33 samples, 0.10%) + + + +blob_of_principal (4 samples, 0.01%) + + + +$lambda (4 samples, 0.01%) + + + +leb128_decode (960 samples, 2.79%) +le.. + + +iterate (11 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (372 samples, 1.08%) + + + +Buffer (52 samples, 0.15%) + + + +list (30 samples, 0.09%) + + + +link_start (4 samples, 0.01%) + + + +list (56 samples, 0.16%) + + + +$lambda (6 samples, 0.02%) + + + +canister_init (4 samples, 0.01%) + + + +init (4 samples, 0.01%) + + + +retrieve (3 samples, 0.01%) + + + +@deserialize<t> (64 samples, 0.19%) + + + +text_compare (228 samples, 0.66%) + + + +$lambda (41 samples, 0.12%) + + + +iterate (121 samples, 0.35%) + + + +list (84 samples, 0.24%) + + + +insertRoot (17 samples, 0.05%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 1.08%) + + + +retrieve (60 samples, 0.17%) + + + +toArray (125 samples, 0.36%) + + + +getRec (28 samples, 0.08%) + + + +@deserialize_go<t> (4 samples, 0.01%) + + + +list (256 samples, 0.74%) + + + +store (11 samples, 0.03%) + + + +$lambda (84 samples, 0.24%) + + + +init (39 samples, 0.11%) + + + +canister_init (472 samples, 1.37%) + + + +toArray (162 samples, 0.47%) + + + +trans_state6 (39 samples, 0.11%) + + + +retrieve (3 samples, 0.01%) + + + +retrieve (204 samples, 0.59%) + + + +@deserialize<> (300 samples, 0.87%) + + + +$lambda (34 samples, 0.10%) + + + +$lambda (60 samples, 0.17%) + + + +$lambda (118 samples, 0.34%) + + + +toArray (44 samples, 0.13%) + + + +$lambda (11 samples, 0.03%) + + + +store (162 samples, 0.47%) + + + +get (12 samples, 0.03%) + + + +@deserialize<t> (33 samples, 0.10%) + + + +getRec (95 samples, 0.28%) + + + +getRec (5 samples, 0.01%) + + + +store (13 samples, 0.04%) + + + +$lambda (12 samples, 0.03%) + + + +__wasm_apply_global_relocs (16 samples, 0.05%) + + + +leb128_encode (48 samples, 0.14%) + + + +toArray (182 samples, 0.53%) + + + +@deserialize<t> (37 samples, 0.11%) + + + +list (8 samples, 0.02%) + + + +store (61 samples, 0.18%) + + + +canister_init (13 samples, 0.04%) + + + +store (28 samples, 0.08%) + + + +store (4 samples, 0.01%) + + + +$lambda (36 samples, 0.10%) + + + +put (17 samples, 0.05%) + + + +canister_init (87 samples, 0.25%) + + + +$lambda (26 samples, 0.08%) + + + +list (24 samples, 0.07%) + + + +@serialize<vt> (8 samples, 0.02%) + + + +getRec (114 samples, 0.33%) + + + +compacting_gc (208 samples, 0.60%) + + + +store (13 samples, 0.04%) + + + +list (6 samples, 0.02%) + + + +list (10 samples, 0.03%) + + + +to_4_tuple (34 samples, 0.10%) + + + +@serialize<B> (30 samples, 0.09%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (208 samples, 0.60%) + + + +@deserialize<tB> (13 samples, 0.04%) + + + +Text.compare_eq (28 samples, 0.08%) + + + +$lambda (18 samples, 0.05%) + + + +next (162 samples, 0.47%) + + + +toArray (11 samples, 0.03%) + + + +toArray (18 samples, 0.05%) + + + +list (125 samples, 0.36%) + + + +RBTree (13 samples, 0.04%) + + + +$lambda (126 samples, 0.37%) + + + +alloc_size<3>_tag<15> (91 samples, 0.26%) + + + +@deserialize<t> (128 samples, 0.37%) + + + +$lambda (10 samples, 0.03%) + + + +B_gt (10 samples, 0.03%) + + + +$lambda (114 samples, 0.33%) + + + +link_start (16 samples, 0.05%) + + + +$lambda (132 samples, 0.38%) + + + +store (28 samples, 0.08%) + + + +toArray (11 samples, 0.03%) + + + +@deserialize<> (8 samples, 0.02%) + + + +list (17 samples, 0.05%) + + + +list (39 samples, 0.11%) + + + +@serialize_go<vt> (7 samples, 0.02%) + + + +init (65 samples, 0.19%) + + + +$lambda (13 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (8 samples, 0.02%) + + + +$lambda (12 samples, 0.03%) + + + +entries (36 samples, 0.10%) + + + +anon-func-165.17 (42 samples, 0.12%) + + + +canister_init (13 samples, 0.04%) + + + +put (18 samples, 0.05%) + + + +trans_state3 (11 samples, 0.03%) + + + +next (180 samples, 0.52%) + + + +iterate (8 samples, 0.02%) + + + +get (78 samples, 0.23%) + + + +Text.compare_eq (41 samples, 0.12%) + + + +store (33 samples, 0.10%) + + + +list (4 samples, 0.01%) + + + +$lambda (7 samples, 0.02%) + + + +alloc_blob (32 samples, 0.09%) + + + +iter (36 samples, 0.10%) + + + +anon-func-165.17 (79 samples, 0.23%) + + + +store (72 samples, 0.21%) + + + +to_4_tuple (26 samples, 0.08%) + + + +toArray (26 samples, 0.08%) + + + +retrieve (4 samples, 0.01%) + + + +parse_idl_header (512 samples, 1.49%) + + + +$lambda (182 samples, 0.53%) + + + +canister_init (39 samples, 0.11%) + + + +@deserialize<> (4 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (30 samples, 0.09%) + + + +list (8 samples, 0.02%) + + + +Array_init (126 samples, 0.37%) + + + +canister_init (33 samples, 0.10%) + + + +list (4 samples, 0.01%) + + + +@serialize_go<vt> (27 samples, 0.08%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (6 samples, 0.02%) + + + +$lambda (73 samples, 0.21%) + + + +canister_init (13 samples, 0.04%) + + + +__get_hp (41 samples, 0.12%) + + + +store (33 samples, 0.10%) + + + +iterate (126 samples, 0.37%) + + + +$lambda (11 samples, 0.03%) + + + +retrieve (126 samples, 0.37%) + + + +$lambda (79 samples, 0.23%) + + + +canister_init (66 samples, 0.19%) + + + +@deserialize<t> (3 samples, 0.01%) + + + +link_start (14 samples, 0.04%) + + + +@deserialize_go<t> (46 samples, 0.13%) + + + +list (51 samples, 0.15%) + + + +toArray (12 samples, 0.03%) + + + +@deserialize<tB> (60 samples, 0.17%) + + + +$lambda (10 samples, 0.03%) + + + +$lambda (4 samples, 0.01%) + + + +@serialize_go<vt> (73 samples, 0.21%) + + + +@deserialize<t> (60 samples, 0.17%) + + + +store (33 samples, 0.10%) + + + +list (26 samples, 0.08%) + + + +idl_sub_buf_words (36 samples, 0.10%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,351 samples, 3.93%) +moto.. + + +init (13 samples, 0.04%) + + + +insertRec (28 samples, 0.08%) + + + +list (8 samples, 0.02%) + + + +iterate (17 samples, 0.05%) + + + +store (52 samples, 0.15%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (3 samples, 0.01%) + + + +put (17 samples, 0.05%) + + + +list (16 samples, 0.05%) + + + +trans_state5 (13 samples, 0.04%) + + + +$lambda (4 samples, 0.01%) + + + +list (4 samples, 0.01%) + + + +iterate (10 samples, 0.03%) + + + +$lambda (143 samples, 0.42%) + + + +alloc_blob (16 samples, 0.05%) + + + +$lambda (17 samples, 0.05%) + + + +$lambda (17 samples, 0.05%) + + + +canister_init (300 samples, 0.87%) + + + +list (79 samples, 0.23%) + + + +retrieve (4 samples, 0.01%) + + + +init (13 samples, 0.04%) + + + +__set_hp (72 samples, 0.21%) + + + +alloc_size<15>_tag<1> (26 samples, 0.08%) + + + +$lambda (66 samples, 0.19%) + + + +$lambda (17 samples, 0.05%) + + + +store (17 samples, 0.05%) + + + +store (64 samples, 0.19%) + + + +canister_init (11 samples, 0.03%) + + + +link_start (16 samples, 0.05%) + + + +toArray (72 samples, 0.21%) + + + +iterate (11 samples, 0.03%) + + + +$lambda (126 samples, 0.37%) + + + +list (18 samples, 0.05%) + + + +$lambda (125 samples, 0.36%) + + + +store (7,393 samples, 21.49%) +store + + +canister_init (179 samples, 0.52%) + + + +store (4 samples, 0.01%) + + + +toArray (143 samples, 0.42%) + + + +$lambda (8 samples, 0.02%) + + + +$lambda (7 samples, 0.02%) + + + +$lambda (17 samples, 0.05%) + + + +text_to_buf (28 samples, 0.08%) + + + +link_start (14 samples, 0.04%) + + + +iter (26 samples, 0.08%) + + + +list (4 samples, 0.01%) + + + +store (60 samples, 0.17%) + + + +entries (26 samples, 0.08%) + + + +$lambda (118 samples, 0.34%) + + + +retrieve (13 samples, 0.04%) + + + +retrieve (47 samples, 0.14%) + + + +Array.idx_bigint (24 samples, 0.07%) + + + +iter (26 samples, 0.08%) + + + +@deserialize<tB> (90 samples, 0.26%) + + + +iterate (18 samples, 0.05%) + + + +entries (16 samples, 0.05%) + + + +$lambda (28 samples, 0.08%) + + + +alloc_size<6>_tag<5> (26 samples, 0.08%) + + + +list (73 samples, 0.21%) + + + +put (13 samples, 0.04%) + + + +@buffer_size<u> (14 samples, 0.04%) + + + +memcmp (369 samples, 1.07%) + + + +Buffer (26 samples, 0.08%) + + + +RBTree (13 samples, 0.04%) + + + +next (51 samples, 0.15%) + + + +@serialize_go<u> (4 samples, 0.01%) + + + +compacting_gc (1,356 samples, 3.94%) +comp.. + + +@deserialize<tB> (162 samples, 0.47%) + + + +@deserialize<tB> (10 samples, 0.03%) + + + +toArray (10 samples, 0.03%) + + + +compute_crc32 (33 samples, 0.10%) + + + +$lambda (13 samples, 0.04%) + + + +next (72 samples, 0.21%) + + + +toArray (89 samples, 0.26%) + + + +store (5 samples, 0.01%) + + + +toArray (4 samples, 0.01%) + + + +alloc_size<5>_tag<11> (312 samples, 0.91%) + + + +alloc_size<2>_tag<9> (143 samples, 0.42%) + + + +B_eq (10 samples, 0.03%) + + + +$lambda (51 samples, 0.15%) + + + +$lambda (13 samples, 0.04%) + + + +store (405 samples, 1.18%) + + + +$lambda (26 samples, 0.08%) + + + +parse_idl_header (4 samples, 0.01%) + + + +toArray (104 samples, 0.30%) + + + +retrieve (17 samples, 0.05%) + + + +list (18 samples, 0.05%) + + + +list (26 samples, 0.08%) + + + +insertRoot (28 samples, 0.08%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,856 samples, 5.40%) +motoko.. + + +list (27 samples, 0.08%) + + + +Text.compare_lt (5 samples, 0.01%) + + + +from_2_tuple (6 samples, 0.02%) + + + +init (18 samples, 0.05%) + + + +insertRoot (13 samples, 0.04%) + + + +text_size (8 samples, 0.02%) + + + +@serialize<vt> (27 samples, 0.08%) + + + +trans_state7 (39 samples, 0.11%) + + + +$lambda (26 samples, 0.08%) + + + +motoko_rts::text::text_compare_range::h07711f4d5d67a04f (56 samples, 0.16%) + + + +$lambda (61 samples, 0.18%) + + + +list (18 samples, 0.05%) + + + +map (26 samples, 0.08%) + + + +next (90 samples, 0.26%) + + + +anon-func-31.67 (6 samples, 0.02%) + + + +$lambda (27 samples, 0.08%) + + + +list (11 samples, 0.03%) + + + +iterate (18 samples, 0.05%) + + + +insertRoot (11 samples, 0.03%) + + + +iterate (10 samples, 0.03%) + + + +$lambda (12 samples, 0.03%) + + + +parse_idl_header (8 samples, 0.02%) + + + +@serialize<> (66 samples, 0.19%) + + + +iterate (132 samples, 0.38%) + + + +retrieve (64 samples, 0.19%) + + + +list (44 samples, 0.13%) + + + +@deserialize<tB> (209 samples, 0.61%) + + + +$lambda (89 samples, 0.26%) + + + +alloc_array (6 samples, 0.02%) + + + +$lambda (4 samples, 0.01%) + + + +entries (26 samples, 0.08%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (4 samples, 0.01%) + + + +entries (26 samples, 0.08%) + + + +@reset_cycles (16 samples, 0.05%) + + + +anon-func-31.67 (6 samples, 0.02%) + + + +@serialize<> (4 samples, 0.01%) + + + +next (6 samples, 0.02%) + + + +list (132 samples, 0.38%) + + + +compacting_gc (725 samples, 2.11%) +c.. + + +get (41 samples, 0.12%) + + + +compacting_gc (4 samples, 0.01%) + + + +@deserialize<tB> (405 samples, 1.18%) + + + +init (4 samples, 0.01%) + + + +$lambda (481 samples, 1.40%) + + + +$lambda (104 samples, 0.30%) + + + +$lambda (73 samples, 0.21%) + + + +list (8 samples, 0.02%) + + + +@serialize<vt> (28 samples, 0.08%) + + + +compare (5 samples, 0.01%) + + + +Text.compare_eq (114 samples, 0.33%) + + + +toArray (522 samples, 1.52%) + + + +obj_idx<11> (34 samples, 0.10%) + + + +retrieve (33 samples, 0.10%) + + + +store (102 samples, 0.30%) + + + +$lambda (24 samples, 0.07%) + + + +$lambda (94 samples, 0.27%) + + + +store (13 samples, 0.04%) + + + +link_start (4 samples, 0.01%) + + + +list (12 samples, 0.03%) + + + +get (114 samples, 0.33%) + + + +$lambda (56 samples, 0.16%) + + + +retrieve (33 samples, 0.10%) + + + +retrieve (162 samples, 0.47%) + + + +anon-func-165.17 (11 samples, 0.03%) + + + +$lambda (121 samples, 0.35%) + + + +list (182 samples, 0.53%) + + + +$lambda (132 samples, 0.38%) + + + +$lambda (4 samples, 0.01%) + + + +list (128 samples, 0.37%) + + + +retrieve (9 samples, 0.03%) + + + +@serialize<vt> (132 samples, 0.38%) + + + +$lambda (18 samples, 0.05%) + + + +insertRoot (61 samples, 0.18%) + + + +alloc_size<4>_tag<1> (78 samples, 0.23%) + + + +toArray (89 samples, 0.26%) + + + +retrieve (63 samples, 0.18%) + + + +alloc_size<2>_tag<5> (26 samples, 0.08%) + + + +text_of_ptr_size (150 samples, 0.44%) + + + +list (10 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (66 samples, 0.19%) + + + +store (90 samples, 0.26%) + + + +@deserialize<> (128 samples, 0.37%) + + + +list (17 samples, 0.05%) + + + +$lambda (60 samples, 0.17%) + + + +retrieve (4 samples, 0.01%) + + + +Text.compare_lt (114 samples, 0.33%) + + + +insertRoot (13 samples, 0.04%) + + + +anon-func-116.7 (7 samples, 0.02%) + + + +iter (94 samples, 0.27%) + + + +@deserialize_go<t> (371 samples, 1.08%) + + + +retrieve (3 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (12,835 samples, 37.32%) +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 + + +Blob.compare_eq (47 samples, 0.14%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (132 samples, 0.38%) + + + +add (126 samples, 0.37%) + + + +@deserialize_go<B> (162 samples, 0.47%) + + + +$lambda (4 samples, 0.01%) + + + +@serialize_go<t> (27 samples, 0.08%) + + + +@deserialize<t> (3 samples, 0.01%) + + + +$lambda (59 samples, 0.17%) + + + +add (79 samples, 0.23%) + + + +@deserialize<t> (33 samples, 0.10%) + + + +toArray (84 samples, 0.24%) + + + +$lambda (72 samples, 0.21%) + + + +canister_init (104 samples, 0.30%) + + + +init (179 samples, 0.52%) + + + +@deserialize_go<t> (26 samples, 0.08%) + + + +init (13 samples, 0.04%) + + + +Text.compare_lt (41 samples, 0.12%) + + + +sleb128_decode (891 samples, 2.59%) +sl.. + + +$lambda (26 samples, 0.08%) + + + +store (6 samples, 0.02%) + + + +list (44 samples, 0.13%) + + + +list (6 samples, 0.02%) + + + +@deserialize_go<t> (74 samples, 0.22%) + + + +anon-func-165.17 (10 samples, 0.03%) + + + +retrieve (41 samples, 0.12%) + + + +compare (114 samples, 0.33%) + + + +@deserialize<t> (9 samples, 0.03%) + + + +$lambda (14 samples, 0.04%) + + + +retrieve (64 samples, 0.19%) + + + +next (143 samples, 0.42%) + + + +alloc_size<11>_tag<1> (13 samples, 0.04%) + + + +compacting_gc (4 samples, 0.01%) + + + +Array_tabulate (12 samples, 0.03%) + + + +retrieve (12 samples, 0.03%) + + + +toArray (39 samples, 0.11%) + + + +list (12 samples, 0.03%) + + + +store (13 samples, 0.04%) + + + +alloc_blob (528 samples, 1.54%) + + + +@deserialize<t> (3 samples, 0.01%) + + + +toArray (132 samples, 0.38%) + + + +store (763 samples, 2.22%) +s.. + + +@deserialize<> (214 samples, 0.62%) + + + +list (22 samples, 0.06%) + + + +toArray (18 samples, 0.05%) + + + +canister_init (4 samples, 0.01%) + + + +store (4 samples, 0.01%) + + + +init (66 samples, 0.19%) + + + +put (61 samples, 0.18%) + + + +store (17 samples, 0.05%) + + + +$lambda (66 samples, 0.19%) + + + +link_start (4 samples, 0.01%) + + + +reply_with_data (16 samples, 0.05%) + + + +toArray (7 samples, 0.02%) + + + +store (17 samples, 0.05%) + + + +list (96 samples, 0.28%) + + + +$lambda (11 samples, 0.03%) + + + +store (4 samples, 0.01%) + + + +B_add (34 samples, 0.10%) + + + +store (17 samples, 0.05%) + + + +Buffer (26 samples, 0.08%) + + + +$lambda (41 samples, 0.12%) + + + +$lambda (8 samples, 0.02%) + + + +@serialize<vt> (126 samples, 0.37%) + + + +blob_of_principal (4 samples, 0.01%) + + + +store (13 samples, 0.04%) + + + +$lambda (28 samples, 0.08%) + + + +put (28 samples, 0.08%) + + + +$lambda (6 samples, 0.02%) + + + +$lambda (34 samples, 0.10%) + + + +get (5 samples, 0.01%) + + + +canister_init (5,442 samples, 15.82%) +canister_init + + +add (17 samples, 0.05%) + + + +$lambda (44 samples, 0.13%) + + + +put (13 samples, 0.04%) + + + +@serialize<vt> (7 samples, 0.02%) + + + +Array_tabulate (11 samples, 0.03%) + + + +init (66 samples, 0.19%) + + + +@deserialize<> (30 samples, 0.09%) + + + +store (47 samples, 0.14%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (1,856 samples, 5.40%) +motoko.. + + +alloc_size<6>_tag<11> (26 samples, 0.08%) + + + +init (13 samples, 0.04%) + + + +@serialize<> (4 samples, 0.01%) + + + +set_local %i0 (9 samples, 0.03%) + + + +$lambda (33 samples, 0.10%) + + + +canister_init (20 samples, 0.06%) + + + +retrieve (10 samples, 0.03%) + + + +list (26 samples, 0.08%) + + + +toArray (26 samples, 0.08%) + + + +insertRoot (18 samples, 0.05%) + + + +$lambda (33 samples, 0.10%) + + + +text_compare (82 samples, 0.24%) + + + +link_start (665 samples, 1.93%) +l.. + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (4 samples, 0.01%) + + + +$lambda (51 samples, 0.15%) + + + +list (51 samples, 0.15%) + + + +compacting_gc (1,856 samples, 5.40%) +compac.. + + +getRec (95 samples, 0.28%) + + + +anon-func-116.7 (12 samples, 0.03%) + + + +insertRec (18 samples, 0.05%) + + + +iterate (39 samples, 0.11%) + + + +$lambda (17 samples, 0.05%) + + + +$lambda (95 samples, 0.28%) + + + +set_local %i2 (9 samples, 0.03%) + + + +$lambda (33 samples, 0.10%) + + + +@serialize<vt> (4 samples, 0.01%) + + + +@serialize_go<vt> (24 samples, 0.07%) + + + +@deserialize<t> (162 samples, 0.47%) + + + +$lambda (28 samples, 0.08%) + + + +store (4 samples, 0.01%) + + + +get (4 samples, 0.01%) + + + +list (10 samples, 0.03%) + + + +parse_idl_header (486 samples, 1.41%) + + + +get (28 samples, 0.08%) + + + +list (7 samples, 0.02%) + + + +list (104 samples, 0.30%) + + + +B_add (16 samples, 0.05%) + + + +trans_state4 (56 samples, 0.16%) + + + +insertRec (13 samples, 0.04%) + + + +$lambda (26 samples, 0.08%) + + + +insertRec (17 samples, 0.05%) + + + +parse_idl_header (641 samples, 1.86%) +p.. + + +$lambda (28 samples, 0.08%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (8 samples, 0.02%) + + + +toArray (34 samples, 0.10%) + + + +list (162 samples, 0.47%) + + + +@serialize<B> (63 samples, 0.18%) + + + +list (18 samples, 0.05%) + + + +entries (22 samples, 0.06%) + + + +init (20 samples, 0.06%) + + + +store (4 samples, 0.01%) + + + +list (89 samples, 0.26%) + + + +$lambda (66 samples, 0.19%) + + + +Array_tabulate (4 samples, 0.01%) + + + +get (9 samples, 0.03%) + + + +next (39 samples, 0.11%) + + + +anon-func-165.17 (126 samples, 0.37%) + + + +Buffer (522 samples, 1.52%) + + + +canister_init (550 samples, 1.60%) + + + +list (26 samples, 0.08%) + + + +obj_idx<6> (34 samples, 0.10%) + + + +$lambda (30 samples, 0.09%) + + + +text_to_buf (60 samples, 0.17%) + + + +list (4 samples, 0.01%) + + + +iterate (17 samples, 0.05%) + + + +compacting_gc (8 samples, 0.02%) + + + +init (33 samples, 0.10%) + + + +$lambda (26 samples, 0.08%) + + + +store (33 samples, 0.10%) + + + +@deserialize<tB> (37 samples, 0.11%) + + + +@serialize<vt> (4 samples, 0.01%) + + + +insertRoot (11 samples, 0.03%) + + + +@serialize<B> (66 samples, 0.19%) + + + +@deserialize<tB> (9 samples, 0.03%) + + + +list (26 samples, 0.08%) + + + +$lambda (4 samples, 0.01%) + + + +store (4 samples, 0.01%) + + + +blob_of_principal (372 samples, 1.08%) + + + +list (4 samples, 0.01%) + + + +store (162 samples, 0.47%) + + + +blob_of_principal (815 samples, 2.37%) +b.. + + +retrieve (28 samples, 0.08%) + + + +toArray (6 samples, 0.02%) + + + +getRec (41 samples, 0.12%) + + + +compare (95 samples, 0.28%) + + + +next (39 samples, 0.11%) + + + +list (36 samples, 0.10%) + + + +@buffer_size<vt> (96 samples, 0.28%) + + + +toArray (51 samples, 0.15%) + + + +retrieve (4 samples, 0.01%) + + + +@serialize_go<t> (4 samples, 0.01%) + + + +iterate (8 samples, 0.02%) + + + +@serialize<vt> (96 samples, 0.28%) + + + +retrieve (37 samples, 0.11%) + + + +$lambda (63 samples, 0.18%) + + + +@deserialize<> (18 samples, 0.05%) + + + +list (7 samples, 0.02%) + + + +@deserialize<t> (81 samples, 0.24%) + + + +toArray (84 samples, 0.24%) + + + +list (26 samples, 0.08%) + + + +to_2_tuple (165 samples, 0.48%) + + + +getRec (4 samples, 0.01%) + + + +canister_init (66 samples, 0.19%) + + + +retrieve (78 samples, 0.23%) + + + +store (15 samples, 0.04%) + + + +$lambda (7 samples, 0.02%) + + + +list (10 samples, 0.03%) + + + +$lambda (13 samples, 0.04%) + + + +put (13 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,285 samples, 3.74%) +moto.. + + +list (34 samples, 0.10%) + + + +text_of_ptr_size (4 samples, 0.01%) + + + +$lambda (22 samples, 0.06%) + + + +@deserialize<tB> (64 samples, 0.19%) + + + +Array_tabulate (84 samples, 0.24%) + + + +rts_start (14 samples, 0.04%) + + + +text_of_ptr_size (66 samples, 0.19%) + + + +compare (41 samples, 0.12%) + + + +$lambda (4 samples, 0.01%) + + + +canister_init (768 samples, 2.23%) +c.. + + +blob_of_principal (179 samples, 0.52%) + + + +@deserialize<tB> (64 samples, 0.19%) + + + +set_local %i1 (9 samples, 0.03%) + + + +iterate (17 samples, 0.05%) + + + +toArray (18 samples, 0.05%) + + + +@serialize_go<B> (30 samples, 0.09%) + + + +Array.idx_bigint (22 samples, 0.06%) + + + +init (10 samples, 0.03%) + + + +$lambda (11 samples, 0.03%) + + + +$lambda (24 samples, 0.07%) + + + +$lambda (4 samples, 0.01%) + + + +store (378 samples, 1.10%) + + + +anon-func-165.17 (12 samples, 0.03%) + + + +list (8 samples, 0.02%) + + + +@serialize<vt> (7 samples, 0.02%) + + + +put (21 samples, 0.06%) + + + +list (118 samples, 0.34%) + + + +$lambda (9 samples, 0.03%) + + + +obj_idx<0> (170 samples, 0.49%) + + + +@deserialize_go<B> (64 samples, 0.19%) + + + +@deserialize_go<t> (128 samples, 0.37%) + + + +blob_of_principal (66 samples, 0.19%) + + + +store (128 samples, 0.37%) + + + +store (23 samples, 0.07%) + + + +insertRoot (13 samples, 0.04%) + + + +@deserialize<tB> (261 samples, 0.76%) + + + +$lambda (18 samples, 0.05%) + + + +toArray (10 samples, 0.03%) + + + +$lambda (96 samples, 0.28%) + + + +@serialize<vt> (24 samples, 0.07%) + + + +$lambda (12 samples, 0.03%) + + + +$lambda (162 samples, 0.47%) + + + +canister_init (372 samples, 1.08%) + + + +$lambda (27 samples, 0.08%) + + + +toArray (17 samples, 0.05%) + + + +store (209 samples, 0.61%) + + + +compare (28 samples, 0.08%) + + + +@serialize<B> (59 samples, 0.17%) + + + +add (42 samples, 0.12%) + + + +opt_inject (162 samples, 0.47%) + + + +compare (95 samples, 0.28%) + + + +$lambda (4 samples, 0.01%) + + + +store (13 samples, 0.04%) + + + +retrieve (18 samples, 0.05%) + + + +list (121 samples, 0.35%) + + + +iterate (51 samples, 0.15%) + + + +canister_init (4 samples, 0.01%) + + + +alloc_array (126 samples, 0.37%) + + + +store (104 samples, 0.30%) + + + +__wasm_apply_data_relocs (665 samples, 1.93%) +_.. + + +opt_project (216 samples, 0.63%) + + + +@serialize_go<vt> (4 samples, 0.01%) + + + +get_heap_base (3 samples, 0.01%) + + + +@buffer_size<vt> (4 samples, 0.01%) + + + +iterate (42 samples, 0.12%) + + + +retrieve (114 samples, 0.33%) + + + +retrieve (81 samples, 0.24%) + + + +can_tag_i64 (16 samples, 0.05%) + + + +$lambda (4 samples, 0.01%) + + + +toArray (11 samples, 0.03%) + + + +iterate (72 samples, 0.21%) + + + +list (126 samples, 0.37%) + + + +retrieve (114 samples, 0.33%) + + + +$lambda (20 samples, 0.06%) + + + +toArray (10 samples, 0.03%) + + + +toArray (79 samples, 0.23%) + + + +store (13 samples, 0.04%) + + + +retrieve (128 samples, 0.37%) + + + +@serialize_go<t> (12 samples, 0.03%) + + + +canister_init (17 samples, 0.05%) + + + +@serialize<B> (12 samples, 0.03%) + + + +add (11 samples, 0.03%) + + + +list (26 samples, 0.08%) + + + +$lambda (13 samples, 0.04%) + + + +iterate (143 samples, 0.42%) + + + +toArray (4 samples, 0.01%) + + + +iterate (51 samples, 0.15%) + + + +list (11 samples, 0.03%) + + + +B_ge (10 samples, 0.03%) + + + +retrieve (13 samples, 0.04%) + + + +toArray (4 samples, 0.01%) + + + +blob_of_principal (66 samples, 0.19%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (60 samples, 0.17%) + + + +canister_init (166 samples, 0.48%) + + + +alloc_array (6 samples, 0.02%) + + + +@serialize_go<vt> (60 samples, 0.17%) + + + +put (13 samples, 0.04%) + + + +retrieve (5 samples, 0.01%) + + + +compacting_gc (1,351 samples, 3.93%) +comp.. + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (1,351 samples, 3.93%) +moto.. + + +$lambda (17 samples, 0.05%) + + + +@deserialize<> (66 samples, 0.19%) + + + +$lambda (7 samples, 0.02%) + + + +@deserialize_go<B> (78 samples, 0.23%) + + + +@deserialize<tB> (33 samples, 0.10%) + + + +@deserialize<tB> (4 samples, 0.01%) + + + +@serialize<vt> (118 samples, 0.34%) + + + +Text.compare_lt (95 samples, 0.28%) + + + +retrieve (28 samples, 0.08%) + + + +init (33 samples, 0.10%) + + + +$lambda (8 samples, 0.02%) + + + +Array_tabulate (4 samples, 0.01%) + + + +$lambda (95 samples, 0.28%) + + + +canister_init (33 samples, 0.10%) + + + +iterate (10 samples, 0.03%) + + + +next (481 samples, 1.40%) + + + +$lambda (8 samples, 0.02%) + + + +compare (114 samples, 0.33%) + + + +@deserialize_go<t> (66 samples, 0.19%) + + + +motoko_rts::text::blob_of_text::h030f22e37f65782b (20 samples, 0.06%) + + + +iterate (481 samples, 1.40%) + + + +$lambda (11 samples, 0.03%) + + + +$lambda (63 samples, 0.18%) + + + +anon-func-165.17 (17 samples, 0.05%) + + + +anon-func-165.17 (17 samples, 0.05%) + + + +@deserialize<tB> (6 samples, 0.02%) + + + +canister_init (18 samples, 0.05%) + + + +$lambda (66 samples, 0.19%) + + + +list (132 samples, 0.38%) + + + +Array.unsafe_idx (14 samples, 0.04%) + + + +@serialize<> (14 samples, 0.04%) + + + +$lambda (4 samples, 0.01%) + + + +store (6 samples, 0.02%) + + + +$lambda (10 samples, 0.03%) + + + +entries (26 samples, 0.08%) + + + +store (37 samples, 0.11%) + + + +$lambda (12 samples, 0.03%) + + + +text_compare (190 samples, 0.55%) + + + +toArray (52 samples, 0.15%) + + + +retrieve (4 samples, 0.01%) + + + +list (42 samples, 0.12%) + + + +compare (9 samples, 0.03%) + + + +toArray (8 samples, 0.02%) + + + +$lambda (4 samples, 0.01%) + + + +@deserialize<t> (10 samples, 0.03%) + + + +retrieve (9 samples, 0.03%) + + + +alloc_size<3>_tag<1> (13 samples, 0.04%) + + + +toArray (12 samples, 0.03%) + + + +@buffer_size<t> (33 samples, 0.10%) + + + +add (8 samples, 0.02%) + + + +insertRec (13 samples, 0.04%) + + + +@serialize<B> (60 samples, 0.17%) + + + +$lambda (63 samples, 0.18%) + + + +alloc_size<4>_tag<11> (208 samples, 0.60%) + + + +@deserialize_go<t> (150 samples, 0.44%) + + + +$lambda (26 samples, 0.08%) + + + +toArray (51 samples, 0.15%) + + + +retrieve (4 samples, 0.01%) + + + +$lambda (8 samples, 0.02%) + + + +list (52 samples, 0.15%) + + + +$lambda (18 samples, 0.05%) + + + +@deserialize<tB> (33 samples, 0.10%) + + + +store (18 samples, 0.05%) + + + +alloc_size<4>_tag<5> (195 samples, 0.57%) + + + +$lambda (26 samples, 0.08%) + + + +blob_of_principal (472 samples, 1.37%) + + + +@deserialize<t> (4 samples, 0.01%) + + + +@serialize<vt> (12 samples, 0.03%) + + + +store (735 samples, 2.14%) +s.. + + +canister_self (33 samples, 0.10%) + + + +store (261 samples, 0.76%) + + + +core::str::converts::from_utf8::hbc4c752be9502b18 (371 samples, 1.08%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,356 samples, 3.94%) +moto.. + + +iterate (18 samples, 0.05%) + + + +$lambda (16 samples, 0.05%) + + + +RBTree (166 samples, 0.48%) + + + +idl_sub_buf_init (16 samples, 0.05%) + + + +retrieve (95 samples, 0.28%) + + + +$lambda (72 samples, 0.21%) + + + +toArray (126 samples, 0.37%) + + + +toArray (17 samples, 0.05%) + + + +alloc_blob (32 samples, 0.09%) + + + +Buffer (182 samples, 0.53%) + + + +store (66 samples, 0.19%) + + + +list (4 samples, 0.01%) + + + +@serialize<vt> (60 samples, 0.17%) + + + +$lambda (96 samples, 0.28%) + + + +anon-func-165.17 (10 samples, 0.03%) + + + +$lambda (13 samples, 0.04%) + + + +toArray (17 samples, 0.05%) + + + +list (7 samples, 0.02%) + + + +get (114 samples, 0.33%) + + + +list (66 samples, 0.19%) + + + +$lambda (7 samples, 0.02%) + + + +@deserialize<t> (15 samples, 0.04%) + + + +list (33 samples, 0.10%) + + + +to_2_tuple (195 samples, 0.57%) + + + +$lambda (4 samples, 0.01%) + + + +text_compare (56 samples, 0.16%) + + + +list (481 samples, 1.40%) + + + +next (6 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (725 samples, 2.11%) +m.. + + +list (34 samples, 0.10%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (472 samples, 1.37%) + + + +store (10 samples, 0.03%) + + + +obj_idx<1> (17 samples, 0.05%) + + + +retrieve (33 samples, 0.10%) + + + +iter (26 samples, 0.08%) + + + +canister_init (13 samples, 0.04%) + + + +compacting_gc (8 samples, 0.02%) + + + +retrieve (23 samples, 0.07%) + + + +store (4 samples, 0.01%) + + + +store (4 samples, 0.01%) + + + +$lambda (132 samples, 0.38%) + + + +toArray (42 samples, 0.12%) + + + +iterate (162 samples, 0.47%) + + + +rts_start (4 samples, 0.01%) + + + +getRec (114 samples, 0.33%) + + + +toArray (4 samples, 0.01%) + + + +@deserialize_go<B> (33 samples, 0.10%) + + + +retrieve (41 samples, 0.12%) + + + +store (425 samples, 1.24%) + + + +store (1,088 samples, 3.16%) +store + + +$lambda (52 samples, 0.15%) + + + +store (13 samples, 0.04%) + + + +toArray (26 samples, 0.08%) + + + +$lambda (28 samples, 0.08%) + + + +$lambda (26 samples, 0.08%) + + + +parse_idl_header (132 samples, 0.38%) + + + +get (41 samples, 0.12%) + + + +iter (22 samples, 0.06%) + + + +canister_init (65 samples, 0.19%) + + + +list (17 samples, 0.05%) + + + +toArray (11 samples, 0.03%) + + + +list (66 samples, 0.19%) + + + +init (17 samples, 0.05%) + + + +Buffer (26 samples, 0.08%) + + + +@deserialize<t> (81 samples, 0.24%) + + + +$lambda (26 samples, 0.08%) + + + +@deserialize<tB> (64 samples, 0.19%) + + + +insertRec (13 samples, 0.04%) + + + +$lambda (34 samples, 0.10%) + + + +toArray (481 samples, 1.40%) + + + +idl_sub_buf_init (60 samples, 0.17%) + + + +$lambda (8 samples, 0.02%) + + + +@deserialize<t> (126 samples, 0.37%) + + + +iterate (79 samples, 0.23%) + + + +iter (26 samples, 0.08%) + + + +canister_init (48 samples, 0.14%) + + + +store (53 samples, 0.15%) + + + +store (66 samples, 0.19%) + + + +motoko_rts::text::text_compare_range::h07711f4d5d67a04f (228 samples, 0.66%) + + + +list (42 samples, 0.12%) + + + +map (56 samples, 0.16%) + + + +getRec (41 samples, 0.12%) + + + +@deserialize<t> (13 samples, 0.04%) + + + +iterate (125 samples, 0.36%) + + + +$lambda (12 samples, 0.03%) + + + +canister_init (978 samples, 2.84%) +ca.. + + +$lambda (60 samples, 0.17%) + + + +@serialize<B> (4 samples, 0.01%) + + + +motoko_rts::text::text_compare_range::h07711f4d5d67a04f (190 samples, 0.55%) + + + +insertRoot (13 samples, 0.04%) + + + +@deserialize<tB> (6 samples, 0.02%) + + + +@deserialize<tB> (6 samples, 0.02%) + + + +init (48 samples, 0.14%) + + + +list (522 samples, 1.52%) + + + +canister_init (33 samples, 0.10%) + + + +retrieve (13 samples, 0.04%) + + + +store (301 samples, 0.88%) + + + +@deserialize<tB> (162 samples, 0.47%) + + + +list (26 samples, 0.08%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (126 samples, 0.37%) + + + +@serialize<vt> (4 samples, 0.01%) + + + +$lambda (16 samples, 0.05%) + + + +list (8 samples, 0.02%) + + + +store (21 samples, 0.06%) + + + +$lambda (42 samples, 0.12%) + + + +RBTree (39 samples, 0.11%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (725 samples, 2.11%) +m.. + + +utf8_validate (46 samples, 0.13%) + + + +@deserialize<t> (64 samples, 0.19%) + + + +list (26 samples, 0.08%) + + + +anon-func-165.17 (11 samples, 0.03%) + + + +@deserialize<t> (204 samples, 0.59%) + + + +getRec (78 samples, 0.23%) + + + +$lambda (33 samples, 0.10%) + + + +canister_self (10 samples, 0.03%) + + + +@serialize<B> (4 samples, 0.01%) + + + +store (11 samples, 0.03%) + + + +canister_init (4 samples, 0.01%) + + + +store (78 samples, 0.23%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (725 samples, 2.11%) +m.. + + +retrieve (30 samples, 0.09%) + + + +@serialize<vt> (73 samples, 0.21%) + + + +list (72 samples, 0.21%) + + + +$lambda (30 samples, 0.09%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (4 samples, 0.01%) + + + +@serialize_go<t> (60 samples, 0.17%) + + + +@serialize<> (63 samples, 0.18%) + + + +anon-func-116.7 (11 samples, 0.03%) + + + +@deserialize<tB> (128 samples, 0.37%) + + + +list (60 samples, 0.17%) + + + +$lambda (4 samples, 0.01%) + + + +iter (26 samples, 0.08%) + + + +@serialize<B> (33 samples, 0.10%) + + + +toArray (121 samples, 0.35%) + + + +@serialize<> (72 samples, 0.21%) + + + +toArray (100 samples, 0.29%) + + + +$lambda (4 samples, 0.01%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (66 samples, 0.19%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (1,285 samples, 3.74%) +moto.. + + +Text.compare_eq (95 samples, 0.28%) + + + +Array_init (42 samples, 0.12%) + + + +next (613 samples, 1.78%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (990 samples, 2.88%) +mo.. + + +store (63 samples, 0.18%) + + + +add (10 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (33 samples, 0.10%) + + + +init (472 samples, 1.37%) + + + +$lambda (63 samples, 0.18%) + + + +compacting_gc (132 samples, 0.38%) + + + +@deserialize<tB> (301 samples, 0.88%) + + + +canister_init (815 samples, 2.37%) +c.. + + +list (26 samples, 0.08%) + + + +init (815 samples, 2.37%) +i.. + + +toArray (6 samples, 0.02%) + + + +canister_init (28 samples, 0.08%) + + + +@buffer_size<B> (33 samples, 0.10%) + + + +anon-func-165.17 (8 samples, 0.02%) + + + +blob_of_principal (48 samples, 0.14%) + + + +@buffer_size<vt> (7 samples, 0.02%) + + + +Array_tabulate (7 samples, 0.02%) + + + +compare (4 samples, 0.01%) + + + +compare (41 samples, 0.12%) + + + +$lambda (16 samples, 0.05%) + + + +retrieve (95 samples, 0.28%) + + + +blob_of_principal (33 samples, 0.10%) + + + +add (12 samples, 0.03%) + + + +text_of_ptr_size (20 samples, 0.06%) + + + +canister_init (10 samples, 0.03%) + + + +get (28 samples, 0.08%) + + + +compacting_gc (12,835 samples, 37.32%) +compacting_gc + + +blob_of_principal (20 samples, 0.06%) + + + +Text.compare_eq (4 samples, 0.01%) + + + +@deserialize<> (256 samples, 0.74%) + + + +map (26 samples, 0.08%) + + + +retrieve (15 samples, 0.04%) + + + +$lambda (47 samples, 0.14%) + + + +all (34,395 samples, 100%) + + + +$lambda (211 samples, 0.61%) + + + +iterate (6 samples, 0.02%) + + + +$lambda (39 samples, 0.11%) + + + +$lambda (4 samples, 0.01%) + + + +store (33 samples, 0.10%) + + + +list (126 samples, 0.37%) + + + +memset (224 samples, 0.65%) + + + +@serialize<> (4 samples, 0.01%) + + + +@serialize_go<vt> (12 samples, 0.03%) + + + +insertRoot (17 samples, 0.05%) + + + +get (95 samples, 0.28%) + + + +list (11 samples, 0.03%) + + + +iterate (12 samples, 0.03%) + + + +$lambda (78 samples, 0.23%) + + + +toArray (52 samples, 0.15%) + + + +$lambda (114 samples, 0.33%) + + + +store (13 samples, 0.04%) + + + +initialize_compacting_gc (14 samples, 0.04%) + + + +compare (28 samples, 0.08%) + + + +store (9 samples, 0.03%) + + + +$lambda (52 samples, 0.15%) + + + +toArray (8 samples, 0.02%) + + + +list (26 samples, 0.08%) + + + +@deserialize<t> (23 samples, 0.07%) + + + +list (8 samples, 0.02%) + + + +@serialize<vt> (33 samples, 0.10%) + + + +list (12 samples, 0.03%) + + + +@deserialize<tB> (23 samples, 0.07%) + + + + diff --git a/flamegraphs/assetstorage.svg b/flamegraphs/assetstorage.svg new file mode 100644 index 00000000000..4818448bcaf --- /dev/null +++ b/flamegraphs/assetstorage.svg @@ -0,0 +1,1469 @@ + + + + + + + + + + + + + + +assetstorage.mo + +Reset Zoom +Search + + + +alloc_blob (38 samples, 0.11%) + + + +leb128_decode (128 samples, 0.37%) + + + +$lambda (789 samples, 2.29%) +$.. + + +__set_hp (8 samples, 0.02%) + + + +set_local %i2 (3 samples, 0.01%) + + + +parse_idl_header (870 samples, 2.53%) +pa.. + + +@reset_refund (4 samples, 0.01%) + + + +__set_hp (4 samples, 0.01%) + + + +@buffer_size<u> (14 samples, 0.04%) + + + +link_start (707 samples, 2.06%) +l.. + + +alloc_array (47 samples, 0.14%) + + + +motoko_rts::text::text_get_range::hd4249e7b4d3fea44 (28 samples, 0.08%) + + + +set_local %i0 (3 samples, 0.01%) + + + +alloc_size<6>_tag<5> (13 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (735 samples, 2.14%) +m.. + + +alloc_size<3>_tag<1> (13 samples, 0.04%) + + + +alloc_size<4>_tag<1> (13 samples, 0.04%) + + + +sleb128_decode (162 samples, 0.47%) + + + +anon-func-165.17 (358 samples, 1.04%) + + + +alloc_blob (152 samples, 0.44%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +sleb128_decode (81 samples, 0.24%) + + + +alloc_array (94 samples, 0.27%) + + + +alloc_size<5>_tag<11> (26 samples, 0.08%) + + + +alloc_size<2>_tag<9> (26 samples, 0.08%) + + + +trans_state6 (26 samples, 0.08%) + + + +@reset_cycles (4 samples, 0.01%) + + + +obj_idx<0> (17 samples, 0.05%) + + + +leb128_decode (64 samples, 0.19%) + + + +alloc_size<3>_tag<15> (26 samples, 0.08%) + + + +alloc_size<4>_tag<1> (26 samples, 0.08%) + + + +initialize_compacting_gc (17 samples, 0.05%) + + + +to_2_tuple (48 samples, 0.14%) + + + +all (34,395 samples, 100%) + + + +alloc_size<4>_tag<11> (104 samples, 0.30%) + + + +leb128_decode (64 samples, 0.19%) + + + +compacting_gc (8,811 samples, 25.62%) +compacting_gc + + +$lambda (342 samples, 0.99%) + + + +Array.idx_bigint (23 samples, 0.07%) + + + +$lambda (1,088 samples, 3.16%) +$la.. + + +memcpy (60 samples, 0.17%) + + + +leb128_decode (128 samples, 0.37%) + + + +iter (282 samples, 0.82%) + + + +compute_crc32 (33 samples, 0.10%) + + + +memcmp (95 samples, 0.28%) + + + +__set_hp (4 samples, 0.01%) + + + +memset (104 samples, 0.30%) + + + +alloc_size<4>_tag<1> (13 samples, 0.04%) + + + +sleb128_decode (81 samples, 0.24%) + + + +text_size (4 samples, 0.01%) + + + +@serialize<> (229 samples, 0.67%) + + + +leb128_decode (64 samples, 0.19%) + + + +@reset_cycles (8 samples, 0.02%) + + + +leb128_decode (64 samples, 0.19%) + + + +utf8_validate (232 samples, 0.67%) + + + +put (262 samples, 0.76%) + + + +text_compare (278 samples, 0.81%) + + + +alloc_blob (38 samples, 0.11%) + + + +alloc_size<4>_tag<5> (26 samples, 0.08%) + + + +B_ge (10 samples, 0.03%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +motoko_rts::text::blob_of_text::h030f22e37f65782b (20 samples, 0.06%) + + + +text_to_buf (88 samples, 0.26%) + + + +memcpy (378 samples, 1.10%) + + + +memcpy (60 samples, 0.17%) + + + +sleb128_decode (162 samples, 0.47%) + + + +__wasm_apply_global_relocs (16 samples, 0.05%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (949 samples, 2.76%) +mo.. + + +from_2_tuple (6 samples, 0.02%) + + + +trans_state5 (13 samples, 0.04%) + + + +@serialize_go<u> (4 samples, 0.01%) + + + +@buffer_size<B> (33 samples, 0.10%) + + + +@deserialize<> (1,026 samples, 2.98%) +@d.. + + +leb128_encode (12 samples, 0.03%) + + + +alloc_size<15>_tag<1> (26 samples, 0.08%) + + + +reply_with_data (4 samples, 0.01%) + + + +__set_hp (4 samples, 0.01%) + + + +alloc_size<4>_tag<11> (39 samples, 0.11%) + + + +to_4_tuple (30 samples, 0.09%) + + + +alloc_size<4>_tag<1> (26 samples, 0.08%) + + + +memcpy (60 samples, 0.17%) + + + +Text.compare_eq (282 samples, 0.82%) + + + +alloc_blob (38 samples, 0.11%) + + + +__set_hp (4 samples, 0.01%) + + + +toArray (3,163 samples, 9.20%) +toArray + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +memset (104 samples, 0.30%) + + + +@deserialize_go<t> (405 samples, 1.18%) + + + +reply_with_data (8 samples, 0.02%) + + + +opt_inject (18 samples, 0.05%) + + + +trans_state6 (13 samples, 0.04%) + + + +@buffer_size<t> (37 samples, 0.11%) + + + +set_local %i1 (6 samples, 0.02%) + + + +sleb128_decode (405 samples, 1.18%) + + + +obj_idx<6> (34 samples, 0.10%) + + + +trans_state7 (13 samples, 0.04%) + + + +memcpy (60 samples, 0.17%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +Array_init (173 samples, 0.50%) + + + +iterate (1,826 samples, 5.31%) +iterate + + +core::str::converts::from_utf8::hbc4c752be9502b18 (209 samples, 0.61%) + + + +alloc_size<2>_tag<9> (13 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +memcpy (978 samples, 2.84%) +me.. + + +store (14,193 samples, 41.26%) +store + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +memset (4 samples, 0.01%) + + + +blob_of_principal (2,083 samples, 6.06%) +blob_of_.. + + +obj_idx<0> (17 samples, 0.05%) + + + +alloc_size<2>_tag<9> (52 samples, 0.15%) + + + +alloc_size<4>_tag<11> (26 samples, 0.08%) + + + +obj_idx<1> (17 samples, 0.05%) + + + +opt_project (18 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +alloc_blob (76 samples, 0.22%) + + + +trans_state4 (28 samples, 0.08%) + + + +idl_sub_buf_words (9 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (550 samples, 1.60%) + + + +trans_state4 (28 samples, 0.08%) + + + +Array.unsafe_idx (7 samples, 0.02%) + + + +opt_inject (18 samples, 0.05%) + + + +alloc_size<4>_tag<5> (13 samples, 0.04%) + + + +@buffer_size<vt> (140 samples, 0.41%) + + + +Array.idx (12 samples, 0.03%) + + + +to_2_tuple (24 samples, 0.07%) + + + +leb128_decode (128 samples, 0.37%) + + + +core::str::converts::from_utf8::hbc4c752be9502b18 (162 samples, 0.47%) + + + +init (2,613 samples, 7.60%) +init + + +memcpy (90 samples, 0.26%) + + + +next (1,249 samples, 3.63%) +next + + +leb128_decode (64 samples, 0.19%) + + + +B_eq (10 samples, 0.03%) + + + +@reset_cycles (4 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (888 samples, 2.58%) +mo.. + + +alloc_size<4>_tag<11> (13 samples, 0.04%) + + + +text_of_ptr_size (149 samples, 0.43%) + + + +$lambda (4,434 samples, 12.89%) +$lambda + + +alloc_size<4>_tag<5> (143 samples, 0.42%) + + + +memcmp (179 samples, 0.52%) + + + +alloc_size<4>_tag<5> (13 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (425 samples, 1.24%) + + + +memcpy (48 samples, 0.14%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (1,088 samples, 3.16%) +mot.. + + +memcpy (72 samples, 0.21%) + + + +set_local %i1 (3 samples, 0.01%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 1.08%) + + + +@deserialize_go<t> (482 samples, 1.40%) + + + +getRec (652 samples, 1.90%) +g.. + + +leb128_decode (256 samples, 0.74%) + + + +motoko_rts::text::text_compare_range::h07711f4d5d67a04f (237 samples, 0.69%) + + + +__set_hp (4 samples, 0.01%) + + + +alloc_size<6>_tag<5> (13 samples, 0.04%) + + + +__set_hp (4 samples, 0.01%) + + + +RBTree (296 samples, 0.86%) + + + +alloc_size<5>_tag<11> (13 samples, 0.04%) + + + +B_gt (10 samples, 0.03%) + + + +text_of_ptr_size (119 samples, 0.35%) + + + +alloc_blob (38 samples, 0.11%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (768 samples, 2.23%) +m.. + + +trans_state3 (11 samples, 0.03%) + + + +obj_idx<0> (51 samples, 0.15%) + + + +text_size (4 samples, 0.01%) + + + +$lambda (786 samples, 2.29%) +$.. + + +list (5,648 samples, 16.42%) +list + + +@deserialize<t> (1,162 samples, 3.38%) +@de.. + + +@deserialize_go<B> (402 samples, 1.17%) + + + +next (1,018 samples, 2.96%) +next + + +to_4_tuple (30 samples, 0.09%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +idl_sub_buf_init (19 samples, 0.06%) + + + +alloc_size<6>_tag<11> (26 samples, 0.08%) + + + +motoko_rts::text::text_get_range::hd4249e7b4d3fea44 (28 samples, 0.08%) + + + +reply_with_data (4 samples, 0.01%) + + + +compare (574 samples, 1.67%) + + + +idl_sub_buf_words (9 samples, 0.03%) + + + +alloc_size<5>_tag<11> (182 samples, 0.53%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (8,810 samples, 25.61%) +motoko_rts::gc::mark_compact::compacting.. + + +alloc_size<5>_tag<11> (65 samples, 0.19%) + + + +text_compare (278 samples, 0.81%) + + + +toArray (283 samples, 0.82%) + + + +memcmp (95 samples, 0.28%) + + + +opt_project (162 samples, 0.47%) + + + +alloc_size<3>_tag<15> (13 samples, 0.04%) + + + +$lambda (238 samples, 0.69%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (144 samples, 0.42%) + + + +memset (8 samples, 0.02%) + + + +@serialize_go<B> (102 samples, 0.30%) + + + +parse_idl_header (371 samples, 1.08%) + + + +alloc_size<11>_tag<1> (13 samples, 0.04%) + + + +compacting_gc (10,967 samples, 31.89%) +compacting_gc + + +leb128_encode (24 samples, 0.07%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (90 samples, 0.26%) + + + +to_2_tuple (24 samples, 0.07%) + + + +opt_inject (18 samples, 0.05%) + + + +@serialize<vt> (771 samples, 2.24%) +@.. + + +opt_project (18 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.21%) + + + +idl_sub_buf_init (19 samples, 0.06%) + + + +utf8_validate (185 samples, 0.54%) + + + +retrieve (2,372 samples, 6.90%) +retrieve + + +rts_start (21 samples, 0.06%) + + + +Array.idx_bigint (23 samples, 0.07%) + + + +alloc_blob (38 samples, 0.11%) + + + +@serialize_go<vt> (235 samples, 0.68%) + + + +motoko_rts::text::text_compare_range::h07711f4d5d67a04f (237 samples, 0.69%) + + + +anon-func-116.7 (30 samples, 0.09%) + + + +B_add (25 samples, 0.07%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (1,188 samples, 3.45%) +mot.. + + +opt_project (18 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +anon-func-31.67 (12 samples, 0.03%) + + + +Text.compare_lt (283 samples, 0.82%) + + + +__get_hp (4 samples, 0.01%) + + + +parse_idl_header (542 samples, 1.58%) + + + +__get_hp (4 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +Buffer (938 samples, 2.73%) +Bu.. + + +alloc_blob (76 samples, 0.22%) + + + +obj_idx<0> (51 samples, 0.15%) + + + +add (330 samples, 0.96%) + + + +alloc_size<5>_tag<11> (26 samples, 0.08%) + + + +alloc_size<4>_tag<11> (26 samples, 0.08%) + + + +@serialize<B> (333 samples, 0.97%) + + + +alloc_size<3>_tag<15> (39 samples, 0.11%) + + + +to_2_tuple (264 samples, 0.77%) + + + +obj_idx<0> (17 samples, 0.05%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (49 samples, 0.14%) + + + +obj_idx<11> (34 samples, 0.10%) + + + +__get_hp (4 samples, 0.01%) + + + +@serialize_go<t> (131 samples, 0.38%) + + + +__set_hp (4 samples, 0.01%) + + + +alloc_size<2>_tag<9> (52 samples, 0.15%) + + + +__set_hp (4 samples, 0.01%) + + + +obj_idx<0> (17 samples, 0.05%) + + + +__wasm_apply_data_relocs (665 samples, 1.93%) +_.. + + +@deserialize<tB> (2,287 samples, 6.65%) +@deserial.. + + +memcpy (59 samples, 0.17%) + + + +alloc_size<3>_tag<15> (13 samples, 0.04%) + + + +get (664 samples, 1.93%) +get + + +Array.unsafe_idx (7 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +insertRec (113 samples, 0.33%) + + + +canister_self (48 samples, 0.14%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (300 samples, 0.87%) + + + +memcpy (118 samples, 0.34%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +leb128_encode (12 samples, 0.03%) + + + +__wasm_call_ctors (666 samples, 1.94%) +_.. + + +idl_sub_buf_words (18 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36 samples, 0.10%) + + + +link_start (39 samples, 0.11%) + + + +alloc_blob (76 samples, 0.22%) + + + +alloc_size<2>_tag<5> (26 samples, 0.08%) + + + +trans_state7 (26 samples, 0.08%) + + + +can_tag_i64 (8 samples, 0.02%) + + + +set_local %i2 (6 samples, 0.02%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (49 samples, 0.14%) + + + +set_local %i0 (6 samples, 0.02%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (45 samples, 0.13%) + + + +map (108 samples, 0.31%) + + + +@reset_refund (4 samples, 0.01%) + + + +alloc_blob (38 samples, 0.11%) + + + +Array.idx (12 samples, 0.03%) + + + +Blob.compare_eq (47 samples, 0.14%) + + + +entries (298 samples, 0.87%) + + + +@reset_refund (8 samples, 0.02%) + + + +__set_hp (4 samples, 0.01%) + + + +B_add (25 samples, 0.07%) + + + +canister_init (11,475 samples, 33.36%) +canister_init + + +opt_inject (72 samples, 0.21%) + + + +Array_tabulate (213 samples, 0.62%) + + + +opt_inject (36 samples, 0.10%) + + + +can_tag_i64 (8 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (10,966 samples, 31.88%) +motoko_rts::gc::mark_compact::compacting_gc::h72afc.. + + +memset (4 samples, 0.01%) + + + +idl_sub_buf_init (38 samples, 0.11%) + + + +insertRoot (241 samples, 0.70%) + + + + diff --git a/flamegraphs/dao-reverse.svg b/flamegraphs/dao-reverse.svg new file mode 100644 index 00000000000..c8f515f3bf6 --- /dev/null +++ b/flamegraphs/dao-reverse.svg @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + +dao.mo (reverse) + +Reset Zoom +Search + + + +Array_tabulate (18,446,744,073,710,010,368 samples, 7.69%) +Array_tabu.. + + +alloc_blob (18,446,744,073,709,535,232 samples, 7.69%) +alloc_blob + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (18,446,744,073,710,108,672 samples, 7.69%) +motoko_rts.. + + +canister_heartbeat (18,446,744,073,709,576,192 samples, 7.69%) +canister_h.. + + +__set_hp (18,446,744,073,709,535,232 samples, 7.69%) +__set_hp + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,436,928 samples, 7.69%) +@serialize.. + + +__set_hp (18,446,744,073,709,813,760 samples, 7.69%) +__set_hp + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,518,848 samples, 7.69%) +@serialize.. + + +__motoko_async_helper (18,446,744,073,709,506,560 samples, 7.69%) +__motoko_a.. + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,518,848 samples, 7.69%) +@serialize.. + + +canister_self (18,446,744,073,709,355,008 samples, 7.69%) +canister_s.. + + +heartbeat_exp (18,446,744,073,709,576,192 samples, 7.69%) +heartbeat_.. + + +list_proposals (18,446,744,073,709,191,168 samples, 7.69%) +list_propo.. + + +alloc_blob (18,446,744,073,709,813,760 samples, 7.69%) +alloc_blob + + +@add_cycles (18,446,744,073,709,576,192 samples, 7.69%) +@add_cycles + + +__motoko_async_helper (18,446,744,073,709,453,312 samples, 7.69%) +__motoko_a.. + + +get_proposal (18,446,744,073,709,535,232 samples, 7.69%) +get_proposal + + +@serialize_go<r(canister_id:P,message:B,method:t)> (18,446,744,073,709,584,384 samples, 7.69%) +@serialize.. + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,436,928 samples, 7.69%) +@serialize.. + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (18,446,744,073,710,436,352 samples, 7.69%) +motoko_rts.. + + +all (239,807,672,958,236,065,792 samples, 100%) + + + +anon_async (18,446,744,073,709,506,560 samples, 7.69%) +anon_async + + +@serialize<> (18,446,744,073,709,518,848 samples, 7.69%) +@serialize<> + + +motoko_rts::memory::alloc_blob::h89549146b02728af (18,446,744,073,709,535,232 samples, 7.69%) +motoko_rts.. + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,535,232 samples, 7.69%) +@serialize.. + + +@serialize_go<P> (18,446,744,073,709,535,232 samples, 7.69%) +@serialize.. + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,518,848 samples, 7.69%) +@serialize.. + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,535,232 samples, 7.69%) +@serialize.. + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,453,312 samples, 7.69%) +@serialize.. + + +get_proposal (18,446,744,073,709,453,312 samples, 7.69%) +get_proposal + + +__motoko_async_helper (18,446,744,073,709,453,312 samples, 7.69%) +__motoko_a.. + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,453,312 samples, 7.69%) +@serialize.. + + +__get_hp (18,446,744,073,710,010,368 samples, 7.69%) +__get_hp + + +@new_async (18,446,744,073,709,191,168 samples, 7.69%) +@new_async + + +$lambda (18,446,744,073,709,453,312 samples, 7.69%) +$lambda + + +__motoko_async_helper (18,446,744,073,709,453,312 samples, 7.69%) +__motoko_a.. + + +$lambda (18,446,744,073,709,453,312 samples, 7.69%) +$lambda + + +@serialize_go<u> (18,446,744,073,709,518,848 samples, 7.69%) +@serialize.. + + +get_proposal (18,446,744,073,709,813,760 samples, 7.69%) +get_proposal + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,584,384 samples, 7.69%) +@serialize.. + + +@serialize_go<vr(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,584,384 samples, 7.69%) +@serialize.. + + +compacting_gc (18,446,744,073,710,436,352 samples, 7.69%) +compacting.. + + +alloc_array (18,446,744,073,710,010,368 samples, 7.69%) +alloc_array + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (18,446,744,073,710,436,352 samples, 7.69%) +motoko_rts.. + + +$lambda (18,446,744,073,709,520,896 samples, 7.69%) +$lambda + + +@serialize_go<r(canister_id:P,message:B,method:t)> (18,446,744,073,709,535,232 samples, 7.69%) +@serialize.. + + +list_proposals (18,446,744,073,709,355,008 samples, 7.69%) +list_propo.. + + +$lambda (18,446,744,073,709,453,312 samples, 7.69%) +$lambda + + +heartbeat (18,446,744,073,709,576,192 samples, 7.69%) +heartbeat + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (18,446,744,073,710,010,368 samples, 7.69%) +motoko_rts.. + + +as_ptr_size (18,446,744,073,709,895,680 samples, 7.69%) +as_ptr_size + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,453,312 samples, 7.69%) +@serialize.. + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,535,232 samples, 7.69%) +@serialize.. + + +@new_async (18,446,744,073,709,355,008 samples, 7.69%) +@new_async + + + diff --git a/flamegraphs/dao.svg b/flamegraphs/dao.svg new file mode 100644 index 00000000000..1e97be344b7 --- /dev/null +++ b/flamegraphs/dao.svg @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + +dao.mo + +Reset Zoom +Search + + + +alloc_blob (36,893,488,147,419,103,232 samples, 15.38%) +alloc_blob + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (18,446,744,073,709,551,616 samples, 7.69%) +motoko_rts.. + + +@serialize_go<u> (18,446,744,073,709,510,656 samples, 7.69%) +@serialize.. + + +get_proposal (18,446,744,073,709,592,576 samples, 7.69%) +get_proposal + + +@serialize_go<r(canister_id:P,message:B,method:t)> (18,446,744,073,709,502,464 samples, 7.69%) +@serialize.. + + +@new_async (36,893,488,147,419,037,696 samples, 15.38%) +@new_async + + +@serialize<vr(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,699,072 samples, 7.69%) +@serialize.. + + +@serialize_go<P> (18,446,744,073,709,502,464 samples, 7.69%) +@serialize.. + + +$lambda (18,446,744,073,709,592,576 samples, 7.69%) +$lambda + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (55,340,232,221,128,753,152 samples, 23.08%) +@serialize<?r(id:N,payload:r(caniste.. + + +compacting_gc (18,446,744,073,709,551,616 samples, 7.69%) +compacting.. + + +$lambda (55,340,232,221,128,761,344 samples, 23.08%) +$lambda + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,699,072 samples, 7.69%) +@serialize.. + + +execute_accepted_proposals (73,786,976,294,838,239,232 samples, 30.77%) +execute_accepted_proposals + + +@serialize_go<vr(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,699,072 samples, 7.69%) +@serialize.. + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (18,446,744,073,709,527,040 samples, 7.69%) +motoko_rts.. + + +list_proposals (55,340,232,221,128,671,232 samples, 23.08%) +list_proposals + + +$lambda (18,446,744,073,709,502,464 samples, 7.69%) +$lambda + + +as_ptr_size (73,786,976,294,838,222,848 samples, 30.77%) +as_ptr_size + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (18,446,744,073,709,584,384 samples, 7.69%) +motoko_rts.. + + +list_proposals (36,893,488,147,419,037,696 samples, 15.38%) +list_proposals + + +@add_cycles (18,446,744,073,709,584,384 samples, 7.69%) +@add_cycles + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (18,446,744,073,709,502,464 samples, 7.69%) +@serialize.. + + +toArray (36,893,488,147,419,136,000 samples, 15.38%) +toArray + + +canister_self (18,446,744,073,709,486,080 samples, 7.69%) +canister_s.. + + +motoko_rts::memory::alloc_blob::h89549146b02728af (36,893,488,147,419,103,232 samples, 15.38%) +motoko_rts::memory::all.. + + +@serialize<> (18,446,744,073,709,510,656 samples, 7.69%) +@serialize<> + + +heartbeat_exp (55,340,232,221,128,589,312 samples, 23.08%) +heartbeat_exp + + +$loop/1 (18,446,744,073,709,510,656 samples, 7.69%) +$loop/1 + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (18,446,744,073,709,158,400 samples, 7.69%) +motoko_rts.. + + +toArray (36,893,488,147,419,136,000 samples, 15.38%) +toArray + + +anon_async (18,446,744,073,709,510,656 samples, 7.69%) +anon_async + + +compacting_gc (18,446,744,073,709,584,384 samples, 7.69%) +compacting.. + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (18,446,744,073,709,584,384 samples, 7.69%) +motoko_rts.. + + +$lambda (18,446,744,073,709,510,656 samples, 7.69%) +$lambda + + +$lambda (55,340,232,221,128,761,344 samples, 23.08%) +$lambda + + +$lambda (55,340,232,221,128,671,232 samples, 23.08%) +$lambda + + +@serialize_go<r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:9=?(P!9),votes_no:11=r(amount_e8s:N),votes_yes:!11)> (55,340,232,221,128,687,616 samples, 23.08%) +@serialize_go<r(id:N,payload:r(canis.. + + +$lambda (92,233,720,368,547,741,696 samples, 38.46%) +$lambda + + +__get_hp (18,446,744,073,709,158,400 samples, 7.69%) +__get_hp + + +$lambda (18,446,744,073,709,502,464 samples, 7.69%) +$lambda + + +__motoko_async_helper (184,467,440,737,101,774,848 samples, 76.92%) +__motoko_async_helper + + +heartbeat (55,340,232,221,128,589,312 samples, 23.08%) +heartbeat + + +alloc_array (18,446,744,073,709,158,400 samples, 7.69%) +alloc_array + + +canister_heartbeat (55,340,232,221,128,589,312 samples, 23.08%) +canister_heartbeat + + +all (239,807,672,958,236,229,632 samples, 100%) + + + +@serialize_go<r(canister_id:P,message:B,method:t)> (18,446,744,073,709,699,072 samples, 7.69%) +@serialize.. + + +__set_hp (36,893,488,147,419,054,080 samples, 15.38%) +__set_hp + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,502,464 samples, 7.69%) +@serialize.. + + +Array_tabulate (18,446,744,073,709,158,400 samples, 7.69%) +Array_tabu.. + + +__motoko_async_helper (55,340,232,221,128,654,848 samples, 23.08%) +__motoko_async_helper + + +$lambda (18,446,744,073,709,510,656 samples, 7.69%) +$lambda + + +anon_async (92,233,720,368,547,741,696 samples, 38.46%) +anon_async + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,502,464 samples, 7.69%) +@serialize.. + + +@serialize_go<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (55,340,232,221,128,687,616 samples, 23.08%) +@serialize_go<?r(id:N,payload:r(cani.. + + +get_proposal (36,893,488,147,419,054,080 samples, 15.38%) +get_proposal + + + diff --git a/flamegraphs/index.html b/flamegraphs/index.html new file mode 100644 index 00000000000..500c73e3d69 --- /dev/null +++ b/flamegraphs/index.html @@ -0,0 +1,26 @@ + + + + + + Motoko prof flamegraphs + + +

Motoko prof flamegraphs

+

assetstorage.mo

+ + +

dao.mo

+ + +

qr.mo

+ + +

reversi.mo

+ + +

sha256.mo

+ + + + diff --git a/flamegraphs/nix-support/hydra-build-products b/flamegraphs/nix-support/hydra-build-products new file mode 100644 index 00000000000..9dd867db3e1 --- /dev/null +++ b/flamegraphs/nix-support/hydra-build-products @@ -0,0 +1 @@ +report flamegraphs /nix/store/dlbgs66sk4i07n3di5dl6qm2qqjxm858-test-profiling-graphs index.html diff --git a/flamegraphs/qr-reverse.svg b/flamegraphs/qr-reverse.svg new file mode 100644 index 00000000000..15f53d3988a --- /dev/null +++ b/flamegraphs/qr-reverse.svg @@ -0,0 +1,162889 @@ + + + + + + + + + + + + + + +qr.mo (reverse) + +Reset Zoom +Search + + + +rec (3,888 samples, 0.13%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-51.11 (289 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (360 samples, 0.01%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +anon-func-435.5 (7,296 samples, 0.24%) + + + +polyZipWith (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-481.5 (267 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyGrow (273 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +patternCoords (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (26,784 samples, 0.87%) + + + +map (416 samples, 0.01%) + + + +$lambda (338 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +map (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +map (496 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (1,936 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-161.5 (3,200 samples, 0.10%) + + + +polyDivMod (434 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (372 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +anon-func-79.3 (310 samples, 0.01%) + + + +interleave (290 samples, 0.01%) + + + +polyPadLeft (273 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyTrim (5,236 samples, 0.17%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +pathCoords (810 samples, 0.03%) + + + +go (624 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +polyGrow (425 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (832 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (439 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (12,104 samples, 0.39%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-265.5 (385 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (575 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +correction (496 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAdd (528 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyScale (476 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (419 samples, 0.01%) + + + +go (3,683 samples, 0.12%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +rec (1,468 samples, 0.05%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +interleave (810 samples, 0.03%) + + + +encode (270 samples, 0.01%) + + + +rec (663 samples, 0.02%) + + + +generate (364 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (3,456 samples, 0.11%) + + + +correction (352 samples, 0.01%) + + + +natToBits (4,217 samples, 0.14%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +$lambda (408 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +$lambda (322 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +go (446 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (1,062 samples, 0.03%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyScale (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-393.5 (900 samples, 0.03%) + + + +pathCoords (546 samples, 0.02%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +polyAdd (1,376 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (10,400 samples, 0.34%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (1,395 samples, 0.05%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-229.5 (585 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +pathCoords (9,808 samples, 0.32%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +polyMulTerm (465 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyMulTerm (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (780 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +finderCoords (1,764 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (1,440 samples, 0.05%) + + + +rec (975 samples, 0.03%) + + + +$lambda (325 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (11,850 samples, 0.38%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +generate (357 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +go (486 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (1,024 samples, 0.03%) + + + +interleave (1,216 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +natZipWith (25,536 samples, 0.83%) + + + +anon-func-48.7 (532 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +encode (137,574 samples, 4.45%) +encode + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +polyAdd (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-265.5 (270 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +interleave (270 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (338 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-32.65 (378 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +rec (280 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (510 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-161.5 (385 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +rec (3,672 samples, 0.12%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +rec (4,437 samples, 0.14%) + + + +anon-func-32.65 (378 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (12,002 samples, 0.39%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (6,282 samples, 0.20%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (446 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +finderCoords (704 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +anon-func-435.5 (8,640 samples, 0.28%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (1,089 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyMulTerm (624 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-481.5 (1,890 samples, 0.06%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyZipWith (1,021 samples, 0.03%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (310 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (419 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (1,242 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (504 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-453.5 (620 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +toList (527 samples, 0.02%) + + + +polySub (363 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (270 samples, 0.01%) + + + +polyZipWith (42,752 samples, 1.38%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyPadLeft (306 samples, 0.01%) + + + +anon-func-161.5 (1,408 samples, 0.05%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +toBlocks (800 samples, 0.03%) + + + +correction (478 samples, 0.02%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +rec (1,055 samples, 0.03%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (3,456 samples, 0.11%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +pathCoords (270 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (532 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +anon-func-51.11 (6,768 samples, 0.22%) + + + +polyDivMod (6,392 samples, 0.21%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +rec (357 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +map (2,704 samples, 0.09%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (660 samples, 0.02%) + + + +rec (816 samples, 0.03%) + + + +correction (289 samples, 0.01%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +correction (2,754 samples, 0.09%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (516 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-32.65 (810 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +rec (888 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +toBlocks (320 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (1,024 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +polyAdd (1,279 samples, 0.04%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-51.11 (400 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (867 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-161.5 (390 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyPadLeft (403 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (2,601 samples, 0.08%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (8,725 samples, 0.28%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (1,170 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-161.5 (1,632 samples, 0.05%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (688 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +interleave (280 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (1,833 samples, 0.06%) + + + +go (608 samples, 0.02%) + + + +generate (576 samples, 0.02%) + + + +go (360 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyScale (465 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (275 samples, 0.01%) + + + +natZipWith (10,752 samples, 0.35%) + + + +rec (61,232 samples, 1.98%) +rec + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +step (340 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +map (270 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-32.65 (576 samples, 0.02%) + + + +anon-func-453.5 (600 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-393.5 (1,051 samples, 0.03%) + + + +generate (810 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-32.65 (4,466 samples, 0.14%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +rec (979 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +generate (378 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyZipWith (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyNew (351 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (1,408 samples, 0.05%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +natZipWith (6,720 samples, 0.22%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (1,785 samples, 0.06%) + + + +encode (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +elemMul (2,112 samples, 0.07%) + + + +encode (1,440 samples, 0.05%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +encode (688 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +go (468 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-265.5 (510 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +$lambda (704 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (12,080 samples, 0.39%) + + + +encode (270 samples, 0.01%) + + + +$lambda (2,448 samples, 0.08%) + + + +anon-func-32.65 (1,764 samples, 0.06%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (468 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (1,989 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyNew (297 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (4,466 samples, 0.14%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (792 samples, 0.03%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-481.5 (1,098 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (5,472 samples, 0.18%) + + + +$lambda (608 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-229.5 (407 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyAdd (299 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +rec (312 samples, 0.01%) + + + +encode (1,440 samples, 0.05%) + + + +anon-func-265.5 (270 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +$lambda (446 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +blob_of_principal (472 samples, 0.02%) + + + +anon-func-481.5 (610 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (1,408 samples, 0.05%) + + + +rec (746 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (12,002 samples, 0.39%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (2,920 samples, 0.09%) + + + +rec (505 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +rec (847 samples, 0.03%) + + + +rec (800 samples, 0.03%) + + + +anon-func-481.5 (1,820 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (37,312 samples, 1.21%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +$lambda (326 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAdd (485 samples, 0.02%) + + + +toListWithLength (609 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (618 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +anon-func-412.5 (972 samples, 0.03%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +correction (480 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +polyPadLeft (589 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-32.65 (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (271 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-30.36 (527 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +formatHCoords (381 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (1,520 samples, 0.05%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polyAdd (832 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (12,096 samples, 0.39%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-54.15 (1,055 samples, 0.03%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +rec (745 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyMulTerm (372 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +encode (5,627 samples, 0.18%) + + + +anon-func-161.5 (810 samples, 0.03%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-481.5 (580 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +anon-func-161.5 (1,736 samples, 0.06%) + + + +anon-func-265.5 (935 samples, 0.03%) + + + +anon-func-481.5 (350 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +encode (338 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +encode (326 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +go (608 samples, 0.02%) + + + +rec (1,126 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (1,206 samples, 0.04%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +Array.idx_bigint (8,004 samples, 0.26%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +finderCoords (2,630 samples, 0.09%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +rec (1,716 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (1,496 samples, 0.05%) + + + +interleave (271 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +encode (403 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +step (380 samples, 0.01%) + + + +anon-func-393.5 (374 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (1,040 samples, 0.03%) + + + +polyMulTerm (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +polyPadLeft (849 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (5,398 samples, 0.17%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (850 samples, 0.03%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +map (363 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (8,512 samples, 0.28%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (1,024 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-161.5 (810 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rowwise (364 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (384 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (5,742 samples, 0.19%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (1,024 samples, 0.03%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +toTarget (1,440 samples, 0.05%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +rec (2,125 samples, 0.07%) + + + +map (374 samples, 0.01%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +pathCoords (1,786 samples, 0.06%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (1,206 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (289 samples, 0.01%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +polyGrow (414 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-481.5 (350 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +elemToBits (2,994 samples, 0.10%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyDivMod (442 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +canister_init (1,006 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (306 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-481.5 (500 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-229.5 (1,573 samples, 0.05%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +interleave (2,634 samples, 0.09%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (604 samples, 0.02%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +rec (297 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +elemAdd (2,688 samples, 0.09%) + + + +anon-func-48.7 (1,768 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +rec (2,652 samples, 0.09%) + + + +anon-func-161.5 (3,828 samples, 0.12%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (1,054 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (6,192 samples, 0.20%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyAdd (384 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +natZipWith (7,392 samples, 0.24%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (6,768 samples, 0.22%) + + + +map (288 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-435.5 (9,856 samples, 0.32%) + + + +encode (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +pathCoords (832 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (649 samples, 0.02%) + + + +anon-func-51.11 (8,758 samples, 0.28%) + + + +polyMulTerm (384 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-79.3 (434 samples, 0.01%) + + + +polyDivMod (489 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +elemAdd (12,096 samples, 0.39%) + + + +polySub (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +polyZipWith (561 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (27,760 samples, 0.90%) + + + +go (1,120 samples, 0.04%) + + + +generate (1,055 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (799 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (6,570 samples, 0.21%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (448 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (408 samples, 0.01%) + + + +anon-func-48.7 (618 samples, 0.02%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-453.5 (806 samples, 0.03%) + + + +go (575 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +elemToBits (268 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-48.7 (378 samples, 0.01%) + + + +elemFromBits (391 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-32.65 (381 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (2,448 samples, 0.08%) + + + +anon-func-48.7 (556 samples, 0.02%) + + + +rec (912 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +alloc_size<4>_tag<11> (1,742 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (280 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +interleave (3,008 samples, 0.10%) + + + +polyDivMod (12,104 samples, 0.39%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +go (484 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (1,376 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-229.5 (738 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (495 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (3,456 samples, 0.11%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +toTarget (1,000 samples, 0.03%) + + + +polyScale (272 samples, 0.01%) + + + +rec (2,342 samples, 0.08%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (1,005 samples, 0.03%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +go (496 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +anon-func-161.5 (316 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +anon-func-393.5 (594 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (403 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +B_rem (18,752 samples, 0.61%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +pathCoords (357 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +natFromBits (316 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (1,440 samples, 0.05%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-393.5 (1,131 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-79.3 (495 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +elemMul (5,280 samples, 0.17%) + + + +$lambda (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-161.5 (510 samples, 0.02%) + + + +anon-func-453.5 (682 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-435.5 (14,784 samples, 0.48%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +flatten (2,288 samples, 0.07%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +patternCoords (1,764 samples, 0.06%) + + + +encode (2,112 samples, 0.07%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (2,704 samples, 0.09%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyPadRight (363 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (306 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +elemFromBits (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +map (384 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +flatten (966 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (2,226 samples, 0.07%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (439 samples, 0.01%) + + + +$lambda (4,194 samples, 0.14%) + + + +anon-func-54.15 (606 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (4,518 samples, 0.15%) + + + +anon-func-73.5 (32,536 samples, 1.05%) + + + +anon-func-51.11 (3,456 samples, 0.11%) + + + +anon-func-161.5 (1,632 samples, 0.05%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (3,168 samples, 0.10%) + + + +rec (1,638 samples, 0.05%) + + + +$lambda (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +foldr (275 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-54.15 (1,786 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (441 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +rec (2,288 samples, 0.07%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-412.5 (533 samples, 0.02%) + + + +anon-func-79.3 (4,882 samples, 0.16%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +natXor (6,720 samples, 0.22%) + + + +anon-func-48.7 (8,758 samples, 0.28%) + + + +go (608 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-300.5 (556 samples, 0.02%) + + + +anon-func-38.11 (1,440 samples, 0.05%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-481.5 (694 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-435.5 (3,200 samples, 0.10%) + + + +polyDivMod (480 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +anon-func-244.5 (19,638 samples, 0.63%) + + + +polyMulTerm (374 samples, 0.01%) + + + +map (340 samples, 0.01%) + + + +anon-func-265.5 (990 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +rec (312 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +Array.idx_bigint (7,337 samples, 0.24%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +rec (9,002 samples, 0.29%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +toList (493 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-54.15 (904 samples, 0.03%) + + + +polyPadRight (357 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +correction (279 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-453.5 (620 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (2,052 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (1,850 samples, 0.06%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (12,104 samples, 0.39%) + + + +interleave (283 samples, 0.01%) + + + +anon-func-38.11 (465 samples, 0.02%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +$lambda (704 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +rec (728 samples, 0.02%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +flatten (468 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +toTarget (280 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (480 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (1,024 samples, 0.03%) + + + +correction (1,496 samples, 0.05%) + + + +anon-func-51.11 (419 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +anon-func-51.11 (342 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +rec (1,016 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (326 samples, 0.01%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (799 samples, 0.03%) + + + +anon-func-435.5 (39,360 samples, 1.27%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +rec (1,125 samples, 0.04%) + + + +anon-func-161.5 (7,888 samples, 0.26%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +rec (279 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (560 samples, 0.02%) + + + +anon-func-161.5 (1,960 samples, 0.06%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +polyGrow (419 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-28.22 (2,016 samples, 0.07%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +rec (1,221 samples, 0.04%) + + + +polyAdd (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-495.31 (325 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +pathCoords (378 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +go (272 samples, 0.01%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyDivMod (624 samples, 0.02%) + + + +rec (264 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +pathCoords (756 samples, 0.02%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +rec (1,626 samples, 0.05%) + + + +correction (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (7,907 samples, 0.26%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-54.15 (1,764 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-435.5 (44,608 samples, 1.44%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-161.5 (326 samples, 0.01%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (799 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +encode (3,744 samples, 0.12%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-229.5 (864 samples, 0.03%) + + + +anon-func-494.5 (275 samples, 0.01%) + + + +generate (374 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-51.11 (14,992 samples, 0.48%) + + + +polyMulTerm (272 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +$lambda (1,664 samples, 0.05%) + + + +polyDivMod (2,754 samples, 0.09%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (522 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +interleave (3,744 samples, 0.12%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-229.5 (1,655 samples, 0.05%) + + + +interleave (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (280 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +polyGrow (523 samples, 0.02%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +rec (555 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +generate (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-54.15 (4,194 samples, 0.14%) + + + +$lambda (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,408 samples, 0.05%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +elemFromBits (608 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +toTarget (880 samples, 0.03%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (2,448 samples, 0.08%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-161.5 (361 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyGrow (591 samples, 0.02%) + + + +rec (435 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +polyZipWith (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyAddTerm (272 samples, 0.01%) + + + +polyAdd (558 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-48.7 (517 samples, 0.02%) + + + +rec (2,040 samples, 0.07%) + + + +anon-func-48.7 (9,808 samples, 0.32%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +pathCoords (1,224 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (14,992 samples, 0.48%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-481.5 (264 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (832 samples, 0.03%) + + + +polyAdd (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (12,104 samples, 0.39%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-48.7 (14,992 samples, 0.48%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (3,456 samples, 0.11%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,440 samples, 0.05%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (360 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (122,176 samples, 3.95%) +anon.. + + +toTarget (274 samples, 0.01%) + + + +anon-func-435.5 (10,208 samples, 0.33%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +natFromBits (391 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (400 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +map (496 samples, 0.02%) + + + +patternCoords (381 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +interleave (326 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +natXor (25,536 samples, 0.83%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAddTerm (384 samples, 0.01%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (15,680 samples, 0.51%) + + + +anon-func-265.5 (480 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +$lambda (704 samples, 0.02%) + + + +interleave (1,845 samples, 0.06%) + + + +interleave (328 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-161.5 (2,112 samples, 0.07%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (704 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-265.5 (2,015 samples, 0.07%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +patternCoords (342 samples, 0.01%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-48.7 (799 samples, 0.03%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +toListWithLength (319 samples, 0.01%) + + + +anon-func-161.5 (2,176 samples, 0.07%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-244.5 (8,839 samples, 0.29%) + + + +map (688 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (532 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +flatten (3,744 samples, 0.12%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (595 samples, 0.02%) + + + +anon-func-435.5 (2,688 samples, 0.09%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (12,002 samples, 0.39%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-161.5 (3,360 samples, 0.11%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +rec (690 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +map (270 samples, 0.01%) + + + +natToBits (1,770 samples, 0.06%) + + + +map (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (575 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +rec (286 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-265.5 (385 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +traceCoords (756 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (480 samples, 0.02%) + + + +correction (5,355 samples, 0.17%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-161.5 (2,024 samples, 0.07%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +polyNew (450 samples, 0.01%) + + + +anon-func-38.11 (12,816 samples, 0.41%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (972 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (516 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyPadLeft (450 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-412.5 (351 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +go (618 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +map (270 samples, 0.01%) + + + +$lambda (516 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-161.5 (2,400 samples, 0.08%) + + + +anon-func-265.5 (280 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +correction (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (1,058 samples, 0.03%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +correction (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (338 samples, 0.01%) + + + +polyLen (97,946 samples, 3.17%) +pol.. + + +map (544 samples, 0.02%) + + + +polyPadLeft (275 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (496 samples, 0.02%) + + + +anon-func-435.5 (24,192 samples, 0.78%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-435.5 (11,264 samples, 0.36%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-435.5 (6,880 samples, 0.22%) + + + +correction (608 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (1,573 samples, 0.05%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-435.5 (2,736 samples, 0.09%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (682 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (12,816 samples, 0.41%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +rec (1,991 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-435.5 (11,808 samples, 0.38%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-48.7 (1,152 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (12,816 samples, 0.41%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-54.15 (2,630 samples, 0.09%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (833 samples, 0.03%) + + + +go (351 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (8,736 samples, 0.28%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-453.5 (2,065 samples, 0.07%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (2,006 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-32.65 (342 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (11,088 samples, 0.36%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +rec (2,896 samples, 0.09%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +elemFromBits (608 samples, 0.02%) + + + +encode (274 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (1,175 samples, 0.04%) + + + +anon-func-54.15 (546 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +go (289 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +pathCoords (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyGrow (677 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +rec (1,173 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (618 samples, 0.02%) + + + +anon-func-38.11 (478 samples, 0.02%) + + + +natFromBytes (8,739 samples, 0.28%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +toListWithLength (522 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +step (826 samples, 0.03%) + + + +anon-func-300.5 (14,992 samples, 0.48%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +encode (6,392 samples, 0.21%) + + + +anon-func-48.7 (1,496 samples, 0.05%) + + + +polyDivMod (608 samples, 0.02%) + + + +rec (1,870 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (3,008 samples, 0.10%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (271 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,408 samples, 0.05%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (384 samples, 0.01%) + + + +formatVCoords (270 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-161.5 (2,072 samples, 0.07%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +go (320 samples, 0.01%) + + + +interleave (496 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +scale (2,288 samples, 0.07%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +encode (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (2,125 samples, 0.07%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (3,355 samples, 0.11%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +forIn (527 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +map (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-38.11 (512 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-435.5 (1,232 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (289 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyAdd (486 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,764 samples, 0.06%) + + + +rec (670 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyPadLeft (275 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (2,496 samples, 0.08%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (522 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +natXor (6,720 samples, 0.22%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +rec (520 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (595 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-412.5 (1,817 samples, 0.06%) + + + +correction (608 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +interleave (6,768 samples, 0.22%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyMulTerm (624 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAdd (377 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-412.5 (1,003 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +rec (13,508 samples, 0.44%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-481.5 (564 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (279 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +patternCoords (704 samples, 0.02%) + + + +rec (289 samples, 0.01%) + + + +rec (390 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +rec (3,085 samples, 0.10%) + + + +rec (1,225 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +interleave (1,496 samples, 0.05%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +rec (484 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (341 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +generate (704 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +natXor (12,096 samples, 0.39%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (376 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +patternCoords (342 samples, 0.01%) + + + +anon-func-51.11 (317 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (439 samples, 0.01%) + + + +anon-func-32.65 (462 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (2,030 samples, 0.07%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +$lambda (462 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +rec (2,028 samples, 0.07%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +natZipWith (12,096 samples, 0.39%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-265.5 (1,260 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (10,240 samples, 0.33%) + + + +interleave (288 samples, 0.01%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +finderBLCoords (704 samples, 0.02%) + + + +$lambda (440 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +encode (378 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +traceCoords (546 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.08%) + + + +polyLen (584 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (3,029 samples, 0.10%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +$lambda (2,250 samples, 0.07%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natToBits (1,345 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyMulTerm (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (442 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +rec (2,684 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (1,176 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +generate (441 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +rec (2,176 samples, 0.07%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +anon-func-229.5 (864 samples, 0.03%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyScale (480 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +correction (608 samples, 0.02%) + + + +anon-func-300.5 (595 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +rec (3,942 samples, 0.13%) + + + +finderCoords (2,644 samples, 0.09%) + + + +elemFromBits (272 samples, 0.01%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-161.5 (650 samples, 0.02%) + + + +go (384 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (486 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (546 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-51.11 (306 samples, 0.01%) + + + +interleave (270 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-79.3 (12,104 samples, 0.39%) + + + +anon-func-265.5 (1,350 samples, 0.04%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-38.11 (527 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +rec (684 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (9,984 samples, 0.32%) + + + +map (688 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +elemDiv (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyAdd (295 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +polyPadLeft (522 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +map (2,448 samples, 0.08%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +$lambda (280 samples, 0.01%) + + + +rec (1,275 samples, 0.04%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +interleave (12,104 samples, 0.39%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyDivMod (496 samples, 0.02%) + + + +$lambda (2,754 samples, 0.09%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +$lambda (3,683 samples, 0.12%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (810 samples, 0.03%) + + + +anon-func-48.7 (1,664 samples, 0.05%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (2,312 samples, 0.07%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +rec (5,280 samples, 0.17%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-161.5 (1,105 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +correction (306 samples, 0.01%) + + + +anon-func-435.5 (15,744 samples, 0.51%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (6,392 samples, 0.21%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-435.5 (12,480 samples, 0.40%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (6,768 samples, 0.22%) + + + +$lambda (468 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (11,648 samples, 0.38%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +finderTRCoords (1,764 samples, 0.06%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +scale (4,224 samples, 0.14%) + + + +$lambda (2,646 samples, 0.09%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,124 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +polyPadRight (599 samples, 0.02%) + + + +polySub (532 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +polyDivMod (576 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +elemAdd (14,784 samples, 0.48%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +correction (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (468 samples, 0.02%) + + + +rec (1,585 samples, 0.05%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +natXor (22,848 samples, 0.74%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +pathCoords (704 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (3,029 samples, 0.10%) + + + +traceCoords (1,055 samples, 0.03%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-54.15 (4,466 samples, 0.14%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (3,008 samples, 0.10%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +correction (1,683 samples, 0.05%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (377 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +anon-func-435.5 (6,720 samples, 0.22%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +rec (16,638 samples, 0.54%) + + + +correction (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (8,323 samples, 0.27%) + + + +encode (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (625 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-161.5 (3,780 samples, 0.12%) + + + +encode (595 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-161.5 (540 samples, 0.02%) + + + +$lambda (5,008 samples, 0.16%) + + + +anon-func-161.5 (4,138 samples, 0.13%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-161.5 (3,438 samples, 0.11%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,664 samples, 0.05%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (992 samples, 0.03%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (274 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +elemDiv (272 samples, 0.01%) + + + +parse_idl_header (810 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +interleave (1,120 samples, 0.04%) + + + +flatten (972 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (816 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,360 samples, 0.04%) + + + +interleave (384 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-48.7 (6,768 samples, 0.22%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +encode (1,664 samples, 0.05%) + + + +next (1,140 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (4,966 samples, 0.16%) + + + +rec (1,026 samples, 0.03%) + + + +anon-func-161.5 (2,630 samples, 0.09%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +rec (1,411 samples, 0.05%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (11,432 samples, 0.37%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-32.65 (441 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +pathCoords (780 samples, 0.03%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-300.5 (575 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (575 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (760 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-61.36 (2,304 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +natXor (22,848 samples, 0.74%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (384 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (286 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyMulTerm (496 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyAdd (19,584 samples, 0.63%) + + + +polyGrow (323 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +map (1,058 samples, 0.03%) + + + +anon-func-54.15 (546 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +encode (608 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (4,466 samples, 0.14%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (6,144 samples, 0.20%) + + + +polyZipWith (608 samples, 0.02%) + + + +polyGrow (1,333 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-30.36 (468 samples, 0.02%) + + + +anon-func-481.5 (276 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +correction (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (328 samples, 0.01%) + + + +correction (439 samples, 0.01%) + + + +interleave (806 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (31,360 samples, 1.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-99.14 (493 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (363 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (434 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (688 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +rec (2,680 samples, 0.09%) + + + +anon-func-48.7 (419 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +elemFromBits (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-54.15 (2,112 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-161.5 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (3,536 samples, 0.11%) + + + +rec (1,089 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +anon-func-435.5 (1,216 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyGrow (403 samples, 0.01%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +encode (3,008 samples, 0.10%) + + + +$loop/1 (3,683 samples, 0.12%) + + + +correction (2,754 samples, 0.09%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (341 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +elemDiv (272 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +rec (1,734 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-393.5 (696 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +step (351 samples, 0.01%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (3,072 samples, 0.10%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +polyGrow (450 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-79.3 (328 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (3,081 samples, 0.10%) + + + +polyAdd (450 samples, 0.01%) + + + +polySub (419 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +interleave (468 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +rec (2,156 samples, 0.07%) + + + +correction (272 samples, 0.01%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (310 samples, 0.01%) + + + +anon-func-161.5 (385 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +rec (1,819 samples, 0.06%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +anon-func-481.5 (560 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +rec (1,085 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (364 samples, 0.01%) + + + +anon-func-161.5 (6,157 samples, 0.20%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-435.5 (27,520 samples, 0.89%) + + + +anon-func-161.5 (315 samples, 0.01%) + + + +anon-func-161.5 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-481.5 (312 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +rec (689 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-161.5 (285 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (664 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rec (936 samples, 0.03%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +encode (3,580 samples, 0.12%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +pathCoords (320 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (8,130 samples, 0.26%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (575 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +text_iter_next (664 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +encode (1,664 samples, 0.05%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polySub (688 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (575 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (493 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-161.5 (1,848 samples, 0.06%) + + + +rec (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (341 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (936 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (645 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-435.5 (17,472 samples, 0.56%) + + + +rec (1,343 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (27,760 samples, 0.90%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyZipWith (447 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +natZipWith (6,720 samples, 0.22%) + + + +polyAdd (2,624 samples, 0.08%) + + + +elemToBits (730 samples, 0.02%) + + + +polyAdd (341 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (3,744 samples, 0.12%) + + + +go (288 samples, 0.01%) + + + +flatten (338 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyAdd (576 samples, 0.02%) + + + +map (618 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +map (288 samples, 0.01%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (440 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-435.5 (4,480 samples, 0.14%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (2,240 samples, 0.07%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +encode (576 samples, 0.02%) + + + +rec (2,700 samples, 0.09%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +rec (3,348 samples, 0.11%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-161.5 (1,872 samples, 0.06%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +map (5,008 samples, 0.16%) + + + +go (544 samples, 0.02%) + + + +elemAdd (17,472 samples, 0.56%) + + + +correction (688 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyMulTerm (384 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (1,152 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (13,760 samples, 0.44%) + + + +$lambda (480 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-300.5 (360 samples, 0.01%) + + + +anon-func-435.5 (15,392 samples, 0.50%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (328 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +encode (1,055 samples, 0.03%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-435.5 (10,752 samples, 0.35%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +traceCoords (1,638 samples, 0.05%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +traceCoords (2,226 samples, 0.07%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-54.15 (323,033 samples, 10.44%) +anon-func-54.15 + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +elemAdd (24,192 samples, 0.78%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (3,744 samples, 0.12%) + + + +encode (478 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-161.5 (9,864 samples, 0.32%) + + + +patternCoords (1,764 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +rec (1,525 samples, 0.05%) + + + +encode (270 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (289 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (2,704 samples, 0.09%) + + + +anon-func-161.5 (8,432 samples, 0.27%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +elemMul (2,464 samples, 0.08%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (289 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-161.5 (584 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (2,808 samples, 0.09%) + + + +go (416 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-32.65 (1,224 samples, 0.04%) + + + +encode (342 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (2,232 samples, 0.07%) + + + +encode (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyZipWith (403 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +natFromBits (336 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +$lambda (9,918 samples, 0.32%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-161.5 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (290 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +map (512 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +polyAdd (275 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (441 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAdd (319 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (476 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +rec (845 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +rec (6,025 samples, 0.19%) + + + +correction (304 samples, 0.01%) + + + +polyPadLeft (295 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-32.65 (780 samples, 0.03%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +elemAdd (22,848 samples, 0.74%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +rec (585 samples, 0.02%) + + + +anon-func-32.65 (2,563 samples, 0.08%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-229.5 (677 samples, 0.02%) + + + +rec (69,669 samples, 2.25%) +rec + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +anon-func-79.3 (510 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-51.11 (1,136 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +rec (1,278 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +rec (969 samples, 0.03%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +interleave (272 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +correction (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +anon-func-68.41 (22,848 samples, 0.74%) + + + +anon-func-481.5 (2,200 samples, 0.07%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (462 samples, 0.01%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +rec (1,062 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-481.5 (357 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +traceCoords (378 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +correction (326 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-435.5 (13,376 samples, 0.43%) + + + +encode (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-161.5 (1,365 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +generate (704 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (1,938 samples, 0.06%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-32.65 (270 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-435.5 (17,888 samples, 0.58%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +go (288 samples, 0.01%) + + + +foldr (624 samples, 0.02%) + + + +anon-func-229.5 (1,548 samples, 0.05%) + + + +encode (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (34,048 samples, 1.10%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (2,754 samples, 0.09%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (271 samples, 0.01%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +anon-func-30.36 (446 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (290 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +interleave (372 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (2,432 samples, 0.08%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (408 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-412.5 (882 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (806 samples, 0.03%) + + + +polyPadLeft (297 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +natZipWith (22,848 samples, 0.74%) + + + +polyDivMod (2,754 samples, 0.09%) + + + +encode (271 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (1,422 samples, 0.05%) + + + +anon-func-30.36 (289 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +rec (5,032 samples, 0.16%) + + + +anon-func-61.36 (1,664 samples, 0.05%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-32.65 (904 samples, 0.03%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (2,448 samples, 0.08%) + + + +encode (338 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-453.5 (496 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (2,634 samples, 0.09%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (280 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (5,696 samples, 0.18%) + + + +rec (651 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-51.11 (323,033 samples, 10.44%) +anon-func-51.11 + + +polyZipWith (1,152 samples, 0.04%) + + + +forIn (377 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (618 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +polyAdd (419 samples, 0.01%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +encode (4,194 samples, 0.14%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (270 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +polyZipWith (832 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +rec (1,955 samples, 0.06%) + + + +encode (3,744 samples, 0.12%) + + + +anon-func-51.11 (880 samples, 0.03%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyPadLeft (342 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +natXor (5,376 samples, 0.17%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-51.11 (495 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (446 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (2,304 samples, 0.07%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +rec (3,145 samples, 0.10%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (271 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-161.5 (2,440 samples, 0.08%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-435.5 (11,232 samples, 0.36%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +rec (2,628 samples, 0.08%) + + + +interleave (12,002 samples, 0.39%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +go (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (285 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +rec (913 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-161.5 (2,240 samples, 0.07%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (377 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-161.5 (2,016 samples, 0.07%) + + + +rec (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-30.36 (442 samples, 0.01%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (624 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (8,640 samples, 0.28%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (595 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-62.5 (39,278 samples, 1.27%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (27,760 samples, 0.90%) + + + +go (272 samples, 0.01%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-38.11 (360 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-48.7 (495 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (400 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +polySub (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +natFromBits (326 samples, 0.01%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (4,745 samples, 0.15%) + + + +encode (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (1,408 samples, 0.05%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +generate (3,029 samples, 0.10%) + + + +interleave (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (12,002 samples, 0.39%) + + + +map (272 samples, 0.01%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-30.36 (2,634 samples, 0.09%) + + + +map (320 samples, 0.01%) + + + +anon-func-48.7 (2,304 samples, 0.07%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyScale (272 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +polySub (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +anon-func-79.3 (99,362 samples, 3.21%) +ano.. + + +correction (1,312 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (2,448 samples, 0.08%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +rec (489 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (290 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polyPadLeft (306 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (2,288 samples, 0.07%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +natZipWith (17,472 samples, 0.56%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +$lambda (306 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyAddTerm (271 samples, 0.01%) + + + +anon-func-79.3 (595 samples, 0.02%) + + + +anon-func-51.11 (1,764 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +encode (374 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-435.5 (3,648 samples, 0.12%) + + + +encode (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (3,720 samples, 0.12%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-32.65 (357 samples, 0.01%) + + + +polyPadLeft (378 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +patternCoords (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +map (676 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (624 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,470 samples, 0.08%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +polyZipWith (505 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (265 samples, 0.01%) + + + +natFromBits (608 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyDivMod (799 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (3,744 samples, 0.12%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyMulTerm (624 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +scale (2,816 samples, 0.09%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (527 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyZipWith (384 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +rec (507 samples, 0.02%) + + + +scale (1,408 samples, 0.05%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (661 samples, 0.02%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +anon-func-435.5 (33,600 samples, 1.09%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +finderCoords (2,112 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (5,355 samples, 0.17%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +rec (682 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +polyAdd (416 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (99,362 samples, 3.21%) +ano.. + + +anon-func-79.3 (290 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +interleave (688 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (618 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +rec (2,898 samples, 0.09%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (575 samples, 0.02%) + + + +rec (680 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (1,000 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +polyDivMod (27,760 samples, 0.90%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-161.5 (137,574 samples, 4.45%) +anon-.. + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (465 samples, 0.02%) + + + +encode (2,250 samples, 0.07%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (6,400 samples, 0.21%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-30.36 (754 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (1,845 samples, 0.06%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-161.5 (672 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (283 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +anon-func-161.5 (774 samples, 0.03%) + + + +go (274 samples, 0.01%) + + + +anon-func-387.7 (378 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyMulTerm (480 samples, 0.02%) + + + +anon-func-161.5 (520 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-453.5 (1,003 samples, 0.03%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-265.5 (850 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (403 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +map (416 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyNew (297 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +natZipWith (22,848 samples, 0.74%) + + + +map (1,312 samples, 0.04%) + + + +generate (1,152 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +foldr (351 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (326 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-265.5 (1,885 samples, 0.06%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (2,754 samples, 0.09%) + + + +anon-func-51.11 (1,040 samples, 0.03%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (5,202 samples, 0.17%) + + + +encode (352 samples, 0.01%) + + + +anon-func-393.5 (330 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +toBlocks (2,304 samples, 0.07%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +pathCoords (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +rec (645 samples, 0.02%) + + + +encode (1,942 samples, 0.06%) + + + +forIn (357 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (468 samples, 0.02%) + + + +polyGrow (270 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +rec (387 samples, 0.01%) + + + +elemFromBits (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-79.3 (290 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-161.5 (344 samples, 0.01%) + + + +rec (1,316 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +toList (1,262 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-38.11 (6,392 samples, 0.21%) + + + +anon-func-79.3 (290 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (462 samples, 0.01%) + + + +rec (767 samples, 0.02%) + + + +anon-func-435.5 (1,232 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (285 samples, 0.01%) + + + +padLeftTo (776 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +rec (737 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-453.5 (1,116 samples, 0.04%) + + + +go (942 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-265.5 (1,375 samples, 0.04%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +toTarget (280 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +map (288 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (1,224 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (702 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-300.5 (419 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +generate (756 samples, 0.02%) + + + +anon-func-30.36 (1,440 samples, 0.05%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-289.5 (704 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +map (468 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (545 samples, 0.02%) + + + +$lambda (532 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (1,062 samples, 0.03%) + + + +rec (1,012 samples, 0.03%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (966 samples, 0.03%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (279 samples, 0.01%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (7,168 samples, 0.23%) + + + +correction (1,120 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-54.15 (99,362 samples, 3.21%) +ano.. + + +interleave (271 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (560 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (523 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +rec (462 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +map (2,312 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyPadRight (325 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (2,288 samples, 0.07%) + + + +anon-func-161.5 (310 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyGrow (403 samples, 0.01%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (2,448 samples, 0.08%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-265.5 (1,105 samples, 0.04%) + + + +polyAdd (306 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +go (688 samples, 0.02%) + + + +correction (306 samples, 0.01%) + + + +natXor (7,392 samples, 0.24%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (510 samples, 0.02%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-51.11 (306 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-244.5 (14,186 samples, 0.46%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyMulTerm (439 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (763 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (4,896 samples, 0.16%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-265.5 (1,514 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (595 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +interleave (3,744 samples, 0.12%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (403 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +scale (1,936 samples, 0.06%) + + + +polyScale (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (880 samples, 0.03%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyAddTerm (270 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyGrow (325 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (1,638 samples, 0.05%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyPadRight (527 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +map (270 samples, 0.01%) + + + +anon-func-38.11 (510 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-161.5 (1,232 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyLen (876 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-453.5 (346 samples, 0.01%) + + + +encode (434 samples, 0.01%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (9,308 samples, 0.30%) + + + +anon-func-79.3 (446 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +$lambda (400 samples, 0.01%) + + + +interleave (575 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +$lambda (640 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (1,768 samples, 0.06%) + + + +interleave (320 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +correction (270 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +go (688 samples, 0.02%) + + + +anon-func-161.5 (472 samples, 0.02%) + + + +encode (2,704 samples, 0.09%) + + + +$lambda (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +elemAdd (24,192 samples, 0.78%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-61.36 (2,304 samples, 0.07%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +anon-func-481.5 (1,750 samples, 0.06%) + + + +encode (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (1,152 samples, 0.04%) + + + +natXor (12,768 samples, 0.41%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (640 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (1,440 samples, 0.05%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +B_mul (13,015 samples, 0.42%) + + + +anon-func-265.5 (1,020 samples, 0.03%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +elemFromBits (316 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-229.5 (1,881 samples, 0.06%) + + + +rec (2,280 samples, 0.07%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-435.5 (30,720 samples, 0.99%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +generate (1,764 samples, 0.06%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +generate (2,496 samples, 0.08%) + + + +interleave (304 samples, 0.01%) + + + +$lambda (462 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-51.11 (8,802 samples, 0.28%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (2,448 samples, 0.08%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-300.5 (618 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-481.5 (1,356 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +rowwise (137,574 samples, 4.45%) +rowwise + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-48.7 (289 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-453.5 (806 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +polyAdd (304 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +toList (581 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (22,848 samples, 0.74%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-161.5 (1,024 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +rec (403 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (8,512 samples, 0.28%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (510 samples, 0.02%) + + + +anon-func-161.5 (1,170 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyPadRight (429 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (283 samples, 0.01%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +polyAdd (1,376 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (3,168 samples, 0.10%) + + + +anon-func-393.5 (312 samples, 0.01%) + + + +polyGrow (403 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +revAppend (157,212 samples, 5.08%) +revApp.. + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (465 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyMulTerm (384 samples, 0.01%) + + + +polyMulTerm (384 samples, 0.01%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-300.5 (12,002 samples, 0.39%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (440 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,989 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (781 samples, 0.03%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (306 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-412.5 (527 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (556 samples, 0.02%) + + + +rec (4,015 samples, 0.13%) + + + +polyAdd (512 samples, 0.02%) + + + +padLeftTo (413 samples, 0.01%) + + + +anon-func-453.5 (2,235 samples, 0.07%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +polyScale (384 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +go (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-51.11 (904 samples, 0.03%) + + + +polyAdd (544 samples, 0.02%) + + + +formatCoords (381 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +polyAdd (1,312 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +rec (595 samples, 0.02%) + + + +anon-func-481.5 (488 samples, 0.02%) + + + +anon-func-48.7 (271 samples, 0.01%) + + + +anon-func-300.5 (2,210 samples, 0.07%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyPadLeft (414 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (5,202 samples, 0.17%) + + + +encode (1,120 samples, 0.04%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (286 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +elemAdd (55,104 samples, 1.78%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +anon-func-435.5 (9,984 samples, 0.32%) + + + +encode (288 samples, 0.01%) + + + +natToBytes (13,440 samples, 0.43%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +encode (442 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-48.7 (317 samples, 0.01%) + + + +interleave (317 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyAddTerm (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +polyZipWith (8,704 samples, 0.28%) + + + +encode (527 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (29,536 samples, 0.96%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-393.5 (1,683 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +go (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-265.5 (280 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAddTerm (532 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +go (352 samples, 0.01%) + + + +polyAdd (297 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polySub (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-265.5 (345 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAddTerm (489 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +$lambda (832 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (14,992 samples, 0.48%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-30.36 (5,202 samples, 0.17%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +rec (1,373 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +interleave (3,580 samples, 0.12%) + + + +polyZipWith (378 samples, 0.01%) + + + +polyGrow (558 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +rec (342 samples, 0.01%) + + + +pathCoords (2,563 samples, 0.08%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (310 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +rec (1,008 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +rec (741 samples, 0.02%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +polyScale (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (6,705 samples, 0.22%) + + + +anon-func-265.5 (645 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (2,304 samples, 0.07%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-51.11 (964 samples, 0.03%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-48.7 (274 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (476 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +correction (1,440 samples, 0.05%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +generate (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (15,808 samples, 0.51%) + + + +correction (496 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +interleave (270 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (1,024 samples, 0.03%) + + + +anon-func-51.11 (374 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +encode (304 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (1,408 samples, 0.05%) + + + +go (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,768 samples, 0.06%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (489 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-435.5 (5,280 samples, 0.17%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-48.7 (2,448 samples, 0.08%) + + + +polySub (688 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +traceCoords (462 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +patternCoords (832 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +interleave (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyScale (480 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (270 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (290 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-54.15 (137,574 samples, 4.45%) +anon-.. + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +rec (1,683 samples, 0.05%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +finderCoords (704 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (319 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +polyZipWith (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (338 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (274 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +polyPadLeft (351 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (4,680 samples, 0.15%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (8,780 samples, 0.28%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +rec (4,644 samples, 0.15%) + + + +encode (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (1,683 samples, 0.05%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-435.5 (23,104 samples, 0.75%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (1,040 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (445 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (429 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (468 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-51.11 (465 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-30.36 (532 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-161.5 (473 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +pathCoords (1,152 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +anon-func-435.5 (14,784 samples, 0.48%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-79.3 (604 samples, 0.02%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyPadLeft (558 samples, 0.02%) + + + +anon-func-79.3 (800 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (546 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (1,890 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +natToBytes (10,752 samples, 0.35%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +flatten (8,780 samples, 0.28%) + + + +correction (1,120 samples, 0.04%) + + + +polyMulTerm (290 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (2,754 samples, 0.09%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +next (4,709 samples, 0.15%) + + + +map (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +polyAdd (352 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (652 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +anon-func-393.5 (515 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (619 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-32.65 (2,646 samples, 0.09%) + + + +rec (3,330 samples, 0.11%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +polyAdd (465 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (14,560 samples, 0.47%) + + + +encode (624 samples, 0.02%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +encode (688 samples, 0.02%) + + + +polyDivMod (480 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAdd (527 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (1,768 samples, 0.06%) + + + +anon-func-161.5 (1,836 samples, 0.06%) + + + +encode (416 samples, 0.01%) + + + +encode (368 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-481.5 (400 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +rec (649 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +natXor (80,640 samples, 2.61%) +na.. + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +map (517 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (484 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +interleave (2,250 samples, 0.07%) + + + +correction (416 samples, 0.01%) + + + +$lambda (1,024 samples, 0.03%) + + + +anon-func-393.5 (980 samples, 0.03%) + + + +anon-func-435.5 (47,776 samples, 1.54%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-161.5 (493 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-265.5 (525 samples, 0.02%) + + + +encode (286 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAddTerm (496 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +map (618 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +interleave (2,312 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (299 samples, 0.01%) + + + +go (512 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +finderCoords (8,130 samples, 0.26%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +rec (432 samples, 0.01%) + + + +anon-func-161.5 (1,056 samples, 0.03%) + + + +$lambda (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +rec (1,240 samples, 0.04%) + + + +polyAdd (1,120 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +map (2,288 samples, 0.07%) + + + +encode (272 samples, 0.01%) + + + +anon-func-161.5 (1,892 samples, 0.06%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-393.5 (685 samples, 0.02%) + + + +anon-func-435.5 (9,984 samples, 0.32%) + + + +correction (352 samples, 0.01%) + + + +go (270 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (325 samples, 0.01%) + + + +correction (384 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-393.5 (396 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +encode (2,304 samples, 0.07%) + + + +anon-func-48.7 (810 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +generate (3,456 samples, 0.11%) + + + +polyAddTerm (304 samples, 0.01%) + + + +rec (565 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (3,580 samples, 0.12%) + + + +encode (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (850 samples, 0.03%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +errorPoly (328 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (930 samples, 0.03%) + + + +anon-func-393.5 (306 samples, 0.01%) + + + +anon-func-481.5 (464 samples, 0.02%) + + + +anon-func-30.36 (468 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +elemAdd (5,376 samples, 0.17%) + + + +anon-func-265.5 (745 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +interleave (468 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAdd (561 samples, 0.02%) + + + +patternCoords (3,456 samples, 0.11%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-393.5 (663 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (1,989 samples, 0.06%) + + + +anon-func-30.36 (3,382 samples, 0.11%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (289 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +$lambda (137,574 samples, 4.45%) +$lambda + + +formatCoords (606 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +generate (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyAdd (1,120 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +polyAdd (1,376 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +polyZipWith (688 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-161.5 (2,184 samples, 0.07%) + + + +patternCoords (810 samples, 0.03%) + + + +anon-func-412.5 (455 samples, 0.01%) + + + +$lambda (361 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +polyGrow (299 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +generate (270 samples, 0.01%) + + + +anon-func-435.5 (25,536 samples, 0.83%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +rec (271 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-404.5 (968 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-481.5 (1,960 samples, 0.06%) + + + +anon-func-481.5 (308 samples, 0.01%) + + + +anon-func-48.7 (638 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +natFromBits (336 samples, 0.01%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-30.36 (434 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-51.11 (652 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +go (384 samples, 0.01%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +$lambda (5,355 samples, 0.17%) + + + +polyNew (405 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +anon-func-79.3 (1,326 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-161.5 (480 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +interleave (2,304 samples, 0.07%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +toBlocks (280 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +encode (2,704 samples, 0.09%) + + + +correction (270 samples, 0.01%) + + + +anon-func-30.36 (27,760 samples, 0.90%) + + + +anon-func-62.5 (133,707 samples, 4.32%) +anon-.. + + +interleave (272 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (3,029 samples, 0.10%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +go (1,683 samples, 0.05%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (23,104 samples, 0.75%) + + + +interleave (1,312 samples, 0.04%) + + + +polyAdd (1,376 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (4,464 samples, 0.14%) + + + +map (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (270 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +encode (2,646 samples, 0.09%) + + + +anon-func-30.36 (400 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +map (12,816 samples, 0.41%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +rec (2,368 samples, 0.08%) + + + +interleave (1,024 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyScale (480 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +encode (441 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-44.5 (40,645 samples, 1.31%) + + + +go (688 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-161.5 (3,484 samples, 0.11%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +scale (1,408 samples, 0.05%) + + + +elemFromBits (608 samples, 0.02%) + + + +anon-func-38.11 (271 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +rec (880 samples, 0.03%) + + + +$lambda (850 samples, 0.03%) + + + +polyAdd (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (5,008 samples, 0.16%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +elemAdd (1,344 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (706 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (1,920 samples, 0.06%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +interleave (496 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +revAppend (96,074 samples, 3.11%) +rev.. + + +correction (320 samples, 0.01%) + + + +anon-func-48.7 (5,696 samples, 0.18%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-453.5 (413 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +correction (676 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +natXor (17,472 samples, 0.56%) + + + +polyZipWith (576 samples, 0.02%) + + + +rec (1,115 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +map (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (360 samples, 0.01%) + + + +anon-func-51.11 (1,989 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +anon-func-48.7 (806 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (279 samples, 0.01%) + + + +anon-func-79.3 (323,033 samples, 10.44%) +anon-func-79.3 + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (2,989 samples, 0.10%) + + + +$lambda (320 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-481.5 (986 samples, 0.03%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (1,440 samples, 0.05%) + + + +anon-func-435.5 (48,640 samples, 1.57%) + + + +map (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +rec (968 samples, 0.03%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-435.5 (13,312 samples, 0.43%) + + + +foldr (1,472 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-79.3 (645 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-393.5 (771 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +anon-func-300.5 (5,202 samples, 0.17%) + + + +polySub (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-161.5 (1,326 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-61.36 (810 samples, 0.03%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-393.5 (515 samples, 0.02%) + + + +anon-func-481.5 (296 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (704 samples, 0.02%) + + + +anon-func-435.5 (16,512 samples, 0.53%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +polyPadLeft (333 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyGrow (486 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (496 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +formatCoords (270 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (3,456 samples, 0.11%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +rec (12,957 samples, 0.42%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-412.5 (957 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (280 samples, 0.01%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +map (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +map (306 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (271 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-289.5 (157,212 samples, 5.08%) +anon-f.. + + +map (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +anon-func-79.3 (664 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +formatCoords (270 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +map (320 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +polySub (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +map (3,744 samples, 0.12%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyZipWith (512 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-453.5 (1,116 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (289 samples, 0.01%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +interleave (1,040 samples, 0.03%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polySub (304 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-393.5 (533 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +toListWithLength (664 samples, 0.02%) + + + +anon-func-481.5 (427 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rec (895 samples, 0.03%) + + + +polyZipWith (835 samples, 0.03%) + + + +$lambda (1,120 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (326 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +anon-func-79.3 (676 samples, 0.02%) + + + +correction (6,392 samples, 0.21%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-92.40 (2,518 samples, 0.08%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +encode (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-494.5 (275 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +polyGrow (1,088 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-30.36 (290 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-481.5 (350 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyPadLeft (1,107 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +rec (952 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (351 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (360 samples, 0.01%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (858 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +rec (1,065 samples, 0.03%) + + + +rec (1,970 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +go (489 samples, 0.02%) + + + +encode (661 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,992 samples, 0.10%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (698 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +rec (309 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-393.5 (527 samples, 0.02%) + + + +anon-func-265.5 (680 samples, 0.02%) + + + +anon-func-161.5 (1,621 samples, 0.05%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +rec (738 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-30.36 (439 samples, 0.01%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +anon-func-481.5 (580 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +correction (6,392 samples, 0.21%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-481.5 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (560 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-32.65 (1,764 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-265.5 (1,495 samples, 0.05%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (3,744 samples, 0.12%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (760 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (265 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (2,176 samples, 0.07%) + + + +encode (416 samples, 0.01%) + + + +anon-func-265.5 (560 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polyAdd (527 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (320 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +rec (325 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +toList (609 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +interleave (272 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyMulTerm (688 samples, 0.02%) + + + +anon-func-412.5 (875 samples, 0.03%) + + + +correction (688 samples, 0.02%) + + + +natZipWith (22,848 samples, 0.74%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-412.5 (324 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +natZipWith (8,736 samples, 0.28%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +anon-func-30.36 (972 samples, 0.03%) + + + +go (320 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyAdd (409 samples, 0.01%) + + + +interleave (625 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +finderCoords (342 samples, 0.01%) + + + +polyAddTerm (3,008 samples, 0.10%) + + + +anon-func-79.3 (1,496 samples, 0.05%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +encode (850 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (1,768 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +rec (396 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-161.5 (5,280 samples, 0.17%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +natXor (24,192 samples, 0.78%) + + + +anon-func-300.5 (1,224 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (137,574 samples, 4.45%) +anon-.. + + +correction (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +correction (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-453.5 (2,065 samples, 0.07%) + + + +interleave (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polySub (544 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +$lambda (2,630 samples, 0.09%) + + + +anon-func-435.5 (1,824 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (18,368 samples, 0.59%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (465 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyNew (324 samples, 0.01%) + + + +encode (12,816 samples, 0.41%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +rec (612 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (1,408 samples, 0.05%) + + + +anon-func-54.15 (1,224 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-481.5 (312 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (2,754 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +rec (1,921 samples, 0.06%) + + + +correction (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (8,130 samples, 0.26%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyDivMod (480 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +interleave (1,024 samples, 0.03%) + + + +polySub (575 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +$lambda (368 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-161.5 (640 samples, 0.02%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (604 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +rec (7,293 samples, 0.24%) + + + +correction (618 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +$lambda (1,786 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +rec (290 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +go (288 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +patternCoords (3,456 samples, 0.11%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (2,644 samples, 0.09%) + + + +rec (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +elemAdd (10,752 samples, 0.35%) + + + +anon-func-161.5 (284 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (688 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (378 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (3,580 samples, 0.12%) + + + +elemAdd (51,072 samples, 1.65%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +rec (15,858 samples, 0.51%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +polyGrow (403 samples, 0.01%) + + + +anon-func-54.15 (357 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +$lambda (2,288 samples, 0.07%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (604 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +pathCoords (462 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +anon-func-300.5 (2,592 samples, 0.08%) + + + +anon-func-393.5 (403 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (8,448 samples, 0.27%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-161.5 (1,568 samples, 0.05%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +natXor (14,784 samples, 0.48%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (640 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (3,580 samples, 0.12%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +rec (417 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +go (2,754 samples, 0.09%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-161.5 (4,194 samples, 0.14%) + + + +encode (288 samples, 0.01%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-453.5 (1,003 samples, 0.03%) + + + +rec (1,898 samples, 0.06%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyScale (624 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (306 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyZipWith (378 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-412.5 (297 samples, 0.01%) + + + +anon-func-481.5 (432 samples, 0.01%) + + + +polyScale (624 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +encode (8,802 samples, 0.28%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +rec (1,098 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +pathCoords (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (2,288 samples, 0.07%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +polyAdd (304 samples, 0.01%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +rec (957 samples, 0.03%) + + + +polyScale (384 samples, 0.01%) + + + +flatten (3,744 samples, 0.12%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (289 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +map (484 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +rec (629 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +rec (425 samples, 0.01%) + + + +anon-func-161.5 (475 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-453.5 (496 samples, 0.02%) + + + +anon-func-48.7 (4,194 samples, 0.14%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (12,816 samples, 0.41%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-161.5 (2,080 samples, 0.07%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (5,454 samples, 0.18%) + + + +anon-func-30.36 (317 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (29,408 samples, 0.95%) + + + +anon-func-481.5 (1,037 samples, 0.03%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (2,704 samples, 0.09%) + + + +interleave (688 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyDivMod (400 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +rec (2,070 samples, 0.07%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +rec (324 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +rec (737 samples, 0.02%) + + + +to_2_tuple (226,732 samples, 7.33%) +to_2_tuple + + +anon-func-453.5 (3,596 samples, 0.12%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (2,016 samples, 0.07%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +finderTLCoords (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (528 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (5,355 samples, 0.17%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +next (3,130 samples, 0.10%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (760 samples, 0.02%) + + + +rec (2,142 samples, 0.07%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +map (322 samples, 0.01%) + + + +anon-func-51.11 (1,664 samples, 0.05%) + + + +correction (384 samples, 0.01%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +encode (1,120 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +natZipWith (51,072 samples, 1.65%) + + + +pathCoords (4,466 samples, 0.14%) + + + +rec (1,261 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (1,845 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (960 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (2,808 samples, 0.09%) + + + +patternCoords (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-161.5 (731 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +anon-func-481.5 (406 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-453.5 (871 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (532 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (289 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-393.5 (507 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +encode (625 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-453.5 (1,044 samples, 0.03%) + + + +pathCoords (832 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +encode (384 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (2,223 samples, 0.07%) + + + +polyGrow (640 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (2,448 samples, 0.08%) + + + +anon-func-161.5 (312 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +polyPadLeft (1,333 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +natToBytes (5,376 samples, 0.17%) + + + +$lambda (608 samples, 0.02%) + + + +rec (540 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (414 samples, 0.01%) + + + +polyLen (42,381 samples, 1.37%) + + + +anon-func-30.36 (340 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (459 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (8,739 samples, 0.28%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (294 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (338 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (1,024 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-32.65 (3,029 samples, 0.10%) + + + +anon-func-300.5 (312 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +rec (3,172 samples, 0.10%) + + + +polyAdd (1,088 samples, 0.04%) + + + +encode (1,920 samples, 0.06%) + + + +correction (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (546 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (12,816 samples, 0.41%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (2,448 samples, 0.08%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-161.5 (8,840 samples, 0.29%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (441 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (274 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-161.5 (4,824 samples, 0.16%) + + + +correction (304 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (270 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +natFromBits (688 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-48.7 (342 samples, 0.01%) + + + +anon-func-161.5 (1,904 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-54.15 (1,764 samples, 0.06%) + + + +go (624 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-481.5 (280 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (270 samples, 0.01%) + + + +anon-func-48.7 (342 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (810 samples, 0.03%) + + + +encode (320 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +pathCoords (381 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (606 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (323,033 samples, 10.44%) +anon-func-79.3 + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (316 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +elemAdd (5,376 samples, 0.17%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-32.65 (1,152 samples, 0.04%) + + + +$lambda (372 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (2,226 samples, 0.07%) + + + +anon-func-161.5 (640 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyAddTerm (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +correction (1,040 samples, 0.03%) + + + +anon-func-79.3 (5,355 samples, 0.17%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +rec (824 samples, 0.03%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +map (285 samples, 0.01%) + + + +anon-func-51.11 (12,002 samples, 0.39%) + + + +go (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (3,032 samples, 0.10%) + + + +anon-func-32.65 (364 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (271 samples, 0.01%) + + + +$lambda (462 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (2,624 samples, 0.08%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyGrow (342 samples, 0.01%) + + + +interleave (285 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (3,058 samples, 0.10%) + + + +$lambda (608 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-435.5 (6,688 samples, 0.22%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-412.5 (649 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (1,683 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (14,992 samples, 0.48%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +correction (1,024 samples, 0.03%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (3,872 samples, 0.13%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +rec (2,091 samples, 0.07%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-300.5 (2,754 samples, 0.09%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (342 samples, 0.01%) + + + +anon-func-51.11 (8,086 samples, 0.26%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +encode (5,398 samples, 0.17%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-265.5 (1,350 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-453.5 (806 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (272 samples, 0.01%) + + + +rec (112,642 samples, 3.64%) +rec + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +rec (1,111 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +generate (3,032 samples, 0.10%) + + + +polyScale (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (280 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-54.15 (3,029 samples, 0.10%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +encode (323,033 samples, 10.44%) +encode + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +anon-func-412.5 (495 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +go (12,104 samples, 0.39%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (1,408 samples, 0.05%) + + + +anon-func-51.11 (271 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +encode (756 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +rec (1,717 samples, 0.06%) + + + +correction (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (3,808 samples, 0.12%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +pathCoords (810 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyGrow (295 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +rec (2,990 samples, 0.10%) + + + +rec (1,221 samples, 0.04%) + + + +correction (272 samples, 0.01%) + + + +rec (640 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +polySub (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (2,448 samples, 0.08%) + + + +polyDivMod (416 samples, 0.01%) + + + +rec (624 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (1,764 samples, 0.06%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (9,808 samples, 0.32%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +interleave (480 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +rec (543 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (23,392 samples, 0.76%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +rec (945 samples, 0.03%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (273 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (2,448 samples, 0.08%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-412.5 (833 samples, 0.03%) + + + +rec (12,753 samples, 0.41%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (278 samples, 0.01%) + + + +encode (384 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyAdd (1,120 samples, 0.04%) + + + +core::str::converts::from_utf8::hbc4c752be9502b18 (265 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +finderCoords (1,152 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +padLeftTo (1,649 samples, 0.05%) + + + +polyAdd (1,152 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +$lambda (446 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +rec (1,716 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +$lambda (2,704 samples, 0.09%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (300 samples, 0.01%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +rec (864 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-38.11 (285 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +polyAdd (832 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (357 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +rec (918 samples, 0.03%) + + + +polyAdd (270 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (780 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +encode (484 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +encode (5,355 samples, 0.17%) + + + +polyPadRight (391 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-481.5 (1,890 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-229.5 (810 samples, 0.03%) + + + +anon-func-244.5 (157,212 samples, 5.08%) +anon-f.. + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +anon-func-435.5 (16,096 samples, 0.52%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (760 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (4,760 samples, 0.15%) + + + +encode (304 samples, 0.01%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +polySub (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +map (2,704 samples, 0.09%) + + + +pathCoords (3,456 samples, 0.11%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-54.15 (4,194 samples, 0.14%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +map (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-161.5 (4,194 samples, 0.14%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-161.5 (3,543 samples, 0.11%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (1,440 samples, 0.05%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (1,972 samples, 0.06%) + + + +anon-func-161.5 (896 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +correction (624 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-481.5 (3,478 samples, 0.11%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (8,448 samples, 0.27%) + + + +sleb128_decode (2,349 samples, 0.08%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +scale (2,992 samples, 0.10%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (663 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-265.5 (1,705 samples, 0.06%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-161.5 (2,720 samples, 0.09%) + + + +$lambda (272 samples, 0.01%) + + + +correction (480 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +rec (917 samples, 0.03%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +interleave (624 samples, 0.02%) + + + +generate (704 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (560 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +map (338 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (516 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +rec (611 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-48.7 (8,086 samples, 0.26%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (270 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (400 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (5,728 samples, 0.19%) + + + +map (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +step (351 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +finderCoords (832 samples, 0.03%) + + + +polyAdd (19,584 samples, 0.63%) + + + +polyDivMod (272 samples, 0.01%) + + + +rec (3,223 samples, 0.10%) + + + +interleave (446 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (4,466 samples, 0.14%) + + + +anon-func-412.5 (312 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (322 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (760 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-453.5 (330 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-481.5 (448 samples, 0.01%) + + + +anon-func-265.5 (1,045 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-51.11 (517 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-481.5 (464 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (3,008 samples, 0.10%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +rec (23,351 samples, 0.76%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-453.5 (682 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +rec (2,466 samples, 0.08%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +rec (1,215 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (341 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +$lambda (1,000 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +natZipWith (5,376 samples, 0.17%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyScale (400 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-265.5 (585 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +correction (403 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (3,744 samples, 0.12%) + + + +anon-func-32.65 (3,456 samples, 0.11%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (1,530 samples, 0.05%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-435.5 (10,336 samples, 0.33%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +go (624 samples, 0.02%) + + + +rec (888 samples, 0.03%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +encode (810 samples, 0.03%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +rec (1,391 samples, 0.04%) + + + +polyMulTerm (271 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyPadLeft (351 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +encode (340 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-92.40 (376 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-161.5 (3,520 samples, 0.11%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (2,288 samples, 0.07%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +polyZipWith (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAddTerm (290 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-54.15 (1,638 samples, 0.05%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +rec (1,035 samples, 0.03%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +map (400 samples, 0.01%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +finderCoords (3,456 samples, 0.11%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (1,920 samples, 0.06%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (5,411 samples, 0.17%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-435.5 (1,824 samples, 0.06%) + + + +interleave (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +anon-func-481.5 (867 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (360 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-393.5 (472 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-54.15 (84,073 samples, 2.72%) +an.. + + +map (1,024 samples, 0.03%) + + + +map (1,216 samples, 0.04%) + + + +pathCoords (364 samples, 0.01%) + + + +$lambda (273 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (272 samples, 0.01%) + + + +anon-func-265.5 (360 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (640 samples, 0.02%) + + + +interleave (2,448 samples, 0.08%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,200 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +natXor (2,016 samples, 0.07%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-481.5 (628 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (528 samples, 0.02%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (780 samples, 0.03%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natXor (17,475 samples, 0.57%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +encode (4,760 samples, 0.15%) + + + +anon-func-51.11 (468 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (618 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +opt_project (397,161 samples, 12.84%) +opt_project + + +go (1,120 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (527 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +motoko_rts::idl::parse_fields::h16db5574f7c8c078 (429 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-412.5 (630 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +interleave (556 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (961 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +anon-func-300.5 (5,508 samples, 0.18%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +go (403 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +interleave (289 samples, 0.01%) + + + +anon-func-161.5 (1,664 samples, 0.05%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (290 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +rec (2,405 samples, 0.08%) + + + +polyAddTerm (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-453.5 (413 samples, 0.01%) + + + +anon-func-435.5 (25,056 samples, 0.81%) + + + +go (419 samples, 0.01%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +$lambda (6,392 samples, 0.21%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +polyAdd (832 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +encode (342 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +$lambda (544 samples, 0.02%) + + + +rec (1,032 samples, 0.03%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (446 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (489 samples, 0.02%) + + + +polyMulTerm (510 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (1,786 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (472 samples, 0.02%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +correction (361 samples, 0.01%) + + + +map (271 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (5,696 samples, 0.18%) + + + +polySub (270 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (10,149 samples, 0.33%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyOrder (324 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-161.5 (1,632 samples, 0.05%) + + + +polyZipWith (832 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-393.5 (1,566 samples, 0.05%) + + + +encode (2,288 samples, 0.07%) + + + +polySub (544 samples, 0.02%) + + + +interleave (5,008 samples, 0.16%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (480 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +encode (27,760 samples, 0.90%) + + + +finderCoords (2,646 samples, 0.09%) + + + +encode (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (517 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (55,104 samples, 1.78%) + + + +anon-func-68.41 (5,376 samples, 0.17%) + + + +encode (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (322 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +anon-func-161.5 (3,456 samples, 0.11%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +init (815 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyGrow (297 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (704 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyZipWith (403 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (800 samples, 0.03%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +encode (729 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (5,984 samples, 0.19%) + + + +anon-func-481.5 (3,132 samples, 0.10%) + + + +map (384 samples, 0.01%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +polyPadRight (377 samples, 0.01%) + + + +rec (1,023 samples, 0.03%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +correction (688 samples, 0.02%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-161.5 (2,244 samples, 0.07%) + + + +rec (898 samples, 0.03%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-32.65 (495 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (5,376 samples, 0.17%) + + + +anon-func-161.5 (1,848 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +rec (1,428 samples, 0.05%) + + + +anon-func-54.15 (137,574 samples, 4.45%) +anon-.. + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-412.5 (900 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAddTerm (608 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +anon-func-51.11 (2,288 samples, 0.07%) + + + +interleave (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-54.15 (3,456 samples, 0.11%) + + + +interleave (270 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-300.5 (1,428 samples, 0.05%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-161.5 (323,033 samples, 10.44%) +anon-func-161.5 + + +rec (1,212 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-30.36 (595 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +encode (364 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +finderCoords (3,456 samples, 0.11%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (6,832 samples, 0.22%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +anon-func-435.5 (44,099 samples, 1.43%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-48.7 (1,040 samples, 0.03%) + + + +polyMulTerm (341 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (289 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +encode (3,032 samples, 0.10%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (5,696 samples, 0.18%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-32.65 (2,563 samples, 0.08%) + + + +anon-func-51.11 (283 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-265.5 (295 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-161.5 (512 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +generate (270 samples, 0.01%) + + + +anon-func-48.7 (290 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +map (434 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (671 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +polyAdd (1,216 samples, 0.04%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +patternCoords (2,563 samples, 0.08%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-412.5 (374 samples, 0.01%) + + + +go (480 samples, 0.02%) + + + +natToBytes (17,472 samples, 0.56%) + + + +polyLeadCoeff (306 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,550 samples, 0.05%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyZipWith (304 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (2,250 samples, 0.07%) + + + +polyAdd (2,240 samples, 0.07%) + + + +natToBits (3,363 samples, 0.11%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +correction (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +$lambda (3,382 samples, 0.11%) + + + +go (286 samples, 0.01%) + + + +traceCoords (84,073 samples, 2.72%) +tr.. + + +map (288 samples, 0.01%) + + + +encode (273 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-161.5 (284 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (270 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (1,024 samples, 0.03%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-300.5 (3,008 samples, 0.10%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +elemAdd (22,848 samples, 0.74%) + + + +anon-func-92.40 (1,400 samples, 0.05%) + + + +anon-func-48.7 (289 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +pathCoords (273 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (810 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-453.5 (358 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (756 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (399 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +interleave (289 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +encode (9,918 samples, 0.32%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-229.5 (2,542 samples, 0.08%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-161.5 (867 samples, 0.03%) + + + +anon-func-161.5 (512 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (1,055 samples, 0.03%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-161.5 (3,388 samples, 0.11%) + + + +rec (535 samples, 0.02%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +anon-func-300.5 (2,312 samples, 0.07%) + + + +polyAddTerm (544 samples, 0.02%) + + + +rec (828 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-494.5 (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (575 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +B_le (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (286 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyMulTerm (434 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +natXor (28,896 samples, 0.93%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (434 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (2,304 samples, 0.07%) + + + +map (416 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (601 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +init (372 samples, 0.01%) + + + +anon-func-481.5 (3,638 samples, 0.12%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (275 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +polyMulTerm (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +interleave (1,024 samples, 0.03%) + + + +map (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (285 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (12,002 samples, 0.39%) + + + +interleave (304 samples, 0.01%) + + + +generate (904 samples, 0.03%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (9,808 samples, 0.32%) + + + +rec (1,183 samples, 0.04%) + + + +generate (495 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +rec (11,817 samples, 0.38%) + + + +$lambda (358 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +toTarget (640 samples, 0.02%) + + + +anon-func-481.5 (2,900 samples, 0.09%) + + + +elemFromBits (288 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-161.5 (5,440 samples, 0.18%) + + + +anon-func-161.5 (2,048 samples, 0.07%) + + + +correction (576 samples, 0.02%) + + + +rec (1,952 samples, 0.06%) + + + +interleave (688 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +rec (4,302 samples, 0.14%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-387.7 (315 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyPadLeft (527 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +scale (3,520 samples, 0.11%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +anon-func-79.3 (341 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +map (326 samples, 0.01%) + + + +finderCoords (3,456 samples, 0.11%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (137,574 samples, 4.45%) +anon-.. + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyPadLeft (342 samples, 0.01%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-48.7 (4,194 samples, 0.14%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +anon-func-30.36 (338 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-161.5 (3,456 samples, 0.11%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +polyAdd (704 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +interleave (306 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (512 samples, 0.02%) + + + +rec (527 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (464 samples, 0.02%) + + + +anon-func-48.7 (2,704 samples, 0.09%) + + + +anon-func-265.5 (1,170 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +compacting_gc (20,267 samples, 0.66%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +traceCoords (462 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +anon-func-393.5 (956 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyOrder (5,390 samples, 0.17%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (3,008 samples, 0.10%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (338 samples, 0.01%) + + + +anon-func-265.5 (360 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-161.5 (731 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-453.5 (370 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +anon-func-32.65 (273 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +correction (272 samples, 0.01%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +$lambda (6,768 samples, 0.22%) + + + +anon-func-30.36 (271 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (532 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (4,266 samples, 0.14%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +generate (462 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (846 samples, 0.03%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (1,764 samples, 0.06%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +anon-func-265.5 (845 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-481.5 (378 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (270 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +rec (1,544 samples, 0.05%) + + + +correction (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +natToBits (3,186 samples, 0.10%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-54.15 (8,086 samples, 0.26%) + + + +encode (416 samples, 0.01%) + + + +rec (265 samples, 0.01%) + + + +polyGrow (378 samples, 0.01%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (306 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (289 samples, 0.01%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +pathCoords (832 samples, 0.03%) + + + +anon-func-161.5 (312 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +go (1,312 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-26.5 (1,405 samples, 0.05%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +toTarget (1,520 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +rec (2,178 samples, 0.07%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyMulTerm (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +toList (522 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +encode (2,226 samples, 0.07%) + + + +encode (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +toList (1,105 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (1,080 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (1,360 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +rec (464 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (400 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (439 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +rec (702 samples, 0.02%) + + + +interleave (2,448 samples, 0.08%) + + + +polySub (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-265.5 (4,594 samples, 0.15%) + + + +polyOrder (2,772 samples, 0.09%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +rec (490 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-32.65 (1,786 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +natFromBits (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +rec (2,345 samples, 0.08%) + + + +map (304 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (2,496 samples, 0.08%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (296 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +encode (326 samples, 0.01%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +anon-func-161.5 (2,728 samples, 0.09%) + + + +interleave (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (604 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-161.5 (2,288 samples, 0.07%) + + + +anon-func-300.5 (4,760 samples, 0.15%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +pathCoords (3,456 samples, 0.11%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (3,200 samples, 0.10%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +encode (1,224 samples, 0.04%) + + + +anon-func-161.5 (7,344 samples, 0.24%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (338 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +toBlocks (1,000 samples, 0.03%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +correction (576 samples, 0.02%) + + + +natFromBytes (5,376 samples, 0.17%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (15,808 samples, 0.51%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-435.5 (34,112 samples, 1.10%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (364 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-161.5 (465 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +encode (273 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (1,430 samples, 0.05%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (1,598 samples, 0.05%) + + + +anon-func-435.5 (6,688 samples, 0.22%) + + + +polyZipWith (744 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +correction (880 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +go (304 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +rec (867 samples, 0.03%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (810 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-161.5 (585 samples, 0.02%) + + + +correction (1,024 samples, 0.03%) + + + +polyPadLeft (270 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (1,376 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (8,780 samples, 0.28%) + + + +polyAdd (832 samples, 0.03%) + + + +patternCoords (832 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +polyGrow (849 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (2,754 samples, 0.09%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (2,304 samples, 0.07%) + + + +go (352 samples, 0.01%) + + + +polyTrim (468 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (598 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +rec (17,712 samples, 0.57%) + + + +correction (1,024 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (485 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (1,008 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +flatten (1,326 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +rec (3,456 samples, 0.11%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +range (468 samples, 0.02%) + + + +finderCoords (1,764 samples, 0.06%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (1,224 samples, 0.04%) + + + +polyZipWith (688 samples, 0.02%) + + + +anon-func-30.36 (8,780 samples, 0.28%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +rec (680 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (575 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +encode (1,024 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +map (465 samples, 0.02%) + + + +anon-func-48.7 (476 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (760 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +pathCoords (381 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +natXor (10,752 samples, 0.35%) + + + +map (608 samples, 0.02%) + + + +correction (274 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (4,760 samples, 0.15%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +rec (1,784 samples, 0.06%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (799 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (2,754 samples, 0.09%) + + + +map (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (595 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-404.5 (352 samples, 0.01%) + + + +correction (1,989 samples, 0.06%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-435.5 (46,080 samples, 1.49%) + + + +anon-func-38.11 (289 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (2,080 samples, 0.07%) + + + +anon-func-161.5 (767 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-412.5 (585 samples, 0.02%) + + + +$lambda (338 samples, 0.01%) + + + +polyAdd (273 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +pathCoords (441 samples, 0.01%) + + + +anon-func-38.11 (271 samples, 0.01%) + + + +anon-func-32.65 (4,194 samples, 0.14%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (364 samples, 0.01%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (424 samples, 0.01%) + + + +anon-func-265.5 (1,170 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +natZipWith (10,752 samples, 0.35%) + + + +map (544 samples, 0.02%) + + + +patternCoords (832 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-265.5 (445 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +anon-func-32.65 (342 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +rec (928 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +encode (270 samples, 0.01%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-161.5 (655 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyDivMod (480 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-412.5 (1,339 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (3,580 samples, 0.12%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (403 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-265.5 (765 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-161.5 (1,365 samples, 0.04%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +map (306 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-161.5 (381 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (7,840 samples, 0.25%) + + + +polyMulTerm (272 samples, 0.01%) + + + +generate (1,152 samples, 0.04%) + + + +anon-func-435.5 (18,240 samples, 0.59%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +correction (320 samples, 0.01%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +rec (473 samples, 0.02%) + + + +anon-func-30.36 (12,816 samples, 0.41%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (372 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +rec (578 samples, 0.02%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +interleave (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +correction (304 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +rec (735 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +flatten (2,634 samples, 0.09%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyAddTerm (403 samples, 0.01%) + + + +rec (871 samples, 0.03%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +alloc_size<5>_tag<11> (11,131 samples, 0.36%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-300.5 (271 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +correction (270 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-244.5 (3,168 samples, 0.10%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (537 samples, 0.02%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (360 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-300.5 (271 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +rec (15,964 samples, 0.52%) + + + +$lambda (272 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +interleave (286 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +rec (351 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (290 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAdd (591 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +encode (2,304 samples, 0.07%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +encode (496 samples, 0.02%) + + + +anon-func-48.7 (800 samples, 0.03%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +go (608 samples, 0.02%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +encode (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (2,448 samples, 0.08%) + + + +anon-func-387.7 (273 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +rec (392 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (4,194 samples, 0.14%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +encode (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-289.5 (157,212 samples, 5.08%) +anon-f.. + + +traceCoords (364 samples, 0.01%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (2,288 samples, 0.07%) + + + +interleave (352 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-412.5 (594 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +finderTRCoords (288 samples, 0.01%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyPadLeft (486 samples, 0.02%) + + + +anon-func-435.5 (25,792 samples, 0.83%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-161.5 (624 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +interleave (2,125 samples, 0.07%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (403 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +polyAdd (403 samples, 0.01%) + + + +anon-func-481.5 (1,522 samples, 0.05%) + + + +correction (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-244.5 (157,212 samples, 5.08%) +anon-f.. + + +go (352 samples, 0.01%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +polyMulTerm (270 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +pathCoords (652 samples, 0.02%) + + + +$lambda (1,024 samples, 0.03%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (760 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (47,040 samples, 1.52%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (1,942 samples, 0.06%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +parse (360 samples, 0.01%) + + + +patternCoords (704 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +pathCoords (756 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +$lambda (556 samples, 0.02%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (640 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +go (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +encode (832 samples, 0.03%) + + + +correction (688 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (357 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-161.5 (4,360 samples, 0.14%) + + + +anon-func-481.5 (500 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +natFromBits (374 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +rec (455 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polySub (1,216 samples, 0.04%) + + + +go (290 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +map (476 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-32.65 (137,574 samples, 4.45%) +anon-.. + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (2,704 samples, 0.09%) + + + +polyMulTerm (320 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +scale (3,848 samples, 0.12%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-481.5 (488 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,055 samples, 0.03%) + + + +formatVCoords (270 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (271 samples, 0.01%) + + + +anon-func-38.11 (306 samples, 0.01%) + + + +anon-func-435.5 (5,808 samples, 0.19%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-435.5 (10,816 samples, 0.35%) + + + +polyScale (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +elemFromBits (288 samples, 0.01%) + + + +elemAdd (22,848 samples, 0.74%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (955 samples, 0.03%) + + + +polySub (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +$lambda (1,920 samples, 0.06%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +rec (1,360 samples, 0.04%) + + + +correction (527 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-412.5 (279 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +next (664 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (4,026 samples, 0.13%) + + + +encode (608 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +@deserialize_go<v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)> (280 samples, 0.01%) + + + +correction (2,754 samples, 0.09%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +polyAddTerm (274 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (363 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-161.5 (2,021 samples, 0.07%) + + + +correction (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-244.5 (12,001 samples, 0.39%) + + + +anon-func-30.36 (468 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +$lambda (1,120 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +encode (99,362 samples, 3.21%) +enc.. + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +elemAdd (25,536 samples, 0.83%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (378 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +natZipWith (10,752 samples, 0.35%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +interleave (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (7,744 samples, 0.25%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-393.5 (1,003 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (2,644 samples, 0.09%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-54.15 (374 samples, 0.01%) + + + +traceCoords (273 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +patternCoords (1,152 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyPadLeft (319 samples, 0.01%) + + + +patternCoords (1,152 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (462 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (5,202 samples, 0.17%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyDivMod (624 samples, 0.02%) + + + +interleave (880 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +natFromBits (316 samples, 0.01%) + + + +finderTLCoords (1,152 samples, 0.04%) + + + +map (384 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (478 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (918 samples, 0.03%) + + + +anon-func-62.5 (63,990 samples, 2.07%) +a.. + + +go (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (2,288 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +$lambda (546 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +rec (19,756 samples, 0.64%) + + + +patternCoords (2,646 samples, 0.09%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +encode (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (2,592 samples, 0.08%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-229.5 (451 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-38.11 (2,312 samples, 0.07%) + + + +map (544 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +finderCoords (2,496 samples, 0.08%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (29,120 samples, 0.94%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (2,704 samples, 0.09%) + + + +finderCoords (576 samples, 0.02%) + + + +rec (450 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyAdd (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +$lambda (342 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (312 samples, 0.01%) + + + +go (5,696 samples, 0.18%) + + + +$lambda (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +natZipWith (47,040 samples, 1.52%) + + + +polyScale (272 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +anon-func-79.3 (512 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyGrow (42,752 samples, 1.38%) + + + +correction (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +encode (1,136 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +$lambda (1,024 samples, 0.03%) + + + +rec (1,207 samples, 0.04%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (10,560 samples, 0.34%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (696 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-161.5 (561 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +forIn (664 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +rec (450 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyGrow (333 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (8,130 samples, 0.26%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (468 samples, 0.02%) + + + +polyAdd (414 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (5,984 samples, 0.19%) + + + +go (416 samples, 0.01%) + + + +rec (1,836 samples, 0.06%) + + + +pathCoords (84,073 samples, 2.72%) +pa.. + + +anon-func-79.3 (4,466 samples, 0.14%) + + + +anon-func-435.5 (6,928 samples, 0.22%) + + + +encode (1,224 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-54.15 (357 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +interleave (972 samples, 0.03%) + + + +scale (2,816 samples, 0.09%) + + + +map (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (880 samples, 0.03%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +go (416 samples, 0.01%) + + + +pathCoords (2,112 samples, 0.07%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (61,440 samples, 1.99%) +a.. + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-453.5 (737 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +rec (584 samples, 0.02%) + + + +anon-func-481.5 (1,034 samples, 0.03%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-161.5 (1,792 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyMulTerm (352 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +rec (1,566 samples, 0.05%) + + + +encode (575 samples, 0.02%) + + + +anon-func-30.36 (465 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (1,152 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +map (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (3,138 samples, 0.10%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +interleave (6,392 samples, 0.21%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (1,890 samples, 0.06%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +encode (342 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyAdd (704 samples, 0.02%) + + + +encode (1,152 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-68.41 (4,032 samples, 0.13%) + + + +correction (416 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (800 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +rec (1,417 samples, 0.05%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-161.5 (1,989 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-161.5 (2,760 samples, 0.09%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-412.5 (432 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-161.5 (2,992 samples, 0.10%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +generate (756 samples, 0.02%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (441 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (512 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +correction (618 samples, 0.02%) + + + +polyZipWith (391 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +map (624 samples, 0.02%) + + + +polyPadLeft (299 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +anon-func-54.15 (320 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +toTarget (1,360 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyPadRight (987 samples, 0.03%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (2,288 samples, 0.07%) + + + +go (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (810 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (2,646 samples, 0.09%) + + + +go (1,664 samples, 0.05%) + + + +map (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-32.65 (1,055 samples, 0.03%) + + + +correction (360 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-435.5 (17,475 samples, 0.57%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (442 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +rec (1,265 samples, 0.04%) + + + +rec (624 samples, 0.02%) + + + +anon-func-79.3 (279 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (2,630 samples, 0.09%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +map (286 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +rec (364 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +go (400 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +canister_init (372 samples, 0.01%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-453.5 (274 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +alloc_size<4>_tag<5> (267,981 samples, 8.66%) +alloc_size<4.. + + +anon-func-300.5 (688 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +rec (6,475 samples, 0.21%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,440 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (3,744 samples, 0.12%) + + + +anon-func-48.7 (465 samples, 0.02%) + + + +correction (5,627 samples, 0.18%) + + + +map (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyGrow (465 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (962 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (495 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (304 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +$lambda (360 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-244.5 (96,074 samples, 3.11%) +ano.. + + +encode (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-38.11 (556 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-161.5 (3,840 samples, 0.12%) + + + +rec (665 samples, 0.02%) + + + +polyAdd (640 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-33.5 (904 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyDivMod (384 samples, 0.01%) + + + +rec (880 samples, 0.03%) + + + +encode (384 samples, 0.01%) + + + +rec (793 samples, 0.03%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +rec (1,050 samples, 0.03%) + + + +polySub (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-161.5 (1,408 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-161.5 (391 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,040 samples, 0.10%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (27,760 samples, 0.90%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (516 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-161.5 (3,080 samples, 0.10%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (1,136 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (880 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +@deserialize_go<v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)> (342 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyGrow (341 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (8,976 samples, 0.29%) + + + +pathCoords (374 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (986 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +generate (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +polyZipWith (624 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +polyPadRight (523 samples, 0.02%) + + + +rec (465 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polyScale (434 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +patternCoords (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +generate (1,764 samples, 0.06%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-54.15 (441 samples, 0.01%) + + + +interleave (640 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +go (1,216 samples, 0.04%) + + + +correction (624 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-393.5 (1,479 samples, 0.05%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-393.5 (324 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (1,872 samples, 0.06%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (1,376 samples, 0.04%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +interleave (619 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (408 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +encode (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (1,445 samples, 0.05%) + + + +polyAdd (704 samples, 0.02%) + + + +rec (480 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyMulTerm (400 samples, 0.01%) + + + +elemAdd (4,032 samples, 0.13%) + + + +rec (905 samples, 0.03%) + + + +rec (3,397 samples, 0.11%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +polyMulTerm (624 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polyZipWith (304 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (486 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-161.5 (4,896 samples, 0.16%) + + + +go (478 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyPadLeft (493 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (292 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (5,454 samples, 0.18%) + + + +$lambda (270 samples, 0.01%) + + + +interleave (27,760 samples, 0.90%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (938 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-161.5 (3,720 samples, 0.12%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,440 samples, 0.05%) + + + +polyAdd (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +elemMul (3,520 samples, 0.11%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (446 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (378 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (1,222 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +interleave (489 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +toTarget (1,040 samples, 0.03%) + + + +correction (532 samples, 0.02%) + + + +polyAdd (1,021 samples, 0.03%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +elemMul (2,992 samples, 0.10%) + + + +interleave (1,024 samples, 0.03%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (1,278 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (677 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (14,984 samples, 0.48%) + + + +pathCoords (704 samples, 0.02%) + + + +elemFromBits (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (295 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyPadRight (522 samples, 0.02%) + + + +anon-func-435.5 (5,472 samples, 0.18%) + + + +go (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +$lambda (512 samples, 0.02%) + + + +anon-func-30.36 (403 samples, 0.01%) + + + +elemFromBits (391 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +$lambda (326 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +correction (363 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +rec (6,205 samples, 0.20%) + + + +encode (320 samples, 0.01%) + + + +anon-func-38.11 (289 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (414 samples, 0.01%) + + + +revAppend (113,545 samples, 3.67%) +revA.. + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-54.15 (1,152 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (439 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +go (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natXor (8,736 samples, 0.28%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (430 samples, 0.01%) + + + +generate (1,152 samples, 0.04%) + + + +anon-func-161.5 (2,464 samples, 0.08%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +rec (1,936 samples, 0.06%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +polyPadLeft (319 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-30.36 (4,760 samples, 0.15%) + + + +map (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-265.5 (1,360 samples, 0.04%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-32.65 (9,808 samples, 0.32%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +encode (1,216 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +rec (340 samples, 0.01%) + + + +anon-func-48.7 (12,002 samples, 0.39%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-161.5 (3,264 samples, 0.11%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (9,918 samples, 0.32%) + + + +encode (1,312 samples, 0.04%) + + + +rec (4,352 samples, 0.14%) + + + +natToBytes (14,784 samples, 0.48%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (2,288 samples, 0.07%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +polyZipWith (528 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-161.5 (1,260 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,058 samples, 0.03%) + + + +$lambda (283 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +elemFromBits (416 samples, 0.01%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-481.5 (268 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +patternCoords (606 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (440 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyPadLeft (270 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-481.5 (408 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (332 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +$lambda (5,696 samples, 0.18%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (606 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (28,864 samples, 0.93%) + + + +$lambda (1,058 samples, 0.03%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +natZipWith (24,192 samples, 0.78%) + + + +polyDivMod (272 samples, 0.01%) + + + +$lambda (340 samples, 0.01%) + + + +finderTLCoords (704 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-161.5 (384 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (664 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +encode (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (13,728 samples, 0.44%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +rec (1,965 samples, 0.06%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +$lambda (2,563 samples, 0.08%) + + + +rec (338 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +rec (282 samples, 0.01%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-265.5 (425 samples, 0.01%) + + + +anon-func-79.3 (364 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-265.5 (1,815 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (1,936 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +$lambda (381 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +interleave (688 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (2,448 samples, 0.08%) + + + +anon-func-48.7 (1,440 samples, 0.05%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (16,643 samples, 0.54%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +anon-func-38.11 (14,992 samples, 0.48%) + + + +polyDivMod (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (2,601 samples, 0.08%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-435.5 (9,856 samples, 0.32%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natZipWith (8,739 samples, 0.28%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +polyAdd (608 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +finderBLCoords (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +rec (2,838 samples, 0.09%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +parse_idl_header (729 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +polyAdd (2,624 samples, 0.08%) + + + +go (288 samples, 0.01%) + + + +anon-func-265.5 (1,080 samples, 0.03%) + + + +polyAdd (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (377 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +rec (1,908 samples, 0.06%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (2,025 samples, 0.07%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyGrow (319 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-393.5 (918 samples, 0.03%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-229.5 (1,795 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (1,764 samples, 0.06%) + + + +elemFromBits (391 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +map (638 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-435.5 (2,288 samples, 0.07%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-161.5 (384 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyZipWith (523 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +encode (3,744 samples, 0.12%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (9,872 samples, 0.32%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +polyAdd (352 samples, 0.01%) + + + +go (5,202 samples, 0.17%) + + + +anon-func-265.5 (630 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (1,942 samples, 0.06%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (340 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-481.5 (268 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (341 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (5,008 samples, 0.16%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyPadRight (731 samples, 0.02%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-54.15 (378 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +polyAddTerm (608 samples, 0.02%) + + + +$lambda (12,816 samples, 0.41%) + + + +interleave (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +elemDiv (544 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +anon-func-54.15 (342 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +step (405 samples, 0.01%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (972 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-265.5 (1,080 samples, 0.03%) + + + +rec (871 samples, 0.03%) + + + +map (416 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-161.5 (2,101 samples, 0.07%) + + + +map (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +go (1,312 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (2,448 samples, 0.08%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +polyNew (459 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (832 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +step (297 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +toTarget (4,882 samples, 0.16%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +encode (12,104 samples, 0.39%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (300 samples, 0.01%) + + + +anon-func-79.3 (446 samples, 0.01%) + + + +polyDivMod (517 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +anon-func-38.11 (1,989 samples, 0.06%) + + + +anon-func-481.5 (276 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-161.5 (495 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (4,480 samples, 0.14%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +rec (1,386 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (371 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-51.11 (289 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (306 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (518 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (640 samples, 0.02%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +toList (377 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +rec (1,062 samples, 0.03%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-393.5 (370 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyPadRight (341 samples, 0.01%) + + + +anon-func-161.5 (904 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (810 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +generate (8,086 samples, 0.26%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-393.5 (1,817 samples, 0.06%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (1,824 samples, 0.06%) + + + +polyAdd (416 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (400 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-229.5 (774 samples, 0.03%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +polySub (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +rec (504 samples, 0.02%) + + + +anon-func-48.7 (290 samples, 0.01%) + + + +rec (400 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +elemFromBits (374 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-229.5 (1,105 samples, 0.04%) + + + +anon-func-161.5 (312 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (363 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (1,768 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-51.11 (440 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +$lambda (1,040 samples, 0.03%) + + + +anon-func-38.11 (310 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +interleave (3,744 samples, 0.12%) + + + +interleave (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (38,080 samples, 1.23%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +toBlocks (5,728 samples, 0.19%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (341 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (309 samples, 0.01%) + + + +anon-func-435.5 (52,480 samples, 1.70%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyScale (480 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +correction (489 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-161.5 (387 samples, 0.01%) + + + +polyGrow (273 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (280 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +patternCoords (832 samples, 0.03%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +pathCoords (1,224 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +elemAdd (2,016 samples, 0.07%) + + + +polySub (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (810 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-412.5 (1,209 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (9,168 samples, 0.30%) + + + +go (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadRight (731 samples, 0.02%) + + + +$lambda (5,728 samples, 0.19%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-161.5 (2,304 samples, 0.07%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (1,449 samples, 0.05%) + + + +polySub (1,312 samples, 0.04%) + + + +rec (6,240 samples, 0.20%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (6,392 samples, 0.21%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +motoko_rts::idl::parse_fields::h16db5574f7c8c078 (1,518 samples, 0.05%) + + + +anon-func-54.15 (2,563 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +pathCoords (3,456 samples, 0.11%) + + + +anon-func-51.11 (360 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (475 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +polyZipWith (486 samples, 0.02%) + + + +rec (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +interleave (1,024 samples, 0.03%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (624 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polyAdd (391 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +map (880 samples, 0.03%) + + + +anon-func-300.5 (582 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-265.5 (2,354 samples, 0.08%) + + + +natXor (55,104 samples, 1.78%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +map (304 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (381 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-161.5 (11,912 samples, 0.39%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (272 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-38.11 (2,448 samples, 0.08%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +rec (468 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (403 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-161.5 (952 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (1,496 samples, 0.05%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (1,664 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +anon-func-161.5 (817 samples, 0.03%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +map (338 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-265.5 (395 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (381 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +encode (352 samples, 0.01%) + + + +anon-func-161.5 (441 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +B+sub (280 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +go (760 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (575 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-161.5 (1,683 samples, 0.05%) + + + +interleave (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (338 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +anon-func-161.5 (3,438 samples, 0.11%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyGrow (403 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +map (290 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +elemAdd (22,848 samples, 0.74%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +rec (1,287 samples, 0.04%) + + + +polyAdd (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (5,398 samples, 0.17%) + + + +polySub (416 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +rec (1,440 samples, 0.05%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +rec (920 samples, 0.03%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rowwise (4,466 samples, 0.14%) + + + +polySub (1,120 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-161.5 (868 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +scale (1,408 samples, 0.05%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-481.5 (378 samples, 0.01%) + + + +polyPadLeft (522 samples, 0.02%) + + + +polyAdd (8,704 samples, 0.28%) + + + +finderCoords (832 samples, 0.03%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-161.5 (3,872 samples, 0.13%) + + + +polyAdd (351 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (374 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +polyMulTerm (624 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (12,768 samples, 0.41%) + + + +map (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyGrow (270 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +natZipWith (5,376 samples, 0.17%) + + + +map (1,440 samples, 0.05%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyGrow (522 samples, 0.02%) + + + +anon-func-30.36 (2,448 samples, 0.08%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-161.5 (2,563 samples, 0.08%) + + + +map (446 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +rec (1,495 samples, 0.05%) + + + +anon-func-51.11 (2,288 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-54.15 (270 samples, 0.01%) + + + +correction (3,382 samples, 0.11%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (396 samples, 0.01%) + + + +anon-func-51.11 (271 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polyZipWith (704 samples, 0.02%) + + + +rec (1,112 samples, 0.04%) + + + +polyAddTerm (272 samples, 0.01%) + + + +go (446 samples, 0.01%) + + + +encode (468 samples, 0.02%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +flatten (286 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyPadRight (342 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (2,125 samples, 0.07%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (489 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (403 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (333 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-32.65 (1,638 samples, 0.05%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (1,440 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +anon-func-32.65 (84,073 samples, 2.72%) +an.. + + +encode (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +map (3,744 samples, 0.12%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-265.5 (715 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (2,563 samples, 0.08%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyScale (384 samples, 0.01%) + + + +rec (286 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-38.11 (446 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +rec (2,218 samples, 0.07%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (3,224 samples, 0.10%) + + + +correction (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (434 samples, 0.01%) + + + +rec (1,674 samples, 0.05%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +anon-func-481.5 (308 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +flatten (2,288 samples, 0.07%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-435.5 (10,752 samples, 0.35%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (1,024 samples, 0.03%) + + + +polyDivMod (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-99.14 (609 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-51.11 (310 samples, 0.01%) + + + +polyLen (2,482 samples, 0.08%) + + + +go (384 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (32,032 samples, 1.04%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (535 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +correction (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-435.5 (336 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +interleave (1,024 samples, 0.03%) + + + +rec (2,227 samples, 0.07%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +map (289 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +correction (624 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (290 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polyZipWith (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-51.11 (1,440 samples, 0.05%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +natFromBytes (6,720 samples, 0.22%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +polyAdd (2,624 samples, 0.08%) + + + +encode (416 samples, 0.01%) + + + +anon-func-393.5 (429 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (7,168 samples, 0.23%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (559 samples, 0.02%) + + + +anon-func-161.5 (882 samples, 0.03%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +rec (792 samples, 0.03%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (270 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-435.5 (21,824 samples, 0.71%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +anon-func-265.5 (900 samples, 0.03%) + + + +polyMulTerm (384 samples, 0.01%) + + + +rec (267 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyAdd (1,920 samples, 0.06%) + + + +interleave (274 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (419 samples, 0.01%) + + + +anon-func-393.5 (455 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +rec (1,098 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (10,752 samples, 0.35%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +anon-func-435.5 (24,640 samples, 0.80%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (4,760 samples, 0.15%) + + + +$lambda (271 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +finderTLCoords (288 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +rec (318 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (1,224 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (297 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (8,448 samples, 0.27%) + + + +map (972 samples, 0.03%) + + + +interleave (416 samples, 0.01%) + + + +encode (378 samples, 0.01%) + + + +elemToBits (535 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +polyLeadCoeff (2,329 samples, 0.08%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-265.5 (540 samples, 0.02%) + + + +rec (4,550 samples, 0.15%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (5,696 samples, 0.18%) + + + +anon-func-79.3 (2,630 samples, 0.09%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +rec (418 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +generate (137,574 samples, 4.45%) +gener.. + + +elemAdd (14,784 samples, 0.48%) + + + +$lambda (320 samples, 0.01%) + + + +pathCoords (1,764 samples, 0.06%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +polyAdd (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-161.5 (652 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-387.7 (378 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +elemFromBits (326 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-412.5 (1,581 samples, 0.05%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-453.5 (3,422 samples, 0.11%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-161.5 (310 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +rec (1,000 samples, 0.03%) + + + +anon-func-161.5 (702 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +pathCoords (9,918 samples, 0.32%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-161.5 (4,194 samples, 0.14%) + + + +go (320 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-161.5 (1,566 samples, 0.05%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (5,508 samples, 0.18%) + + + +anon-func-435.5 (816 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyGrow (378 samples, 0.01%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +anon-func-161.5 (2,376 samples, 0.08%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,024 samples, 0.03%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-435.5 (6,688 samples, 0.22%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +anon-func-161.5 (2,288 samples, 0.07%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-481.5 (822 samples, 0.03%) + + + +anon-func-435.5 (880 samples, 0.03%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-265.5 (810 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (619 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (304 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (525 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +canister_init (472 samples, 0.02%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +map (3,008 samples, 0.10%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (5,696 samples, 0.18%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (325 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-161.5 (320 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (3,520 samples, 0.11%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +natZipWith (24,192 samples, 0.78%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +encode (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-161.5 (4,624 samples, 0.15%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +rec (1,840 samples, 0.06%) + + + +finderTLCoords (2,646 samples, 0.09%) + + + +interleave (544 samples, 0.02%) + + + +encode (358 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +polyGrow (19,584 samples, 0.63%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (1,248 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (2,900 samples, 0.09%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +canister_init (815 samples, 0.03%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +anon-func-51.11 (1,326 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +encode (638 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (272 samples, 0.01%) + + + +anon-func-161.5 (280 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-161.5 (408 samples, 0.01%) + + + +anon-func-453.5 (3,696 samples, 0.12%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +rec (2,035 samples, 0.07%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,989 samples, 0.06%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +encode (283 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (6,392 samples, 0.21%) + + + +encode (416 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +anon-func-161.5 (918 samples, 0.03%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +interleave (280 samples, 0.01%) + + + +rec (1,331 samples, 0.04%) + + + +map (799 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (2,236 samples, 0.07%) + + + +anon-func-48.7 (2,754 samples, 0.09%) + + + +polyScale (384 samples, 0.01%) + + + +$lambda (14,992 samples, 0.48%) + + + +go (489 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (618 samples, 0.02%) + + + +natFromBits (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +correction (4,760 samples, 0.15%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (1,564 samples, 0.05%) + + + +anon-func-51.11 (2,288 samples, 0.07%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (280 samples, 0.01%) + + + +polyGrow (459 samples, 0.01%) + + + +map (624 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (1,764 samples, 0.06%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (304 samples, 0.01%) + + + +polyDivMod (289 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +go (1,024 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +natToBits (708 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +rec (7,259 samples, 0.23%) + + + +anon-func-412.5 (486 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (5,184 samples, 0.17%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +finderTRCoords (1,224 samples, 0.04%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +toBlocks (880 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (306 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (799 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (2,607 samples, 0.08%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-48.7 (2,304 samples, 0.07%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +rec (736 samples, 0.02%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (12,104 samples, 0.39%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-61.36 (2,304 samples, 0.07%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +anon-func-435.5 (7,075 samples, 0.23%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +next (2,216 samples, 0.07%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +anon-func-435.5 (2,464 samples, 0.08%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +anon-func-161.5 (2,600 samples, 0.08%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (381 samples, 0.01%) + + + +interleave (2,601 samples, 0.08%) + + + +map (3,744 samples, 0.12%) + + + +anon-func-38.11 (368 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +polyDivMod (272 samples, 0.01%) + + + +Array_tabulate (328 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +rec (1,455 samples, 0.05%) + + + +anon-func-435.5 (42,560 samples, 1.38%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (2,496 samples, 0.08%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyMulTerm (384 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,526 samples, 0.05%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-161.5 (3,570 samples, 0.12%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +anon-func-435.5 (18,912 samples, 0.61%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (619 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-161.5 (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (12,816 samples, 0.41%) + + + +anon-func-161.5 (2,176 samples, 0.07%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +encode (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +rec (268 samples, 0.01%) + + + +rec (613 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyNew (351 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +polyZipWith (325 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +rec (1,638 samples, 0.05%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +scale (3,872 samples, 0.13%) + + + +polyAdd (3,840 samples, 0.12%) + + + +go (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (640 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (576 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +natZipWith (6,720 samples, 0.22%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (2,016 samples, 0.07%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-435.5 (10,816 samples, 0.35%) + + + +anon-func-51.11 (465 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (406 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-48.7 (446 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +interleave (360 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +polyAddTerm (618 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +patternCoords (832 samples, 0.03%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (2,112 samples, 0.07%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-48.7 (2,563 samples, 0.08%) + + + +correction (408 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +elemAdd (5,376 samples, 0.17%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +map (489 samples, 0.02%) + + + +anon-func-79.3 (12,104 samples, 0.39%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-481.5 (448 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +anon-func-435.5 (2,640 samples, 0.09%) + + + +encode (288 samples, 0.01%) + + + +anon-func-453.5 (754 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-481.5 (858 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +polyZipWith (320 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-161.5 (952 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +rec (39,926 samples, 1.29%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-161.5 (960 samples, 0.03%) + + + +encode (1,786 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +pathCoords (2,646 samples, 0.09%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +rowwise (84,073 samples, 2.72%) +ro.. + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-453.5 (2,065 samples, 0.07%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +rec (6,509 samples, 0.21%) + + + +polyAddTerm (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +rec (985 samples, 0.03%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-481.5 (400 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +map (320 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (384 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +go (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +elemToBits (292 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (384 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +pathCoords (2,112 samples, 0.07%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +interleave (384 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (489 samples, 0.02%) + + + +correction (274 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +encode (290 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (2,448 samples, 0.08%) + + + +polyAdd (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyGrow (558 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (363 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (2,112 samples, 0.07%) + + + +polyAdd (288 samples, 0.01%) + + + +$lambda (306 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +anon-func-300.5 (1,768 samples, 0.06%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +interleave (880 samples, 0.03%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-54.15 (3,032 samples, 0.10%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (5,827 samples, 0.19%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +generate (832 samples, 0.03%) + + + +finderBLCoords (342 samples, 0.01%) + + + +generate (381 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (2,634 samples, 0.09%) + + + +pathCoords (606 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +rec (2,937 samples, 0.09%) + + + +go (785 samples, 0.03%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyAdd (589 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-229.5 (793 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (5,768 samples, 0.19%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (1,649 samples, 0.05%) + + + +$lambda (280 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +go (4,758 samples, 0.15%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +anon-func-161.5 (1,064 samples, 0.03%) + + + +finderCoords (342 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-481.5 (560 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +finderCoords (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +polyDivMod (2,448 samples, 0.08%) + + + +anon-func-435.5 (80,640 samples, 2.61%) +an.. + + +$lambda (688 samples, 0.02%) + + + +rec (13,845 samples, 0.45%) + + + +map (352 samples, 0.01%) + + + +generate (2,112 samples, 0.07%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +finderCoords (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +rec (993 samples, 0.03%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-393.5 (392 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +rec (415 samples, 0.01%) + + + +anon-func-412.5 (1,131 samples, 0.04%) + + + +encode (480 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (3,456 samples, 0.11%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (271 samples, 0.01%) + + + +anon-func-435.5 (4,256 samples, 0.14%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (645 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +generate (342 samples, 0.01%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +traceCoords (546 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (496 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-435.5 (1,216 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (2,284 samples, 0.07%) + + + +polyZipWith (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +rec (635 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +rec (1,001 samples, 0.03%) + + + +anon-func-161.5 (1,534 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (2,448 samples, 0.08%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-161.5 (3,400 samples, 0.11%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (447 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (558 samples, 0.02%) + + + +anon-func-51.11 (271 samples, 0.01%) + + + +anon-func-61.36 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (5,508 samples, 0.18%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +anon-func-48.7 (442 samples, 0.01%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (756 samples, 0.02%) + + + +polyZipWith (18,496 samples, 0.60%) + + + +rec (1,818 samples, 0.06%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-161.5 (1,408 samples, 0.05%) + + + +polySub (304 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (9,456 samples, 0.31%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (6,392 samples, 0.21%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-481.5 (2,538 samples, 0.08%) + + + +anon-func-229.5 (1,573 samples, 0.05%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +$lambda (328 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyGrow (1,193 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-161.5 (714 samples, 0.02%) + + + +elemAdd (8,739 samples, 0.28%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (8,256 samples, 0.27%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (1,079 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-161.5 (512 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-481.5 (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-161.5 (5,000 samples, 0.16%) + + + +map (288 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +polyScale (279 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-161.5 (845 samples, 0.03%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.08%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (1,344 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +rec (990 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (270 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +alog (2,233 samples, 0.07%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +anon-func-38.11 (676 samples, 0.02%) + + + +anon-func-481.5 (312 samples, 0.01%) + + + +polyAddTerm (270 samples, 0.01%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +rec (1,209 samples, 0.04%) + + + +foldr (405 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-161.5 (4,194 samples, 0.14%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +rec (5,551 samples, 0.18%) + + + +go (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (6,392 samples, 0.21%) + + + +anon-func-300.5 (374 samples, 0.01%) + + + +anon-func-38.11 (880 samples, 0.03%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-51.11 (606 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +elemToBits (584 samples, 0.02%) + + + +polyDivMod (271 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (3,016 samples, 0.10%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +flatten (2,704 samples, 0.09%) + + + +patternCoords (832 samples, 0.03%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (3,210 samples, 0.10%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +anon-func-300.5 (1,440 samples, 0.05%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyScale (624 samples, 0.02%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +polyTrim (3,388 samples, 0.11%) + + + +encode (320 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +rec (1,998 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (271 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +natZipWith (8,736 samples, 0.28%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +Nat-><Nat8> (24,192 samples, 0.78%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-48.7 (6,392 samples, 0.21%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-453.5 (3,536 samples, 0.11%) + + + +polyOrder (306 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,088 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (5,355 samples, 0.17%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (53,760 samples, 1.74%) + + + +toBlocks (1,664 samples, 0.05%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,152 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (1,566 samples, 0.05%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +anon-func-79.3 (476 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (6,392 samples, 0.21%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (14,979 samples, 0.48%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,520 samples, 0.05%) + + + +encode (352 samples, 0.01%) + + + +rec (630 samples, 0.02%) + + + +anon-func-265.5 (1,275 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-387.7 (399 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-48.7 (489 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +rec (672 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (1,344 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +foldr (325 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +anon-func-48.7 (3,008 samples, 0.10%) + + + +polySub (544 samples, 0.02%) + + + +natXor (6,720 samples, 0.22%) + + + +rec (561 samples, 0.02%) + + + +anon-func-161.5 (1,536 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (3,032 samples, 0.10%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +formatCoords (381 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +rec (4,336 samples, 0.14%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +pathCoords (462 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-32.65 (2,496 samples, 0.08%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,040 samples, 0.03%) + + + +polyMulTerm (384 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +pathCoords (1,152 samples, 0.04%) + + + +pathCoords (2,563 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (688 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyOrder (2,002 samples, 0.06%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyGrow (409 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +interleave (5,398 samples, 0.17%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-161.5 (528 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-44.5 (66,510 samples, 2.15%) +a.. + + +polyScale (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +polyAdd (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +rec (5,274 samples, 0.17%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +revAppend (370,725 samples, 11.99%) +revAppend + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +go (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (3,744 samples, 0.12%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (2,226 samples, 0.07%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-51.11 (378 samples, 0.01%) + + + +anon-func-161.5 (2,304 samples, 0.07%) + + + +map (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (2,112 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (2,704 samples, 0.09%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyPadLeft (297 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +correction (2,312 samples, 0.07%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (5,355 samples, 0.17%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-54.15 (4,194 samples, 0.14%) + + + +rec (1,037 samples, 0.03%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +encode (1,152 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (1,683 samples, 0.05%) + + + +polyScale (510 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +polyAdd (2,240 samples, 0.07%) + + + +$lambda (1,920 samples, 0.06%) + + + +polyZipWith (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (326 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +polySub (272 samples, 0.01%) + + + +polyPadLeft (414 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyPadRight (378 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-393.5 (286 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (8,736 samples, 0.28%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +encode (880 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (446 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +finderTRCoords (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +rec (875 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (1,989 samples, 0.06%) + + + +go (322 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +patternCoords (704 samples, 0.02%) + + + +anon-func-300.5 (1,683 samples, 0.05%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +rec (305 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-265.5 (325 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-161.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (384 samples, 0.01%) + + + +encode (326 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +elemMul (1,936 samples, 0.06%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +go (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +polyGrow (306 samples, 0.01%) + + + +correction (575 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (935 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +map (304 samples, 0.01%) + + + +anon-func-435.5 (65,280 samples, 2.11%) +a.. + + +rec (504 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +polySub (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (850 samples, 0.03%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +encode (810 samples, 0.03%) + + + +rec (1,810 samples, 0.06%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (1,496 samples, 0.05%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +anon-func-435.5 (7,744 samples, 0.25%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (1,575 samples, 0.05%) + + + +polyAdd (576 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +polyTrim (11,340 samples, 0.37%) + + + +polyMulTerm (306 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (289 samples, 0.01%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +anon-func-435.5 (15,136 samples, 0.49%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (544 samples, 0.02%) + + + +interleave (624 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +toBlocks (1,440 samples, 0.05%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-300.5 (850 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (323,033 samples, 10.44%) +anon-func-79.3 + + +polyDivMod (688 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (22,848 samples, 0.74%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyOrder (860 samples, 0.03%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (2,400 samples, 0.08%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +rec (429 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (2,112 samples, 0.07%) + + + +polyAdd (512 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (5,696 samples, 0.18%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-300.5 (2,448 samples, 0.08%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (6,144 samples, 0.20%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +anon-func-435.5 (4,800 samples, 0.16%) + + + +anon-func-51.11 (5,398 samples, 0.17%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +correction (384 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +traceCoords (441 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +go (465 samples, 0.02%) + + + +polyMulTerm (310 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +rec (35,706 samples, 1.15%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAdd (304 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-265.5 (640 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-435.5 (69,120 samples, 2.23%) +a.. + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,786 samples, 0.06%) + + + +interleave (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +correction (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (1,024 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +rec (825 samples, 0.03%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +finderCoords (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +natXor (8,736 samples, 0.28%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,755 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-481.5 (354 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (31,488 samples, 1.02%) + + + +$lambda (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +polyGrow (351 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +interleave (468 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (378 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyAdd (333 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (4,194 samples, 0.14%) + + + +interleave (320 samples, 0.01%) + + + +interleave (760 samples, 0.02%) + + + +anon-func-435.5 (1,600 samples, 0.05%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +anon-func-229.5 (726 samples, 0.02%) + + + +anon-func-435.5 (40,320 samples, 1.30%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +scale (5,320 samples, 0.17%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (1,224 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (280 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,344 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (2,312 samples, 0.07%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-51.11 (478 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-51.11 (8,780 samples, 0.28%) + + + +interleave (416 samples, 0.01%) + + + +go (14,992 samples, 0.48%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (1,400 samples, 0.05%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (2,288 samples, 0.07%) + + + +$lambda (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (585 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +rec (4,410 samples, 0.14%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-435.5 (5,280 samples, 0.17%) + + + +map (271 samples, 0.01%) + + + +anon-func-30.36 (419 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +encode (1,496 samples, 0.05%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +natXor (5,376 samples, 0.17%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +to_2_tuple (267,968 samples, 8.66%) +to_2_tuple + + +anon-func-412.5 (609 samples, 0.02%) + + + +go (2,304 samples, 0.07%) + + + +map (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +rec (832 samples, 0.03%) + + + +anon-func-68.41 (5,376 samples, 0.17%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +encode (2,563 samples, 0.08%) + + + +anon-func-453.5 (1,054 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-300.5 (1,156 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (2,704 samples, 0.09%) + + + +rec (765 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +rec (756 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +natZipWith (1,344 samples, 0.04%) + + + +anon-func-79.3 (532 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (299 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +go (2,991 samples, 0.10%) + + + +encode (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +parse (370 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (2,992 samples, 0.10%) + + + +rec (3,333 samples, 0.11%) + + + +go (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (6,144 samples, 0.20%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (2,630 samples, 0.09%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rec (1,062 samples, 0.03%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +polyAdd (640 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +correction (270 samples, 0.01%) + + + +anon-func-79.3 (27,760 samples, 0.90%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (1,224 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +flatten (468 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +map (384 samples, 0.01%) + + + +correction (5,696 samples, 0.18%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (2,754 samples, 0.09%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +go (271 samples, 0.01%) + + + +anon-func-300.5 (864 samples, 0.03%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +correction (1,768 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (306 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +finderTLCoords (1,224 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +rec (385 samples, 0.01%) + + + +anon-func-435.5 (12,160 samples, 0.39%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +correction (289 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (465 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +map (326 samples, 0.01%) + + + +anon-func-51.11 (5,202 samples, 0.17%) + + + +correction (317 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyMulTerm (320 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (645 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (270 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +log (2,688 samples, 0.09%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +rec (1,944 samples, 0.06%) + + + +anon-func-453.5 (2,065 samples, 0.07%) + + + +anon-func-32.65 (606 samples, 0.02%) + + + +anon-func-453.5 (366 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (964 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-412.5 (330 samples, 0.01%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (16,224 samples, 0.52%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +polyPadRight (414 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +rec (1,462 samples, 0.05%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-435.5 (12,160 samples, 0.39%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +natZipWith (17,475 samples, 0.57%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (1,440 samples, 0.05%) + + + +go (576 samples, 0.02%) + + + +rec (3,233 samples, 0.10%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +rec (3,718 samples, 0.12%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +rec (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-229.5 (1,548 samples, 0.05%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +go (5,398 samples, 0.17%) + + + +traceCoords (756 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +rec (1,005 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-51.11 (2,601 samples, 0.08%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +alog (2,639 samples, 0.09%) + + + +anon-func-79.3 (12,816 samples, 0.41%) + + + +map (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (532 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (2,202 samples, 0.07%) + + + +go (556 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-453.5 (1,003 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-265.5 (560 samples, 0.02%) + + + +$lambda (338 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyAdd (333 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-51.11 (2,496 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (2,304 samples, 0.07%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (476 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (4,464 samples, 0.14%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +elemMul (2,288 samples, 0.07%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyZipWith (704 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (1,440 samples, 0.05%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (496 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (3,255 samples, 0.11%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +toList (493 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +anon-func-51.11 (273 samples, 0.01%) + + + +rec (2,761 samples, 0.09%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +encode (516 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +rec (3,618 samples, 0.12%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +elemFromBits (364 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-79.3 (27,760 samples, 0.90%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-300.5 (360 samples, 0.01%) + + + +anon-func-51.11 (1,520 samples, 0.05%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +anon-func-435.5 (6,400 samples, 0.21%) + + + +polyZipWith (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-48.7 (966 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (403 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (3,200 samples, 0.10%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (606 samples, 0.02%) + + + +map (12,816 samples, 0.41%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-435.5 (9,600 samples, 0.31%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-54.15 (1,152 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (2,704 samples, 0.09%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-161.5 (825 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-481.5 (344 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (310 samples, 0.01%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +generate (1,786 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +correction (326 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +go (15,147 samples, 0.49%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +pathCoords (357 samples, 0.01%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-435.5 (5,280 samples, 0.17%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +rec (1,853 samples, 0.06%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +correction (688 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (275 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +polyDivMod (360 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +pathCoords (495 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-161.5 (2,880 samples, 0.09%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-481.5 (1,974 samples, 0.06%) + + + +anon-func-38.11 (12,104 samples, 0.39%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-495.31 (275 samples, 0.01%) + + + +anon-func-161.5 (137,574 samples, 4.45%) +anon-.. + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (652 samples, 0.02%) + + + +anon-func-54.15 (9,808 samples, 0.32%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +toBlocks (640 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (306 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (785 samples, 0.03%) + + + +correction (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +scale (1,760 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +rec (2,484 samples, 0.08%) + + + +anon-func-38.11 (799 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-435.5 (10,496 samples, 0.34%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +polyMulTerm (624 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-161.5 (472 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +polyMulTerm (320 samples, 0.01%) + + + +patternCoords (810 samples, 0.03%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +interleave (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-161.5 (408 samples, 0.01%) + + + +polyScale (384 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +elemAdd (8,736 samples, 0.28%) + + + +map (478 samples, 0.02%) + + + +rec (1,755 samples, 0.06%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-79.3 (8,802 samples, 0.28%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (500 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +polySub (12,104 samples, 0.39%) + + + +anon-func-32.65 (342 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +rec (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-481.5 (350 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +anon-func-161.5 (5,712 samples, 0.18%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +rec (793 samples, 0.03%) + + + +anon-func-481.5 (470 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (330 samples, 0.01%) + + + +polyDivMod (360 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +rec (1,309 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +go (544 samples, 0.02%) + + + +elemMul (2,816 samples, 0.09%) + + + +natZipWith (17,472 samples, 0.56%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (1,152 samples, 0.04%) + + + +rec (81,413 samples, 2.63%) +rec + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (1,062 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (306 samples, 0.01%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-38.11 (2,448 samples, 0.08%) + + + +encode (1,312 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (1,632 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +patternCoords (270 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-161.5 (584 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (16,640 samples, 0.54%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (15,360 samples, 0.50%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +anon-func-300.5 (595 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (448 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (1,027 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polySub (1,120 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (27,760 samples, 0.90%) + + + +polyScale (384 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (374 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +rec (2,268 samples, 0.07%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-229.5 (533 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +rec (936 samples, 0.03%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +polyAdd (1,376 samples, 0.04%) + + + +polyPadRight (300 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-161.5 (5,544 samples, 0.18%) + + + +correction (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +elemToBits (1,314 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (2,563 samples, 0.08%) + + + +interleave (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (3,080 samples, 0.10%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyPadRight (320 samples, 0.01%) + + + +anon-func-54.15 (381 samples, 0.01%) + + + +polyScale (480 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (5,460 samples, 0.18%) + + + +rec (1,392 samples, 0.05%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-161.5 (4,122 samples, 0.13%) + + + +correction (272 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-412.5 (392 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +finderCoords (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-79.3 (8,130 samples, 0.26%) + + + +interleave (352 samples, 0.01%) + + + +encode (964 samples, 0.03%) + + + +polyDivMod (304 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-32.65 (374 samples, 0.01%) + + + +anon-func-481.5 (560 samples, 0.02%) + + + +rec (605 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +go (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (290 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-229.5 (936 samples, 0.03%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (378 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (832 samples, 0.03%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +anon-func-30.36 (286 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (522 samples, 0.02%) + + + +anon-func-161.5 (624 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (5,280 samples, 0.17%) + + + +anon-func-481.5 (308 samples, 0.01%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +go (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (468 samples, 0.02%) + + + +$lambda (484 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-54.15 (462 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-229.5 (572 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +map (2,288 samples, 0.07%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-161.5 (1,536 samples, 0.05%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +generate (2,563 samples, 0.08%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-494.5 (425 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +natXor (47,040 samples, 1.52%) + + + +anon-func-48.7 (2,304 samples, 0.07%) + + + +natZipWith (24,192 samples, 0.78%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +natXor (22,848 samples, 0.74%) + + + +polyZipWith (19,584 samples, 0.63%) + + + +polyAdd (512 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (372 samples, 0.01%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (1,664 samples, 0.05%) + + + +rec (264 samples, 0.01%) + + + +polyAddTerm (6,392 samples, 0.21%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +go (5,728 samples, 0.19%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +interleave (340 samples, 0.01%) + + + +polyZipWith (272 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-229.5 (2,703 samples, 0.09%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-79.3 (489 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-412.5 (515 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (517 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +polySub (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (803 samples, 0.03%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +pathCoords (904 samples, 0.03%) + + + +pathCoords (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +polyMulTerm (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-265.5 (3,194 samples, 0.10%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +polyZipWith (288 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +natZipWith (22,848 samples, 0.74%) + + + +encode (1,216 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +scale (5,280 samples, 0.17%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +traceCoords (756 samples, 0.02%) + + + +rec (1,295 samples, 0.04%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (1,440 samples, 0.05%) + + + +$lambda (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +scale (10,064 samples, 0.33%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-161.5 (284 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +go (2,754 samples, 0.09%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (283 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-161.5 (1,314 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +natXor (24,192 samples, 0.78%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (53,952 samples, 1.74%) + + + +$lambda (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-161.5 (9,121 samples, 0.29%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +map (880 samples, 0.03%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-481.5 (1,224 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +polyLeadCoeff (5,051 samples, 0.16%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +map (317 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (532 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (338 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +formatHCoords (604 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (304 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (306 samples, 0.01%) + + + +polyPadLeft (371 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (810 samples, 0.03%) + + + +interleave (1,024 samples, 0.03%) + + + +anon-func-61.36 (1,664 samples, 0.05%) + + + +polySub (1,216 samples, 0.04%) + + + +interleave (384 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-161.5 (663 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +encode (440 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +correction (3,008 samples, 0.10%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (8,736 samples, 0.28%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-412.5 (918 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +encode (688 samples, 0.02%) + + + +anon-func-229.5 (990 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (344 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (496 samples, 0.02%) + + + +rec (774 samples, 0.03%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (6,864 samples, 0.22%) + + + +anon-func-229.5 (810 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (480 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +elemAdd (10,752 samples, 0.35%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-48.7 (478 samples, 0.02%) + + + +rec (3,258 samples, 0.11%) + + + +$lambda (688 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +rec (648 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-51.11 (527 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (6,768 samples, 0.22%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +polyZipWith (640 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +polyAddTerm (304 samples, 0.01%) + + + +polyAddTerm (14,992 samples, 0.48%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-32.65 (137,574 samples, 4.45%) +anon-.. + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyPadRight (731 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyGrow (558 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-161.5 (1,088 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (1,040 samples, 0.03%) + + + +anon-func-48.7 (880 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-481.5 (2,900 samples, 0.09%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (3,416 samples, 0.11%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +natXor (11,424 samples, 0.37%) + + + +correction (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyScale (1,024 samples, 0.03%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +flatten (754 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +polyScale (322 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +elemAdd (24,192 samples, 0.78%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-79.3 (904 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +patternCoords (288 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (476 samples, 0.02%) + + + +finderTRCoords (810 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyPadLeft (378 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +pathCoords (810 samples, 0.03%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (510 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (618 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +$lambda (12,002 samples, 0.39%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (403 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (2,704 samples, 0.09%) + + + +interleave (688 samples, 0.02%) + + + +interleave (1,024 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (12,104 samples, 0.39%) + + + +encode (272 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +correction (799 samples, 0.03%) + + + +interleave (416 samples, 0.01%) + + + +map (384 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyLeadCoeff (4,795 samples, 0.16%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-161.5 (396 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyPadLeft (341 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (2,376 samples, 0.08%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (9,600 samples, 0.31%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +anon-func-79.3 (661 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-481.5 (432 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (274 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-54.15 (270 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-229.5 (1,098 samples, 0.04%) + + + +rec (858 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAdd (688 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +patternCoords (2,630 samples, 0.09%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-435.5 (38,496 samples, 1.24%) + + + +map (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (1,410 samples, 0.05%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (2,448 samples, 0.08%) + + + +polyAdd (1,328 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (275 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyZipWith (403 samples, 0.01%) + + + +correction (484 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +interleave (638 samples, 0.02%) + + + +rec (1,305 samples, 0.04%) + + + +map (1,216 samples, 0.04%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +rec (366 samples, 0.01%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-453.5 (590 samples, 0.02%) + + + +anon-func-161.5 (640 samples, 0.02%) + + + +anon-func-51.11 (442 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +rec (296 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (1,216 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (374 samples, 0.01%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyAdd (1,088 samples, 0.04%) + + + +interleave (5,696 samples, 0.18%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-161.5 (1,314 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +anon-func-79.3 (5,508 samples, 0.18%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (3,382 samples, 0.11%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (2,448 samples, 0.08%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (324 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-265.5 (1,235 samples, 0.04%) + + + +anon-func-51.11 (290 samples, 0.01%) + + + +polyMulTerm (624 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-54.15 (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-161.5 (1,485 samples, 0.05%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-161.5 (1,870 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +map (384 samples, 0.01%) + + + +polyZipWith (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-32.65 (2,112 samples, 0.07%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (304 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +finderBLCoords (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +rec (759 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +go (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,376 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +pathCoords (604 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-32.65 (270 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyPadRight (1,419 samples, 0.05%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-435.5 (3,360 samples, 0.11%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +patternCoords (3,029 samples, 0.10%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (2,601 samples, 0.08%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +natXor (8,736 samples, 0.28%) + + + +map (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (12,104 samples, 0.39%) + + + +go (368 samples, 0.01%) + + + +anon-func-412.5 (637 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +correction (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyPadLeft (403 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +natXor (10,752 samples, 0.35%) + + + +anon-func-38.11 (5,008 samples, 0.16%) + + + +encode (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (2,646 samples, 0.09%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-265.5 (394 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyLeadCoeff (425 samples, 0.01%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-453.5 (274 samples, 0.01%) + + + +rec (451 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +interleave (274 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyZipWith (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (448 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +rec (2,244 samples, 0.07%) + + + +go (1,216 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-393.5 (297 samples, 0.01%) + + + +anon-func-481.5 (392 samples, 0.01%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +rec (381 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyPadRight (450 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-32.65 (810 samples, 0.03%) + + + +rec (1,938 samples, 0.06%) + + + +$lambda (576 samples, 0.02%) + + + +polyOrder (5,706 samples, 0.18%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (326 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (400 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +rec (767 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (11,200 samples, 0.36%) + + + +go (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (450 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +anon-func-453.5 (682 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-161.5 (285 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +correction (384 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (705 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-161.5 (1,320 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +polyPadLeft (505 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (27,760 samples, 0.90%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyPadRight (731 samples, 0.02%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +polySub (576 samples, 0.02%) + + + +encode (489 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +elemAdd (13,440 samples, 0.43%) + + + +correction (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyZipWith (1,193 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (1,024 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +rec (447 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +rec (2,606 samples, 0.08%) + + + +encode (1,920 samples, 0.06%) + + + +rec (965 samples, 0.03%) + + + +interleave (688 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +B_pow (24,446 samples, 0.79%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-32.65 (810 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-435.5 (6,400 samples, 0.21%) + + + +polyDivMod (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (476 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +interleave (595 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (374 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (478 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +rec (1,098 samples, 0.04%) + + + +anon-func-161.5 (1,638 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +encode (378 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +interleave (440 samples, 0.01%) + + + +polyAdd (342 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-38.11 (400 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +rec (1,602 samples, 0.05%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (9,918 samples, 0.32%) + + + +anon-func-435.5 (8,800 samples, 0.28%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +polyAdd (486 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +patternCoords (652 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyLeadCoeff (289 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-229.5 (1,188 samples, 0.04%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +interleave (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +rec (395 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-435.5 (29,568 samples, 0.96%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (289 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-435.5 (14,147 samples, 0.46%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +rec (24,642 samples, 0.80%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +rec (1,443 samples, 0.05%) + + + +encode (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +correction (489 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +generate (810 samples, 0.03%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +anon-func-51.11 (496 samples, 0.02%) + + + +interleave (403 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +rec (1,003 samples, 0.03%) + + + +map (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +rec (688 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +anon-func-38.11 (279 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (2,448 samples, 0.08%) + + + +polySub (416 samples, 0.01%) + + + +rec (12,310 samples, 0.40%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +map (271 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +elemAdd (22,848 samples, 0.74%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (306 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +go (544 samples, 0.02%) + + + +flatten (3,744 samples, 0.12%) + + + +encode (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +encode (338 samples, 0.01%) + + + +$lambda (6,768 samples, 0.22%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +toListWithLength (522 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +rec (1,296 samples, 0.04%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +toListWithLength (493 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +obj_idx<1> (578 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyTrim (5,544 samples, 0.18%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +interleave (416 samples, 0.01%) + + + +pathCoords (378 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-51.11 (286 samples, 0.01%) + + + +anon-func-48.7 (462 samples, 0.01%) + + + +map (1,408 samples, 0.05%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +rowwise (1,638 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +generate (546 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (5,557 samples, 0.18%) + + + +polyZipWith (544 samples, 0.02%) + + + +correction (403 samples, 0.01%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +interleave (5,355 samples, 0.17%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-435.5 (8,512 samples, 0.28%) + + + +encode (358 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +finderTLCoords (810 samples, 0.03%) + + + +polyDivMod (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +go (6,768 samples, 0.22%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (361 samples, 0.01%) + + + +anon-func-79.3 (12,816 samples, 0.41%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +polyDivMod (2,601 samples, 0.08%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (655 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +go (400 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +rec (4,543 samples, 0.15%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (468 samples, 0.02%) + + + +anon-func-435.5 (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (2,128 samples, 0.07%) + + + +correction (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +correction (12,002 samples, 0.39%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +rec (3,809 samples, 0.12%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (580 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-161.5 (308 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-48.7 (510 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polyAdd (325 samples, 0.01%) + + + +anon-func-453.5 (1,054 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (357 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (14,992 samples, 0.48%) + + + +pathCoords (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-265.5 (595 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-435.5 (76,800 samples, 2.48%) +an.. + + +$lambda (1,440 samples, 0.05%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +flatten (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +elemFromBits (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (18,496 samples, 0.60%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAddTerm (304 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (270 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyScale (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +foldr (351 samples, 0.01%) + + + +anon-func-161.5 (2,987 samples, 0.10%) + + + +go (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rec (1,386 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.04%) + + + +rec (561 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +rec (1,031 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (84,073 samples, 2.72%) +$l.. + + +map (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +elemDiv (384 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +rec (324 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +polyAdd (522 samples, 0.02%) + + + +encode (780 samples, 0.03%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyGrow (486 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +elemAdd (6,720 samples, 0.22%) + + + +polyDivMod (288 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyGrow (1,107 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-51.11 (9,308 samples, 0.30%) + + + +map (320 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-393.5 (637 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +polyDivMod (624 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +patternCoords (4,194 samples, 0.14%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +parse_idl_header (708 samples, 0.02%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyOrder (2,772 samples, 0.09%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (2,312 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +go (544 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +$lambda (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +toBlocks (1,664 samples, 0.05%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +finderCoords (8,086 samples, 0.26%) + + + +go (480 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-32.65 (381 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (279 samples, 0.01%) + + + +map (2,288 samples, 0.07%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (271 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (2,754 samples, 0.09%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (5,008 samples, 0.16%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (326 samples, 0.01%) + + + +polyDivMod (480 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (330 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (810 samples, 0.03%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +rec (2,808 samples, 0.09%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +anon-func-48.7 (323,033 samples, 10.44%) +anon-func-48.7 + + +anon-func-300.5 (5,696 samples, 0.18%) + + + +anon-func-435.5 (1,120 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +rec (3,432 samples, 0.11%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +toBlocks (810 samples, 0.03%) + + + +anon-func-48.7 (4,882 samples, 0.16%) + + + +go (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +rec (10,710 samples, 0.35%) + + + +map (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyOrder (2,772 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +polyMulTerm (270 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +log (3,840 samples, 0.12%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +rec (1,364 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +finderCoords (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-161.5 (1,088 samples, 0.04%) + + + +anon-func-161.5 (507 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-54.15 (1,152 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +step (340 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +encode (357 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +encode (2,288 samples, 0.07%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +elemFromBits (688 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +correction (516 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +map (1,024 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-161.5 (2,560 samples, 0.08%) + + + +rec (1,547 samples, 0.05%) + + + +correction (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (8,171 samples, 0.26%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (99,362 samples, 3.21%) +ano.. + + +polyAdd (512 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +formatCoords (652 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (2,448 samples, 0.08%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (285 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyPadLeft (325 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (289 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +scale (5,984 samples, 0.19%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-265.5 (455 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +polyAdd (832 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-435.5 (9,120 samples, 0.29%) + + + +anon-func-265.5 (315 samples, 0.01%) + + + +finderBLCoords (832 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (495 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-300.5 (306 samples, 0.01%) + + + +B_lt (6,910 samples, 0.22%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +natFromBytes (10,752 samples, 0.35%) + + + +go (544 samples, 0.02%) + + + +encode (704 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (4,480 samples, 0.14%) + + + +$lambda (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +opt_inject (323,212 samples, 10.45%) +opt_inject + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (1,750 samples, 0.06%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (595 samples, 0.02%) + + + +anon-func-79.3 (465 samples, 0.02%) + + + +interleave (2,288 samples, 0.07%) + + + +anon-func-393.5 (972 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-412.5 (1,479 samples, 0.05%) + + + +polyAdd (512 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (715 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +rec (744 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (306 samples, 0.01%) + + + +anon-func-393.5 (1,023 samples, 0.03%) + + + +anon-func-61.36 (5,728 samples, 0.19%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +encode (304 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +rec (8,112 samples, 0.26%) + + + +$lambda (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-48.7 (3,008 samples, 0.10%) + + + +pathCoords (1,764 samples, 0.06%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (572 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (3,952 samples, 0.13%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyMulTerm (384 samples, 0.01%) + + + +natXor (8,739 samples, 0.28%) + + + +encode (608 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-161.5 (2,730 samples, 0.09%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +correction (608 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (366 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +$lambda (3,456 samples, 0.11%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-435.5 (6,688 samples, 0.22%) + + + +rec (300 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +rec (988 samples, 0.03%) + + + +rec (10,905 samples, 0.35%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polyZipWith (419 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (12,936 samples, 0.42%) + + + +map (288 samples, 0.01%) + + + +map (2,304 samples, 0.07%) + + + +go (304 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +encode (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (49,536 samples, 1.60%) + + + +interleave (880 samples, 0.03%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +generate (4,194 samples, 0.14%) + + + +anon-func-51.11 (338 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-161.5 (13,821 samples, 0.45%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyScale (556 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (4,760 samples, 0.15%) + + + +polyScale (403 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (290 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +encode (810 samples, 0.03%) + + + +anon-func-48.7 (325 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-435.5 (41,344 samples, 1.34%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-435.5 (13,376 samples, 0.43%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (869 samples, 0.03%) + + + +rec (784 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (468 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (274 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-412.5 (1,674 samples, 0.05%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +traceCoords (756 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyPadRight (792 samples, 0.03%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +$lambda (496 samples, 0.02%) + + + +polyAdd (304 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +go (544 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-265.5 (450 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +rec (558 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-265.5 (495 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (2,448 samples, 0.08%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (326 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (1,024 samples, 0.03%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (317 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (558 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (6,786 samples, 0.22%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +rec (1,045 samples, 0.03%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (7,639 samples, 0.25%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (806 samples, 0.03%) + + + +rec (10,605 samples, 0.34%) + + + +anon-func-51.11 (341 samples, 0.01%) + + + +anon-func-79.3 (290 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +generate (4,194 samples, 0.14%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +interleave (608 samples, 0.02%) + + + +interleave (270 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polySub (271 samples, 0.01%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +polyPadRight (447 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (5,008 samples, 0.16%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +rec (1,365 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (13,440 samples, 0.43%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +map (527 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (384 samples, 0.01%) + + + +encode (806 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +go (532 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (1,494 samples, 0.05%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (880 samples, 0.03%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +rec (1,606 samples, 0.05%) + + + +anon-func-51.11 (560 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +$lambda (595 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,440 samples, 0.05%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (4,824 samples, 0.16%) + + + +patternCoords (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (2,176 samples, 0.07%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-393.5 (833 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +encode (364 samples, 0.01%) + + + +elemToBits (310 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (317 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +polyAdd (744 samples, 0.02%) + + + +elemAdd (28,896 samples, 0.93%) + + + +go (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (5,696 samples, 0.18%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +encode (4,194 samples, 0.14%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-435.5 (21,536 samples, 0.70%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (546 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-79.3 (5,008 samples, 0.16%) + + + +polyZipWith (1,584 samples, 0.05%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +rec (1,768 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-51.11 (27,760 samples, 0.90%) + + + +polyAdd (544 samples, 0.02%) + + + +rec (1,064 samples, 0.03%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +encode (84,073 samples, 2.72%) +en.. + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (1,766 samples, 0.06%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-300.5 (676 samples, 0.02%) + + + +encode (640 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (556 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (5,696 samples, 0.18%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-54.15 (495 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (756 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (264 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (517 samples, 0.02%) + + + +natXor (10,752 samples, 0.35%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (336 samples, 0.01%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +encode (832 samples, 0.03%) + + + +rec (935 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (279 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (465 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +rec (20,553 samples, 0.66%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (5,508 samples, 0.18%) + + + +elemMul (5,984 samples, 0.19%) + + + +rec (3,779 samples, 0.12%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +map (3,744 samples, 0.12%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +polyGrow (744 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (3,744 samples, 0.12%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (384 samples, 0.01%) + + + +anon-func-393.5 (1,209 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (446 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (1,224 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (432 samples, 0.01%) + + + +anon-func-435.5 (2,016 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,683 samples, 0.05%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +map (328 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (640 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +finderCoords (2,496 samples, 0.08%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-412.5 (370 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (42,752 samples, 1.38%) + + + +anon-func-393.5 (385 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +anon-func-79.3 (618 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAdd (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rowwise (99,362 samples, 3.21%) +row.. + + +interleave (608 samples, 0.02%) + + + +map (2,304 samples, 0.07%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (594 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (638 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +encode (624 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +rec (2,261 samples, 0.07%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (6,392 samples, 0.21%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (1,750 samples, 0.06%) + + + +map (688 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +traceCoords (357 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +interleave (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyPadRight (731 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (340 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +rec (1,771 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +generate (84,073 samples, 2.72%) +ge.. + + +polyZipWith (450 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (990 samples, 0.03%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +rec (1,116 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (880 samples, 0.03%) + + + +anon-func-481.5 (280 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-300.5 (340 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (361 samples, 0.01%) + + + +$lambda (1,040 samples, 0.03%) + + + +go (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +$lambda (1,638 samples, 0.05%) + + + +encode (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +pathCoords (378 samples, 0.01%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-54.15 (2,644 samples, 0.09%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +encode (357 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (1,056 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (2,520 samples, 0.08%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-481.5 (2,768 samples, 0.09%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +polyAdd (505 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +polyDivMod (5,008 samples, 0.16%) + + + +interleave (360 samples, 0.01%) + + + +rec (1,206 samples, 0.04%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +rec (671 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyPadRight (561 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (8,086 samples, 0.26%) + + + +map (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +correction (416 samples, 0.01%) + + + +rec (755 samples, 0.02%) + + + +anon-func-32.65 (604 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (810 samples, 0.03%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +encode (2,304 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +anon-func-161.5 (1,456 samples, 0.05%) + + + +traceCoords (357 samples, 0.01%) + + + +anon-func-246.51 (96,074 samples, 3.11%) +ano.. + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (1,632 samples, 0.05%) + + + +polySub (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (12,480 samples, 0.40%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (1,638 samples, 0.05%) + + + +encode (608 samples, 0.02%) + + + +polyAdd (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (3,451 samples, 0.11%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +map (532 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-453.5 (370 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +toList (357 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyGrow (371 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-229.5 (473 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-265.5 (275 samples, 0.01%) + + + +natZipWith (7,392 samples, 0.24%) + + + +anon-func-51.11 (1,360 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (3,456 samples, 0.11%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-161.5 (10,888 samples, 0.35%) + + + +polyTrim (648 samples, 0.02%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +toListWithLength (527 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +go (416 samples, 0.01%) + + + +rec (3,040 samples, 0.10%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (6,800 samples, 0.22%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-161.5 (1,760 samples, 0.06%) + + + +$lambda (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (14,992 samples, 0.48%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +interleave (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +rec (2,992 samples, 0.10%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (575 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +forIn (493 samples, 0.02%) + + + +anon-func-79.3 (560 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (465 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +pathCoords (342 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-32.65 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (527 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +rec (2,108 samples, 0.07%) + + + +go (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (489 samples, 0.02%) + + + +anon-func-435.5 (5,984 samples, 0.19%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (1,584 samples, 0.05%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +encode (384 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (271 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyLeadCoeff (306 samples, 0.01%) + + + +anon-func-229.5 (624 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (351 samples, 0.01%) + + + +rec (476 samples, 0.02%) + + + +$lambda (270 samples, 0.01%) + + + +map (2,448 samples, 0.08%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-161.5 (2,464 samples, 0.08%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (324 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-161.5 (4,224 samples, 0.14%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (441 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-481.5 (3,364 samples, 0.11%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (4,816 samples, 0.16%) + + + +anon-func-161.5 (1,288 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +polyPadLeft (323 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +rec (5,472 samples, 0.18%) + + + +generate (652 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (1,387 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +finderBLCoords (832 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (1,224 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (712 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (1,054 samples, 0.03%) + + + +$lambda (2,304 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +polyAdd (450 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +interleave (1,989 samples, 0.06%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (512 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +polyAdd (1,193 samples, 0.04%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +rec (976 samples, 0.03%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +pathCoords (3,029 samples, 0.10%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (645 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +anon-func-54.15 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (606 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-161.5 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-412.5 (1,023 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (1,845 samples, 0.06%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +__wasm_call_ctors (665 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +pathCoords (756 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-435.5 (42,976 samples, 1.39%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyGrow (391 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (24,192 samples, 0.78%) + + + +rec (496 samples, 0.02%) + + + +pathCoords (1,786 samples, 0.06%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +parse (360 samples, 0.01%) + + + +polyDivMod (1,768 samples, 0.06%) + + + +correction (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +anon-func-412.5 (558 samples, 0.02%) + + + +anon-func-48.7 (484 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +generate (1,224 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +map (480 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +rec (1,140 samples, 0.04%) + + + +anon-func-54.15 (3,456 samples, 0.11%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +polySub (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-161.5 (816 samples, 0.03%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (964 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (465 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (756 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-79.3 (964 samples, 0.03%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (496 samples, 0.02%) + + + +anon-func-435.5 (1,232 samples, 0.04%) + + + +go (1,920 samples, 0.06%) + + + +$lambda (1,920 samples, 0.06%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-229.5 (1,044 samples, 0.03%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-300.5 (3,382 samples, 0.11%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polySub (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-54.15 (3,456 samples, 0.11%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +foldr (760 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +go (27,760 samples, 0.90%) + + + +interleave (624 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (4,194 samples, 0.14%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +natFromBytes (28,896 samples, 0.93%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (19,200 samples, 0.62%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (1,708 samples, 0.06%) + + + +correction (1,120 samples, 0.04%) + + + +toTarget (625 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (360 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyScale (1,024 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (1,326 samples, 0.04%) + + + +rec (815 samples, 0.03%) + + + +anon-func-435.5 (7,392 samples, 0.24%) + + + +$lambda (357 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (1,496 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyAdd (640 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +patternCoords (270 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (34,656 samples, 1.12%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (384 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-453.5 (362 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +correction (360 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +pathCoords (270 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +rec (4,392 samples, 0.14%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (506 samples, 0.02%) + + + +map (403 samples, 0.01%) + + + +polyMulTerm (352 samples, 0.01%) + + + +anon-func-161.5 (1,705 samples, 0.06%) + + + +go (272 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +rec (1,195 samples, 0.04%) + + + +anon-func-300.5 (476 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +encode (704 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-481.5 (423 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (527 samples, 0.02%) + + + +anon-func-38.11 (361 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-161.5 (9,918 samples, 0.32%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyScale (439 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +patternCoords (288 samples, 0.01%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyMulTerm (484 samples, 0.02%) + + + +polyZipWith (589 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (923 samples, 0.03%) + + + +rec (315 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +map (6,768 samples, 0.22%) + + + +anon-func-300.5 (380 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (1,139 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +rec (1,088 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-48.7 (3,456 samples, 0.11%) + + + +correction (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (595 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rec (632 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (297 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (4,882 samples, 0.16%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-161.5 (2,176 samples, 0.07%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-79.3 (9,918 samples, 0.32%) + + + +anon-func-92.40 (1,598 samples, 0.05%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +map (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (289 samples, 0.01%) + + + +rec (685 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +anon-func-481.5 (2,958 samples, 0.10%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +rec (493 samples, 0.02%) + + + +anon-func-481.5 (986 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (4,480 samples, 0.14%) + + + +anon-func-79.3 (1,989 samples, 0.06%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +$lambda (496 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +rec (715 samples, 0.02%) + + + +rec (8,532 samples, 0.28%) + + + +polyAddTerm (360 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +alog (2,436 samples, 0.08%) + + + +polyZipWith (352 samples, 0.01%) + + + +rec (1,202 samples, 0.04%) + + + +interleave (2,288 samples, 0.07%) + + + +anon-func-30.36 (496 samples, 0.02%) + + + +rec (2,808 samples, 0.09%) + + + +anon-func-32.65 (652 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-481.5 (432 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +patternCoords (2,644 samples, 0.09%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-265.5 (695 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyPadRight (403 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +formatCoords (270 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +rec (627 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (606 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +rec (705 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-161.5 (1,105 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (846 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyGrow (561 samples, 0.02%) + + + +anon-func-481.5 (3,364 samples, 0.11%) + + + +anon-func-161.5 (408 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +encode (480 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (427 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (5,696 samples, 0.18%) + + + +interleave (304 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +generate (546 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +rec (8,784 samples, 0.28%) + + + +polyScale (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (897 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +anon-func-481.5 (528 samples, 0.02%) + + + +elemAdd (17,475 samples, 0.57%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (3,330 samples, 0.11%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyMulTerm (320 samples, 0.01%) + + + +rec (328 samples, 0.01%) + + + +anon-func-73.5 (69,139 samples, 2.24%) +a.. + + +correction (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (661 samples, 0.02%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-229.5 (435 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +rec (545 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +rec (517 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyDivMod (12,104 samples, 0.39%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +go (544 samples, 0.02%) + + + +toBlocks (1,040 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (2,448 samples, 0.08%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +natZipWith (80,640 samples, 2.61%) +na.. + + +encode (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (416 samples, 0.01%) + + + +obj_idx<0> (47,158 samples, 1.52%) + + + +polyAdd (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (403 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-412.5 (385 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-51.11 (462 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +encode (576 samples, 0.02%) + + + +rec (1,782 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (1,235 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polyAdd (3,840 samples, 0.12%) + + + +encode (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-30.36 (1,768 samples, 0.06%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +$lambda (1,024 samples, 0.03%) + + + +natZipWith (55,104 samples, 1.78%) + + + +polyDivMod (352 samples, 0.01%) + + + +toBlocks (1,845 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +natZipWith (25,536 samples, 0.83%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (489 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (640 samples, 0.02%) + + + +rec (1,066 samples, 0.03%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (1,040 samples, 0.03%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-412.5 (286 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-161.5 (3,168 samples, 0.10%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyGrow (935 samples, 0.03%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +$lambda (1,136 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +$lambda (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +correction (12,104 samples, 0.39%) + + + +polyDivMod (368 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +rec (1,062 samples, 0.03%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +anon-func-54.15 (8,130 samples, 0.26%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +natXor (5,376 samples, 0.17%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +go (416 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (11,454 samples, 0.37%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +toTarget (280 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (2,112 samples, 0.07%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +$lambda (1,786 samples, 0.06%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-244.5 (113,545 samples, 3.67%) +anon.. + + +anon-func-79.3 (618 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +parse (380 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +rec (1,458 samples, 0.05%) + + + +$lambda (3,744 samples, 0.12%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (2,226 samples, 0.07%) + + + +polyAdd (2,432 samples, 0.08%) + + + +correction (272 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (5,728 samples, 0.19%) + + + +correction (1,120 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +encode (408 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +interleave (326 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (731 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-453.5 (434 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +map (9,308 samples, 0.30%) + + + +map (338 samples, 0.01%) + + + +polySub (12,816 samples, 0.41%) + + + +polySub (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (516 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (1,411 samples, 0.05%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (496 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-48.7 (904 samples, 0.03%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +anon-func-161.5 (1,155 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +traceCoords (462 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (850 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-393.5 (290 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +rec (10,693 samples, 0.35%) + + + +go (272 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (328 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-161.5 (365 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (2,046 samples, 0.07%) + + + +go (1,216 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (774 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +go (576 samples, 0.02%) + + + +polyScale (624 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (2,310 samples, 0.07%) + + + +polyZipWith (832 samples, 0.03%) + + + +memcpy (3,501 samples, 0.11%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (286 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-79.3 (439 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-265.5 (2,914 samples, 0.09%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (338 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +$lambda (2,125 samples, 0.07%) + + + +encode (328 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (290 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (1,976 samples, 0.06%) + + + +go (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyMulTerm (361 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (10,240 samples, 0.33%) + + + +polyAdd (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyLeadCoeff (306 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (12,104 samples, 0.39%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-79.3 (560 samples, 0.02%) + + + +anon-func-161.5 (338 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,440 samples, 0.05%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +finderCoords (832 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +natZipWith (2,016 samples, 0.07%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +anon-func-51.11 (575 samples, 0.02%) + + + +encode (2,448 samples, 0.08%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (306 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +rec (572 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +map (4,760 samples, 0.15%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (1,683 samples, 0.05%) + + + +correction (288 samples, 0.01%) + + + +polyMulTerm (352 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (532 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (338 samples, 0.01%) + + + +anon-func-393.5 (286 samples, 0.01%) + + + +rec (4,697 samples, 0.15%) + + + +polyPadRight (558 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (845 samples, 0.03%) + + + +encode (608 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +generate (378 samples, 0.01%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +foldr (364 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +map (3,744 samples, 0.12%) + + + +anon-func-413.22 (2,166 samples, 0.07%) + + + +polySub (618 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyDivMod (480 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-481.5 (2,350 samples, 0.08%) + + + +anon-func-265.5 (520 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyMulTerm (352 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +rec (4,014 samples, 0.13%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +anon-func-435.5 (672 samples, 0.02%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +polyZipWith (384 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-229.5 (564 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +correction (416 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +correction (440 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +rec (2,304 samples, 0.07%) + + + +polySub (608 samples, 0.02%) + + + +polyMulTerm (384 samples, 0.01%) + + + +natZipWith (11,424 samples, 0.37%) + + + +anon-func-393.5 (730 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (525 samples, 0.02%) + + + +$lambda (1,683 samples, 0.05%) + + + +polyGrow (486 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +rec (1,001 samples, 0.03%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +anon-func-481.5 (316 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (532 samples, 0.02%) + + + +anon-func-300.5 (11,232 samples, 0.36%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +encode (271 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +alloc_size<2>_tag<9> (20,150 samples, 0.65%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +$lambda (465 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyScale (372 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (462 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +pathCoords (4,194 samples, 0.14%) + + + +polyAddTerm (304 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +rec (320 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (372 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +patternCoords (9,918 samples, 0.32%) + + + +polyAddTerm (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (688 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +anon-func-435.5 (10,336 samples, 0.33%) + + + +polyDivMod (544 samples, 0.02%) + + + +traceCoords (137,574 samples, 4.45%) +trace.. + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (676 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +map (3,008 samples, 0.10%) + + + +encode (1,360 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +encode (496 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +elemToBits (584 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (425 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-161.5 (4,004 samples, 0.13%) + + + +interleave (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (1,024 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +elemAdd (8,736 samples, 0.28%) + + + +anon-func-161.5 (2,728 samples, 0.09%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (360 samples, 0.01%) + + + +encode (468 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-161.5 (4,800 samples, 0.16%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (2,288 samples, 0.07%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.08%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (966 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +$lambda (342 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +$lambda (495 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +$lambda (904 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-32.65 (357 samples, 0.01%) + + + +parse_idl_header (429 samples, 0.01%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +go (12,722 samples, 0.41%) + + + +correction (1,216 samples, 0.04%) + + + +polySub (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-393.5 (432 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +encode (688 samples, 0.02%) + + + +anon-func-435.5 (8,736 samples, 0.28%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +rec (714 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +polyMulTerm (352 samples, 0.01%) + + + +rec (375 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,304 samples, 0.07%) + + + +anon-func-161.5 (1,040 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +rec (901 samples, 0.03%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (310 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-161.5 (2,112 samples, 0.07%) + + + +rec (836 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +polySub (320 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +go (384 samples, 0.01%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (5,355 samples, 0.17%) + + + +generate (756 samples, 0.02%) + + + +interleave (645 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-79.3 (9,808 samples, 0.32%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-404.5 (1,144 samples, 0.04%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (285 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +generate (2,630 samples, 0.09%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-161.5 (3,096 samples, 0.10%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyAddTerm (661 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +finderBLCoords (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +correction (384 samples, 0.01%) + + + +rec (7,690 samples, 0.25%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +polyDivMod (496 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (520 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (274 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (7,168 samples, 0.23%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +anon-func-32.65 (546 samples, 0.02%) + + + +rec (357 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +rec (902 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +interleave (1,312 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +go (297 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +$lambda (3,744 samples, 0.12%) + + + +$lambda (137,574 samples, 4.45%) +$lambda + + +map (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-161.5 (391 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (14,472 samples, 0.47%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (315 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +encode (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (1,683 samples, 0.05%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (575 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +anon-func-79.3 (8,802 samples, 0.28%) + + + +anon-func-393.5 (443 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-54.15 (342 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (6,768 samples, 0.22%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyDivMod (290 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +map (5,627 samples, 0.18%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (3,120 samples, 0.10%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-481.5 (392 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (10,752 samples, 0.35%) + + + +anon-func-161.5 (630 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +forIn (319 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +rec (1,708 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +elemToBits (1,241 samples, 0.04%) + + + +$lambda (357 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +correction (434 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyGrow (384 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (270 samples, 0.01%) + + + +anon-func-300.5 (908 samples, 0.03%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +rec (365 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyLeadCoeff (2,466 samples, 0.08%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (472 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (3,382 samples, 0.11%) + + + +correction (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +map (1,920 samples, 0.06%) + + + +rec (280 samples, 0.01%) + + + +natXor (24,192 samples, 0.78%) + + + +go (517 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (271 samples, 0.01%) + + + +anon-func-51.11 (381 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-51.11 (3,382 samples, 0.11%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +go (1,024 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (27,760 samples, 0.90%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (517 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +encode (326 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (1,024 samples, 0.03%) + + + +polyAdd (512 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +interleave (280 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyAdd (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +interleave (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,333 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +traceCoords (273 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +generate (546 samples, 0.02%) + + + +polyDivMod (403 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyMulTerm (476 samples, 0.02%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyScale (480 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (763 samples, 0.02%) + + + +anon-func-229.5 (738 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +$lambda (1,152 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +map (688 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (341 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +polyZipWith (297 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +encode (310 samples, 0.01%) + + + +anon-func-481.5 (610 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (43,776 samples, 1.42%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +elemAdd (8,736 samples, 0.28%) + + + +correction (1,120 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +encode (274 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +rec (1,139 samples, 0.04%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +correction (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-453.5 (1,116 samples, 0.04%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +natToBits (3,009 samples, 0.10%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (468 samples, 0.02%) + + + +anon-func-435.5 (1,584 samples, 0.05%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (640 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (604 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +rec (693 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-393.5 (558 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +generate (1,786 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-393.5 (360 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +encode (1,638 samples, 0.05%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (605 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (3,008 samples, 0.10%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (12,816 samples, 0.41%) + + + +polyPadRight (425 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (2,754 samples, 0.09%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-265.5 (545 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (12,816 samples, 0.41%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-161.5 (3,224 samples, 0.10%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadLeft (377 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-92.40 (2,975 samples, 0.10%) + + + +anon-func-161.5 (352 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-161.5 (520 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-51.11 (546 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-161.5 (1,764 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (19,264 samples, 0.62%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (9,308 samples, 0.30%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +natZipWith (5,376 samples, 0.17%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-229.5 (306 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polyAdd (320 samples, 0.01%) + + + +polyDivMod (290 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (1,440 samples, 0.05%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (12,896 samples, 0.42%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (1,344 samples, 0.04%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (12,104 samples, 0.39%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-32.65 (9,918 samples, 0.32%) + + + +anon-func-435.5 (25,536 samples, 0.83%) + + + +go (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +map (270 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (489 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +elemDiv (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-161.5 (3,744 samples, 0.12%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (1,584 samples, 0.05%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-79.3 (800 samples, 0.03%) + + + +anon-func-289.5 (370,725 samples, 11.99%) +anon-func-289.5 + + +anon-func-48.7 (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +encode (576 samples, 0.02%) + + + +rec (515 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (270 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +rec (469 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (1,862 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (27,296 samples, 0.88%) + + + +interleave (1,920 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +encode (342 samples, 0.01%) + + + +polyLeadCoeff (2,466 samples, 0.08%) + + + +anon-func-51.11 (638 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (11,264 samples, 0.36%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +anon-func-481.5 (352 samples, 0.01%) + + + +polyPadRight (493 samples, 0.02%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (1,145 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +finderCoords (1,224 samples, 0.04%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (9,184 samples, 0.30%) + + + +map (1,920 samples, 0.06%) + + + +patternCoords (810 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-435.5 (23,616 samples, 0.76%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +finderCoords (810 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-435.5 (24,192 samples, 0.78%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +rec (1,131 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +foldr (486 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (3,008 samples, 0.10%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-161.5 (462 samples, 0.01%) + + + +anon-func-435.5 (9,568 samples, 0.31%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +encode (5,202 samples, 0.17%) + + + +go (1,120 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +natFromBytes (22,848 samples, 0.74%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (760 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +interleave (12,104 samples, 0.39%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (317 samples, 0.01%) + + + +polyDivMod (478 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (84,073 samples, 2.72%) +an.. + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (640 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-161.5 (7,816 samples, 0.25%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (1,942 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +toTarget (1,845 samples, 0.06%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +encode (325 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-453.5 (638 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (1,024 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (816 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +correction (512 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (2,448 samples, 0.08%) + + + +anon-func-38.11 (274 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +polyAdd (832 samples, 0.03%) + + + +polySub (288 samples, 0.01%) + + + +map (1,024 samples, 0.03%) + + + +rec (1,846 samples, 0.06%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (322 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +encode (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +rec (1,890 samples, 0.06%) + + + +go (688 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (9,308 samples, 0.30%) + + + +go (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (344 samples, 0.01%) + + + +anon-func-161.5 (2,519 samples, 0.08%) + + + +anon-func-79.3 (1,638 samples, 0.05%) + + + +polyAdd (624 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-161.5 (280 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +traceCoords (756 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (756 samples, 0.02%) + + + +interleave (2,754 samples, 0.09%) + + + +anon-func-32.65 (323,033 samples, 10.44%) +anon-func-32.65 + + +anon-func-481.5 (390 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-30.36 (6,392 samples, 0.21%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +patternCoords (1,224 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (12,104 samples, 0.39%) + + + +encode (384 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +interleave (489 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +natXor (25,536 samples, 0.83%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (6,720 samples, 0.22%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (2,424 samples, 0.08%) + + + +anon-func-435.5 (3,936 samples, 0.13%) + + + +polyDivMod (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (2,754 samples, 0.09%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-229.5 (306 samples, 0.01%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +anon-func-453.5 (362 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (1,024 samples, 0.03%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (496 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-161.5 (1,122 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (19,456 samples, 0.63%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (14,992 samples, 0.48%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyPadLeft (403 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +rec (3,564 samples, 0.12%) + + + +anon-func-30.36 (271 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (19,456 samples, 0.63%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-51.11 (274 samples, 0.01%) + + + +interleave (799 samples, 0.03%) + + + +go (360 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +encode (4,194 samples, 0.14%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (688 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (419 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-30.36 (619 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (5,627 samples, 0.18%) + + + +interleave (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +forIn (609 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-161.5 (361 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-161.5 (2,392 samples, 0.08%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +rec (1,235 samples, 0.04%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +elemMul (2,992 samples, 0.10%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (286 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +correction (442 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +elemFromBits (288 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-435.5 (31,616 samples, 1.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +map (576 samples, 0.02%) + + + +rec (2,555 samples, 0.08%) + + + +interleave (1,216 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +polyTrim (5,544 samples, 0.18%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (384 samples, 0.01%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-32.65 (1,224 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +rec (1,015 samples, 0.03%) + + + +encode (342 samples, 0.01%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (2,704 samples, 0.09%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (1,989 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (512 samples, 0.02%) + + + +anon-func-79.3 (3,382 samples, 0.11%) + + + +anon-func-435.5 (4,256 samples, 0.14%) + + + +step (459 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +$lambda (964 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-481.5 (296 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-51.11 (880 samples, 0.03%) + + + +anon-func-51.11 (289 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +correction (306 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +$lambda (416 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-435.5 (3,040 samples, 0.10%) + + + +map (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +$lambda (272 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (960 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (1,408 samples, 0.05%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadRight (731 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (3,456 samples, 0.11%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyGrow (300 samples, 0.01%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (1,518 samples, 0.05%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +polyGrow (485 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +elemNew (645 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +elemAdd (47,040 samples, 1.52%) + + + +correction (544 samples, 0.02%) + + + +rec (1,243 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-161.5 (2,226 samples, 0.07%) + + + +encode (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +polyMulTerm (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (972 samples, 0.03%) + + + +map (270 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +$lambda (3,744 samples, 0.12%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (618 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (468 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +rec (1,598 samples, 0.05%) + + + +correction (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +encode (289 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-161.5 (310 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (1,496 samples, 0.05%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (4,194 samples, 0.14%) + + + +interleave (1,040 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-161.5 (546 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +toTarget (2,125 samples, 0.07%) + + + +anon-func-435.5 (9,248 samples, 0.30%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +rec (9,279 samples, 0.30%) + + + +map (304 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (832 samples, 0.03%) + + + +pathCoords (832 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +anon-func-54.15 (3,456 samples, 0.11%) + + + +encode (326 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (676 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +correction (12,816 samples, 0.41%) + + + +anon-func-54.15 (273 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (378 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyMulTerm (384 samples, 0.01%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (729 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +polySub (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,560 samples, 0.08%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +interleave (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (360 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +rec (872 samples, 0.03%) + + + +polyPadLeft (391 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +go (384 samples, 0.01%) + + + +interleave (5,728 samples, 0.19%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (3,008 samples, 0.10%) + + + +go (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (480 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (38,400 samples, 1.24%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (1,786 samples, 0.06%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-412.5 (767 samples, 0.02%) + + + +rec (1,165 samples, 0.04%) + + + +anon-func-48.7 (575 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +map (320 samples, 0.01%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +encode (5,728 samples, 0.19%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +encode (4,194 samples, 0.14%) + + + +elemFromBits (608 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +rec (748 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +rec (984 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +pathCoords (342 samples, 0.01%) + + + +polyLeadCoeff (595 samples, 0.02%) + + + +polyZipWith (403 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +polyAdd (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-161.5 (319 samples, 0.01%) + + + +anon-func-51.11 (496 samples, 0.02%) + + + +polyZipWith (403 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +natXor (10,752 samples, 0.35%) + + + +map (608 samples, 0.02%) + + + +elemFromBits (289 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +$lambda (326 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (850 samples, 0.03%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (338 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (2,496 samples, 0.08%) + + + +polyPadLeft (342 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +map (6,768 samples, 0.22%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-435.5 (34,016 samples, 1.10%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyPadLeft (486 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (11,008 samples, 0.36%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (341 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (2,601 samples, 0.08%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (468 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +compacting_gc (1,344 samples, 0.04%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyNew (486 samples, 0.02%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (3,808 samples, 0.12%) + + + +anon-func-300.5 (3,008 samples, 0.10%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +rec (19,728 samples, 0.64%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +map (326 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (1,224 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +rec (2,574 samples, 0.08%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-161.5 (2,992 samples, 0.10%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +rec (14,304 samples, 0.46%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +correction (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyPadLeft (403 samples, 0.01%) + + + +rec (312 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (480 samples, 0.02%) + + + +anon-func-435.5 (10,288 samples, 0.33%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyDivMod (624 samples, 0.02%) + + + +polyAdd (342 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (661 samples, 0.02%) + + + +anon-func-161.5 (1,088 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (810 samples, 0.03%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (5,008 samples, 0.16%) + + + +correction (416 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +rec (2,057 samples, 0.07%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-481.5 (2,030 samples, 0.07%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (513 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-161.5 (9,808 samples, 0.32%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (1,216 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (368 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +elemFromBits (374 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +rec (2,404 samples, 0.08%) + + + +anon-func-32.65 (2,496 samples, 0.08%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (290 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +toBlocks (640 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +rec (1,751 samples, 0.06%) + + + +go (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyZipWith (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (624 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (446 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-30.36 (489 samples, 0.02%) + + + +go (270 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +map (442 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +encode (3,456 samples, 0.11%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (289 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (384 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +go (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-161.5 (6,256 samples, 0.20%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +go (352 samples, 0.01%) + + + +anon-func-161.5 (590 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +rec (355 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (2,094 samples, 0.07%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (1,121 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (468 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (20,576 samples, 0.67%) + + + +interleave (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +rec (17,158 samples, 0.55%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (284 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (306 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +patternCoords (2,112 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +correction (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-453.5 (300 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +$lambda (306 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (6,768 samples, 0.22%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-229.5 (1,118 samples, 0.04%) + + + +rec (3,172 samples, 0.10%) + + + +polyZipWith (512 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +rec (1,304 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +polyAdd (704 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-481.5 (464 samples, 0.02%) + + + +polySub (270 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +go (496 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (1,612 samples, 0.05%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (2,634 samples, 0.09%) + + + +encode (1,326 samples, 0.04%) + + + +anon-func-51.11 (317 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (5,984 samples, 0.19%) + + + +polyAddTerm (6,768 samples, 0.22%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +correction (320 samples, 0.01%) + + + +polyZipWith (299 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-161.5 (896 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +encode (374 samples, 0.01%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +anon-func-300.5 (14,992 samples, 0.48%) + + + +polyDivMod (360 samples, 0.01%) + + + +anon-func-54.15 (652 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-300.5 (798 samples, 0.03%) + + + +anon-func-48.7 (372 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +$lambda (480 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyScale (352 samples, 0.01%) + + + +anon-func-161.5 (604 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +encode (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (419 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +map (496 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +rec (9,999 samples, 0.32%) + + + +interleave (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-265.5 (3,754 samples, 0.12%) + + + +$lambda (576 samples, 0.02%) + + + +natFromBits (289 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polySub (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (1,102 samples, 0.04%) + + + +anon-func-38.11 (516 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +rec (954 samples, 0.03%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (676 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +natFromBits (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyPadLeft (414 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +flatten (468 samples, 0.02%) + + + +pathCoords (462 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (372 samples, 0.01%) + + + +encode (286 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +interleave (608 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +rec (1,024 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyLen (19,944 samples, 0.64%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyAdd (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +elemAdd (25,536 samples, 0.83%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +interleave (272 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +elemMul (1,408 samples, 0.05%) + + + +correction (688 samples, 0.02%) + + + +anon-func-51.11 (340 samples, 0.01%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (273 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyMulTerm (288 samples, 0.01%) + + + +$lambda (532 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-30.36 (676 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +map (317 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polySub (416 samples, 0.01%) + + + +polyZipWith (450 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (7,860 samples, 0.25%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (1,037 samples, 0.03%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (8,130 samples, 0.26%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (575 samples, 0.02%) + + + +elemMul (5,320 samples, 0.17%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyGrow (731 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-481.5 (2,516 samples, 0.08%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (286 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +elemNew (344 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyPadRight (289 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-453.5 (682 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (289 samples, 0.01%) + + + +rec (1,887 samples, 0.06%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +anon-func-435.5 (46,208 samples, 1.49%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (275 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +natToBits (2,301 samples, 0.07%) + + + +map (8,758 samples, 0.28%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (624 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (624 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (2,688 samples, 0.09%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (406 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +elemAdd (17,472 samples, 0.56%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyLeadCoeff (1,507 samples, 0.05%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,984 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +encode (595 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (270 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +anon-func-481.5 (1,098 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (462 samples, 0.01%) + + + +anon-func-161.5 (455 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (760 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +generate (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +patternCoords (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +rec (1,008 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +toList (522 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +correction (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (6,898 samples, 0.22%) + + + +encode (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-229.5 (3,751 samples, 0.12%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-393.5 (957 samples, 0.03%) + + + +traceCoords (99,362 samples, 3.21%) +tra.. + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +encode (1,764 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (400 samples, 0.01%) + + + +anon-func-48.7 (2,634 samples, 0.09%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +rec (904 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-38.11 (442 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-68.41 (10,752 samples, 0.35%) + + + +map (272 samples, 0.01%) + + + +elemMul (1,408 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (1,664 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (363 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +go (270 samples, 0.01%) + + + +finderCoords (832 samples, 0.03%) + + + +elemAdd (10,752 samples, 0.35%) + + + +interleave (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +rec (393 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rec (405 samples, 0.01%) + + + +toTarget (280 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (289 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +$lambda (3,032 samples, 0.10%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (14,992 samples, 0.48%) + + + +map (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-54.15 (1,764 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (310 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (3,445 samples, 0.11%) + + + +anon-func-481.5 (462 samples, 0.01%) + + + +anon-func-161.5 (391 samples, 0.01%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +rec (1,513 samples, 0.05%) + + + +anon-func-481.5 (986 samples, 0.03%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +correction (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (12,104 samples, 0.39%) + + + +polyZipWith (608 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +anon-func-161.5 (1,583 samples, 0.05%) + + + +rec (448 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyGrow (522 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyZipWith (289 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (1,660 samples, 0.05%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (315 samples, 0.01%) + + + +rec (1,802 samples, 0.06%) + + + +anon-func-79.3 (1,768 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +polyAdd (1,584 samples, 0.05%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (661 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-435.5 (7,744 samples, 0.25%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +$lambda (2,704 samples, 0.09%) + + + +correction (304 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +natToBits (1,416 samples, 0.05%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-435.5 (17,920 samples, 0.58%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +go (496 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +rec (539 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (1,764 samples, 0.06%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-393.5 (1,062 samples, 0.03%) + + + +go (810 samples, 0.03%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +go (1,312 samples, 0.04%) + + + +polyAddTerm (352 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (430 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (516 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +natXor (13,440 samples, 0.43%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (944 samples, 0.03%) + + + +anon-func-387.7 (399 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +interleave (1,058 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (799 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-161.5 (2,120 samples, 0.07%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (1,129 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-32.65 (2,112 samples, 0.07%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (274 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-481.5 (2,726 samples, 0.09%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-453.5 (346 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-32.65 (270 samples, 0.01%) + + + +anon-func-48.7 (4,194 samples, 0.14%) + + + +polySub (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (3,008 samples, 0.10%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +go (486 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +rec (14,923 samples, 0.48%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +patternCoords (1,152 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +polyZipWith (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (5,184 samples, 0.17%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +rec (2,353 samples, 0.08%) + + + +anon-func-161.5 (896 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (442 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +anon-func-79.3 (640 samples, 0.02%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +go (272 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-32.65 (462 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (286 samples, 0.01%) + + + +log (3,072 samples, 0.10%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-481.5 (1,008 samples, 0.03%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-453.5 (1,003 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-435.5 (13,312 samples, 0.43%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +elemAdd (12,096 samples, 0.39%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (595 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-54.15 (810 samples, 0.03%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +$lambda (310 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (455 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (6,768 samples, 0.22%) + + + +rec (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +parse (491 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (434 samples, 0.01%) + + + +anon-func-481.5 (2,030 samples, 0.07%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (358 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (556 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-453.5 (3,422 samples, 0.11%) + + + +interleave (352 samples, 0.01%) + + + +natXor (5,376 samples, 0.17%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (283 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +correction (624 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (341 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (2,250 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +go (270 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +go (480 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (317 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-79.3 (575 samples, 0.02%) + + + +anon-func-300.5 (306 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +rec (276 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyPadRight (485 samples, 0.02%) + + + +anon-func-51.11 (357 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyAdd (704 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +rec (1,135 samples, 0.04%) + + + +rec (315 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +generate (604 samples, 0.02%) + + + +anon-func-51.11 (2,496 samples, 0.08%) + + + +anon-func-38.11 (575 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +anon-func-79.3 (2,312 samples, 0.07%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (618 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyGrow (403 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (99,362 samples, 3.21%) +ano.. + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (322 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (559 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (2,754 samples, 0.09%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyGrow (493 samples, 0.02%) + + + +anon-func-30.36 (289 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (42,204 samples, 1.36%) + + + +anon-func-161.5 (1,224 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +polyZipWith (306 samples, 0.01%) + + + +init (472 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (2,816 samples, 0.09%) + + + +anon-func-161.5 (324 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +rec (808 samples, 0.03%) + + + +anon-func-435.5 (14,080 samples, 0.46%) + + + +interleave (575 samples, 0.02%) + + + +anon-func-435.5 (3,344 samples, 0.11%) + + + +interleave (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-435.5 (45,152 samples, 1.46%) + + + +interleave (338 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (638 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (274 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (440 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +go (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (26,144 samples, 0.85%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +B+sub (595 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +$lambda (2,304 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyScale (283 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +elemMul (3,256 samples, 0.11%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (624 samples, 0.02%) + + + +polyPadRight (429 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (540 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-435.5 (5,984 samples, 0.19%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +rec (459 samples, 0.01%) + + + +anon-func-32.65 (546 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +toBlocks (2,304 samples, 0.07%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +encode (352 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-481.5 (622 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (289 samples, 0.01%) + + + +polyAddTerm (496 samples, 0.02%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +interleave (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +natZipWith (4,032 samples, 0.13%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +toBlocks (5,398 samples, 0.17%) + + + +pathCoords (832 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +polyGrow (275 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +map (384 samples, 0.01%) + + + +polyGrow (341 samples, 0.01%) + + + +anon-func-161.5 (1,003 samples, 0.03%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +encode (416 samples, 0.01%) + + + +anon-func-229.5 (676 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (532 samples, 0.02%) + + + +anon-func-435.5 (11,616 samples, 0.38%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +natFromBits (391 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +go (306 samples, 0.01%) + + + +polyOrder (5,389 samples, 0.17%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyPadRight (561 samples, 0.02%) + + + +polyAdd (1,107 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-51.11 (5,627 samples, 0.18%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (1,067 samples, 0.03%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +elemMul (14,984 samples, 0.48%) + + + +anon-func-481.5 (1,242 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +$lambda (544 samples, 0.02%) + + + +go (624 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +polyMulTerm (527 samples, 0.02%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (645 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyMulTerm (352 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (10,768 samples, 0.35%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (289 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +rec (671 samples, 0.02%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +elemAdd (7,392 samples, 0.24%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-453.5 (346 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyZipWith (409 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,440 samples, 0.05%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-61.36 (2,304 samples, 0.07%) + + + +polySub (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (280 samples, 0.01%) + + + +patternCoords (8,086 samples, 0.26%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (575 samples, 0.02%) + + + +$lambda (496 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +anon-func-30.36 (2,704 samples, 0.09%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (372 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +pathCoords (4,194 samples, 0.14%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyPadRight (495 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (338 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +rec (1,265 samples, 0.04%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +go (270 samples, 0.01%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAdd (378 samples, 0.01%) + + + +anon-func-48.7 (2,125 samples, 0.07%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-300.5 (368 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (2,704 samples, 0.09%) + + + +polyZipWith (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +go (480 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-481.5 (774 samples, 0.03%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +elemAdd (14,784 samples, 0.48%) + + + +anon-func-246.51 (370,725 samples, 11.99%) +anon-func-246.51 + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +interleave (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +encode (756 samples, 0.02%) + + + +anon-func-54.15 (1,786 samples, 0.06%) + + + +go (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (624 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (3,580 samples, 0.12%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +$lambda (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-435.5 (3,648 samples, 0.12%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,000 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (4,620 samples, 0.15%) + + + +anon-func-79.3 (6,392 samples, 0.21%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-300.5 (306 samples, 0.01%) + + + +@deserialize_go<v(Version:N)> (342 samples, 0.01%) + + + +padLeft (434 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (595 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +correction (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +rec (11,715 samples, 0.38%) + + + +$lambda (576 samples, 0.02%) + + + +encode (8,758 samples, 0.28%) + + + +anon-func-161.5 (2,720 samples, 0.09%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +toListWithLength (1,262 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-161.5 (538 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +toListWithLength (357 samples, 0.01%) + + + +anon-func-44.5 (14,780 samples, 0.48%) + + + +map (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +scale (2,992 samples, 0.10%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +correction (306 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +rec (291 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (273 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +elemMul (2,992 samples, 0.10%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +foldr (297 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +anon-func-435.5 (17,024 samples, 0.55%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +rec (360 samples, 0.01%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +polyZipWith (512 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +interleave (8,758 samples, 0.28%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-54.15 (4,194 samples, 0.14%) + + + +polyAdd (352 samples, 0.01%) + + + +polyMulTerm (517 samples, 0.02%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +polyMulTerm (279 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +anon-func-435.5 (13,440 samples, 0.43%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (1,434 samples, 0.05%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +correction (624 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyScale (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (462 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (42,240 samples, 1.37%) + + + +correction (416 samples, 0.01%) + + + +anon-func-412.5 (396 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyOrder (2,618 samples, 0.08%) + + + +anon-func-54.15 (780 samples, 0.03%) + + + +polyAdd (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +elemMul (1,760 samples, 0.06%) + + + +correction (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (5,627 samples, 0.18%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +$lambda (1,040 samples, 0.03%) + + + +interleave (280 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +polyZipWith (319 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +B_sub (7,455 samples, 0.24%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (584 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (702 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyGrow (527 samples, 0.02%) + + + +rec (1,506 samples, 0.05%) + + + +anon-func-48.7 (378 samples, 0.01%) + + + +toList (522 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +encode (12,816 samples, 0.41%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +rec (2,916 samples, 0.09%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +encode (2,754 samples, 0.09%) + + + +map (1,920 samples, 0.06%) + + + +polyAddTerm (416 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-435.5 (1,584 samples, 0.05%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +map (516 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +rec (1,460 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +elemAdd (10,752 samples, 0.35%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-453.5 (434 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (6,560 samples, 0.21%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (3,538 samples, 0.11%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +generate (832 samples, 0.03%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +encode (352 samples, 0.01%) + + + +rec (425 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +rec (803 samples, 0.03%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (465 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-51.11 (285 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +correction (419 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (270 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (735 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyPadRight (371 samples, 0.01%) + + + +$lambda (489 samples, 0.02%) + + + +anon-func-300.5 (289 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-435.5 (14,080 samples, 0.46%) + + + +$lambda (468 samples, 0.02%) + + + +anon-func-79.3 (6,392 samples, 0.21%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-265.5 (975 samples, 0.03%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +rec (273 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +go (408 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (465 samples, 0.02%) + + + +anon-func-48.7 (322 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +correction (416 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyLeadCoeff (2,466 samples, 0.08%) + + + +correction (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +natFromBytes (17,472 samples, 0.56%) + + + +anon-func-38.11 (575 samples, 0.02%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +anon-func-79.3 (510 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +encode (2,125 samples, 0.07%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (326 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +anon-func-79.3 (440 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +go (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (403 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (384 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +encode (532 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +elemAdd (12,768 samples, 0.41%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-161.5 (595 samples, 0.02%) + + + +map (1,664 samples, 0.05%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +natXor (4,032 samples, 0.13%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (12,104 samples, 0.39%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (289 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (4,194 samples, 0.14%) + + + +anon-func-481.5 (990 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +$lambda (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (306 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (450 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (310 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (1,058 samples, 0.03%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-300.5 (400 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (403 samples, 0.01%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (799 samples, 0.03%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-265.5 (440 samples, 0.01%) + + + +generate (320 samples, 0.01%) + + + +correction (3,580 samples, 0.12%) + + + +$lambda (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +correction (290 samples, 0.01%) + + + +anon-func-48.7 (4,466 samples, 0.14%) + + + +anon-func-300.5 (290 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyGrow (763 samples, 0.02%) + + + +rec (726 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (137,574 samples, 4.45%) +anon-.. + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyMulTerm (320 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-51.11 (403 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (290 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +foldr (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-265.5 (825 samples, 0.03%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +rec (408 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +rec (995 samples, 0.03%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +correction (510 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-54.15 (1,224 samples, 0.04%) + + + +anon-func-435.5 (15,811 samples, 0.51%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +natFromBits (608 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (12,104 samples, 0.39%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (600 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +encode (1,024 samples, 0.03%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (882 samples, 0.03%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-38.11 (496 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +correction (688 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +anon-func-453.5 (806 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (5,508 samples, 0.18%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-265.5 (1,234 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +finderBLCoords (810 samples, 0.03%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (361 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (1,136 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-161.5 (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (1,588 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +flatten (1,136 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,120 samples, 0.04%) + + + +anon-func-265.5 (455 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyPadLeft (1,021 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (546 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +polyOrder (2,536 samples, 0.08%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (378 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +rec (1,534 samples, 0.05%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +correction (576 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (270 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (516 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +encode (2,563 samples, 0.08%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-244.5 (704 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-246.51 (157,212 samples, 5.08%) +anon-f.. + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (1,058 samples, 0.03%) + + + +$lambda (378 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (465 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (618 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-229.5 (861 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +correction (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (2,124 samples, 0.07%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +encode (1,518 samples, 0.05%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (6,552 samples, 0.21%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-435.5 (26,752 samples, 0.86%) + + + +rec (1,710 samples, 0.06%) + + + +polySub (608 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-133.5 (13,244 samples, 0.43%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyOrder (306 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyPadLeft (341 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (495 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-161.5 (1,344 samples, 0.04%) + + + +correction (624 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,520 samples, 0.05%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +pathCoords (99,362 samples, 3.21%) +pat.. + + +correction (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +natXor (22,848 samples, 0.74%) + + + +anon-func-435.5 (1,600 samples, 0.05%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +traceCoords (780 samples, 0.03%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +go (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-161.5 (3,256 samples, 0.11%) + + + +polyAdd (512 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +polySub (272 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-265.5 (1,265 samples, 0.04%) + + + +$lambda (625 samples, 0.02%) + + + +anon-func-435.5 (22,816 samples, 0.74%) + + + +polyDivMod (306 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +polyScale (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +generate (342 samples, 0.01%) + + + +rec (2,988 samples, 0.10%) + + + +map (341 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (270 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (726 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (3,008 samples, 0.10%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +anon-func-48.7 (368 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +correction (416 samples, 0.01%) + + + +rec (429 samples, 0.01%) + + + +anon-func-435.5 (10,816 samples, 0.35%) + + + +polyGrow (377 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +rec (2,142 samples, 0.07%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +$lambda (5,202 samples, 0.17%) + + + +polyAdd (512 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +anon-func-38.11 (5,696 samples, 0.18%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-54.15 (378 samples, 0.01%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-161.5 (551 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +toBlocks (1,520 samples, 0.05%) + + + +rec (803 samples, 0.03%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +rec (952 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (264 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (1,000 samples, 0.03%) + + + +encode (270 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-161.5 (425 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +rec (612 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +$lambda (9,308 samples, 0.30%) + + + +encode (400 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +rec (848 samples, 0.03%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-161.5 (384 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (9,808 samples, 0.32%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (616 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (6,768 samples, 0.22%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +pathCoords (4,194 samples, 0.14%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +rec (1,335 samples, 0.04%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (604 samples, 0.02%) + + + +anon-func-435.5 (7,904 samples, 0.26%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-435.5 (8,192 samples, 0.26%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (528 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +interleave (306 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (1,136 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyZipWith (414 samples, 0.01%) + + + +$lambda (419 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (4,208 samples, 0.14%) + + + +go (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (3,440 samples, 0.11%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +interleave (1,312 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +encode (756 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +go (320 samples, 0.01%) + + + +polyAdd (310 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +natZipWith (5,376 samples, 0.17%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polySub (317 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (468 samples, 0.02%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (8,211 samples, 0.27%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyScale (306 samples, 0.01%) + + + +anon-func-161.5 (360 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (522 samples, 0.02%) + + + +anon-func-265.5 (990 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +anon-func-453.5 (346 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (13,376 samples, 0.43%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +$lambda (280 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (532 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +rec (1,062 samples, 0.03%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +pathCoords (2,630 samples, 0.09%) + + + +polyScale (374 samples, 0.01%) + + + +anon-func-32.65 (3,032 samples, 0.10%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +rec (1,177 samples, 0.04%) + + + +rowwise (323,033 samples, 10.44%) +rowwise + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (468 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (2,538 samples, 0.08%) + + + +correction (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +correction (290 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +anon-func-161.5 (949 samples, 0.03%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +encode (272 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (8,048 samples, 0.26%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (638 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-265.5 (600 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-161.5 (13,960 samples, 0.45%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,089 samples, 0.04%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +polyDivMod (480 samples, 0.02%) + + + +polyScale (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +elemDiv (480 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (14,992 samples, 0.48%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-51.11 (754 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +finderCoords (832 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +padLeft (413 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +patternCoords (3,456 samples, 0.11%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (1,989 samples, 0.06%) + + + +interleave (272 samples, 0.01%) + + + +interleave (408 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +anon-func-161.5 (1,241 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (12,384 samples, 0.40%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +anon-func-51.11 (489 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (1,360 samples, 0.04%) + + + +anon-func-161.5 (396 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-481.5 (406 samples, 0.01%) + + + +map (5,696 samples, 0.18%) + + + +map (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +natZipWith (24,192 samples, 0.78%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-161.5 (301 samples, 0.01%) + + + +go (14,992 samples, 0.48%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyAddTerm (304 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (1,055 samples, 0.03%) + + + +correction (608 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-30.36 (5,008 samples, 0.16%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +polyScale (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-435.5 (51,072 samples, 1.65%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +interleave (496 samples, 0.02%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +rec (14,094 samples, 0.46%) + + + +go (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +elemFromBits (364 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (3,872 samples, 0.13%) + + + +go (2,601 samples, 0.08%) + + + +polyAddTerm (304 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +$lambda (661 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (556 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-265.5 (1,755 samples, 0.06%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +encode (306 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +elemFromBits (374 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +rec (495 samples, 0.02%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +anon-func-481.5 (952 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +go (608 samples, 0.02%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +polyZipWith (608 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-32.65 (99,362 samples, 3.21%) +ano.. + + +anon-func-481.5 (900 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +polyPadRight (486 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +anon-func-481.5 (939 samples, 0.03%) + + + +encode (1,024 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyPadLeft (485 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-32.65 (1,786 samples, 0.06%) + + + +go (434 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +polyZipWith (486 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +encode (416 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyDivMod (12,816 samples, 0.41%) + + + +anon-func-481.5 (432 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +anon-func-161.5 (576 samples, 0.02%) + + + +flatten (338 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (439 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +polyDivMod (496 samples, 0.02%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (2,592 samples, 0.08%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (1,098 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +rec (764 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +rec (1,259 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (394 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (986 samples, 0.03%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (306 samples, 0.01%) + + + +map (289 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +polyMulTerm (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (19,261 samples, 0.62%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +anon-func-435.5 (8,640 samples, 0.28%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (274 samples, 0.01%) + + + +correction (328 samples, 0.01%) + + + +anon-func-161.5 (2,816 samples, 0.09%) + + + +polyScale (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +natFromBits (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +interleave (1,360 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +nat_sub (7,455 samples, 0.24%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (594 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +correction (2,448 samples, 0.08%) + + + +go (272 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +$lambda (624 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +$lambda (290 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (49,920 samples, 1.61%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +$lambda (1,360 samples, 0.04%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +polyPadRight (409 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +finderCoords (810 samples, 0.03%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (558 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +encode (8,086 samples, 0.26%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +$lambda (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (575 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +pathCoords (756 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +rec (770 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (14,992 samples, 0.48%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (408 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (363 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-161.5 (649 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +correction (270 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-54.15 (270 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-32.65 (3,456 samples, 0.11%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-38.11 (290 samples, 0.01%) + + + +anon-func-51.11 (6,392 samples, 0.21%) + + + +rec (461 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (378 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +polyMulTerm (624 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +toTarget (800 samples, 0.03%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (525 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +rec (649 samples, 0.02%) + + + +$lambda (618 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +generate (273 samples, 0.01%) + + + +polySub (360 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (1,845 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (1,232 samples, 0.04%) + + + +rec (1,155 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +correction (624 samples, 0.02%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +polySub (608 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +polyDivMod (289 samples, 0.01%) + + + +natFromBits (374 samples, 0.01%) + + + +polyScale (1,024 samples, 0.03%) + + + +polySub (416 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +encode (1,764 samples, 0.06%) + + + +rec (1,164 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-435.5 (3,040 samples, 0.10%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +rec (327 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +rec (731 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (2,304 samples, 0.07%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (319 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +polyMulTerm (320 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (6,720 samples, 0.22%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyPadLeft (1,279 samples, 0.04%) + + + +toTarget (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-161.5 (1,792 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-32.65 (378 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (484 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polySub (320 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +map (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (342 samples, 0.01%) + + + +rec (1,206 samples, 0.04%) + + + +$lambda (317 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +encode (1,000 samples, 0.03%) + + + +finderCoords (1,152 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +map (1,312 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +polyGrow (414 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyPadRight (299 samples, 0.01%) + + + +anon-func-435.5 (5,472 samples, 0.18%) + + + +anon-func-32.65 (546 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +anon-func-161.5 (1,344 samples, 0.04%) + + + +interleave (2,288 samples, 0.07%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +rec (440 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (6,768 samples, 0.22%) + + + +rec (15,389 samples, 0.50%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyPadLeft (558 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +padLeftTo (3,994 samples, 0.13%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +encode (320 samples, 0.01%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-161.5 (1,360 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (1,124 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +rec (384 samples, 0.01%) + + + +encode (756 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (279 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-30.36 (560 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +$lambda (756 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +pathCoords (342 samples, 0.01%) + + + +anon-func-48.7 (271 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +generate (9,918 samples, 0.32%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +natFromBits (326 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +rec (2,718 samples, 0.09%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (486 samples, 0.02%) + + + +encode (1,024 samples, 0.03%) + + + +polySub (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +rec (5,600 samples, 0.18%) + + + +encode (320 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +elemAdd (80,640 samples, 2.61%) +el.. + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,152 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-393.5 (630 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +$lambda (480 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (3,008 samples, 0.10%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +rec (4,140 samples, 0.13%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (4,760 samples, 0.15%) + + + +rec (377 samples, 0.01%) + + + +anon-func-161.5 (1,183 samples, 0.04%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-300.5 (340 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +go (480 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (465 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (2,704 samples, 0.09%) + + + +polyAddTerm (304 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +map (328 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (1,008 samples, 0.03%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +anon-func-79.3 (966 samples, 0.03%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (1,563 samples, 0.05%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +go (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-161.5 (1,024 samples, 0.03%) + + + +encode (1,120 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +natZipWith (14,784 samples, 0.48%) + + + +encode (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (6,768 samples, 0.22%) + + + +$lambda (1,216 samples, 0.04%) + + + +$lambda (3,744 samples, 0.12%) + + + +anon-func-48.7 (546 samples, 0.02%) + + + +natFromBytes (5,376 samples, 0.17%) + + + +polyPadRight (297 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-229.5 (763 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +can_tag_i64 (105,744 samples, 3.42%) +can.. + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +correction (688 samples, 0.02%) + + + +anon-func-229.5 (270 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (689 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyPadLeft (299 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (556 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-481.5 (296 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natXor (5,376 samples, 0.17%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +polyGrow (306 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (2,646 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (323 samples, 0.01%) + + + +rec (2,496 samples, 0.08%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-73.5 (187,832 samples, 6.07%) +anon-fun.. + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (4,128 samples, 0.13%) + + + +go (1,120 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (414 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-51.11 (360 samples, 0.01%) + + + +blob_of_principal (815 samples, 0.03%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (376 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (20,640 samples, 0.67%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (403 samples, 0.01%) + + + +natXor (22,848 samples, 0.74%) + + + +anon-func-435.5 (6,400 samples, 0.21%) + + + +anon-func-51.11 (2,304 samples, 0.07%) + + + +go (351 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +polySub (1,920 samples, 0.06%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +correction (1,440 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-51.11 (360 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +elemFromBits (326 samples, 0.01%) + + + +anon-func-435.5 (7,491 samples, 0.24%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-435.5 (57,600 samples, 1.86%) +a.. + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (289 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-161.5 (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (53,732 samples, 1.74%) + + + +anon-func-51.11 (510 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (5,168 samples, 0.17%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +polyMulTerm (283 samples, 0.01%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +polyDivMod (289 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +rec (522 samples, 0.02%) + + + +anon-func-79.3 (652 samples, 0.02%) + + + +correction (14,992 samples, 0.48%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +encode (289 samples, 0.01%) + + + +anon-func-79.3 (484 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-412.5 (744 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (532 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (640 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (748 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +anon-func-265.5 (1,595 samples, 0.05%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +elemMul (4,224 samples, 0.14%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyScale (624 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (2,448 samples, 0.08%) + + + +interleave (576 samples, 0.02%) + + + +natFromBits (364 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +rec (1,088 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +compacting_gc (525 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (306 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (2,310 samples, 0.07%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyPadLeft (425 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-412.5 (702 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (341 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +map (360 samples, 0.01%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (14,992 samples, 0.48%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (340 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (361 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (6,246 samples, 0.20%) + + + +rec (767 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +rec (754 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +interleave (688 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (1,152 samples, 0.04%) + + + +pathCoords (704 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +generate (832 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (310 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (12,816 samples, 0.41%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (384 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +remember_continuation (3,683 samples, 0.12%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +correction (270 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +encode (416 samples, 0.01%) + + + +pathCoords (8,086 samples, 0.26%) + + + +anon-func-30.36 (338 samples, 0.01%) + + + +elemDiv (544 samples, 0.02%) + + + +anon-func-435.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +rec (432 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (803 samples, 0.03%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyZipWith (342 samples, 0.01%) + + + +anon-func-393.5 (767 samples, 0.02%) + + + +rec (891 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (560 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +polyDivMod (304 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +anon-func-48.7 (3,580 samples, 0.12%) + + + +correction (288 samples, 0.01%) + + + +pathCoords (704 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-300.5 (3,856 samples, 0.12%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +interleave (368 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +$lambda (286 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-161.5 (5,904 samples, 0.19%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-435.5 (10,080 samples, 0.33%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (619 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (2,052 samples, 0.07%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (3,348 samples, 0.11%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +$lambda (2,496 samples, 0.08%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (2,754 samples, 0.09%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +interleave (3,744 samples, 0.12%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (849 samples, 0.03%) + + + +anon-func-161.5 (2,668 samples, 0.09%) + + + +polySub (544 samples, 0.02%) + + + +rec (4,770 samples, 0.15%) + + + +map (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyAdd (849 samples, 0.03%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +anon-func-481.5 (3,364 samples, 0.11%) + + + +anon-func-79.3 (340 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-48.7 (403 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +encode (381 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (8,960 samples, 0.29%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +go (1,496 samples, 0.05%) + + + +rec (480 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (2,112 samples, 0.07%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-161.5 (1,904 samples, 0.06%) + + + +go (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +rec (976 samples, 0.03%) + + + +rec (1,040 samples, 0.03%) + + + +anon-func-300.5 (489 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +pathCoords (137,574 samples, 4.45%) +pathC.. + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyOrder (12,442 samples, 0.40%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +go (480 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +rec (1,105 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +rec (390 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,496 samples, 0.05%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (1,024 samples, 0.03%) + + + +encode (289 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +rec (4,392 samples, 0.14%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-99.14 (377 samples, 0.01%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +natZipWith (5,376 samples, 0.17%) + + + +rec (7,686 samples, 0.25%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +polyDivMod (484 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +rec (832 samples, 0.03%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (326 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (310 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyAddTerm (304 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +B_eq (28,465 samples, 0.92%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +anon-func-79.3 (14,992 samples, 0.48%) + + + +anon-func-48.7 (1,764 samples, 0.06%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (3,008 samples, 0.10%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyZipWith (493 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (661 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +rec (3,939 samples, 0.13%) + + + +encode (1,312 samples, 0.04%) + + + +correction (560 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +rec (1,963 samples, 0.06%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +formatCoords (604 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-161.5 (540 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (378 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (4,882 samples, 0.16%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyGrow (306 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +anon-func-435.5 (1,376 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-51.11 (446 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-300.5 (5,355 samples, 0.17%) + + + +rec (2,074 samples, 0.07%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +B_pow (5,894 samples, 0.19%) + + + +encode (489 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (1,920 samples, 0.06%) + + + +$lambda (441 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (6,392 samples, 0.21%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (274 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-30.36 (1,326 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +traceCoords (374 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (4,148 samples, 0.13%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (676 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +anon-func-30.36 (964 samples, 0.03%) + + + +generate (810 samples, 0.03%) + + + +encode (1,312 samples, 0.04%) + + + +correction (5,508 samples, 0.18%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (676 samples, 0.02%) + + + +pathCoords (273 samples, 0.01%) + + + +anon-func-300.5 (496 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (357 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (652 samples, 0.02%) + + + +rec (1,133 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +rec (21,572 samples, 0.70%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (286 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (1,285 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-435.5 (7,168 samples, 0.23%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +encode (664 samples, 0.02%) + + + +rec (2,032 samples, 0.07%) + + + +polyAdd (416 samples, 0.01%) + + + +polyPadRight (275 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-161.5 (2,880 samples, 0.09%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +rec (504 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (462 samples, 0.01%) + + + +anon-func-54.15 (381 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyPadLeft (523 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +generate (462 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-494.5 (310 samples, 0.01%) + + + +elemFromBits (336 samples, 0.01%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +anon-func-161.5 (2,092 samples, 0.07%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (271 samples, 0.01%) + + + +anon-func-32.65 (378 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-412.5 (306 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (289 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (306 samples, 0.01%) + + + +encode (373 samples, 0.01%) + + + +anon-func-133.5 (15,655 samples, 0.51%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (478 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyAddTerm (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +anon-func-38.11 (360 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (3,744 samples, 0.12%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +pathCoords (270 samples, 0.01%) + + + +anon-func-161.5 (2,644 samples, 0.09%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +step (360 samples, 0.01%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +anon-func-51.11 (361 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (8,192 samples, 0.26%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (317 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-38.11 (2,448 samples, 0.08%) + + + +encode (576 samples, 0.02%) + + + +rec (1,664 samples, 0.05%) + + + +anon-func-481.5 (1,098 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +rec (342 samples, 0.01%) + + + +natToBytes (25,536 samples, 0.83%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-435.5 (528 samples, 0.02%) + + + +finderCoords (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyMulTerm (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +pathCoords (270 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +map (408 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +rec (2,159 samples, 0.07%) + + + +anon-func-48.7 (5,355 samples, 0.17%) + + + +map (576 samples, 0.02%) + + + +rec (6,460 samples, 0.21%) + + + +map (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (304 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (468 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (825 samples, 0.03%) + + + +$lambda (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +polyDivMod (400 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (618 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (489 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (835 samples, 0.03%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-51.11 (99,362 samples, 3.21%) +ano.. + + +pathCoords (2,496 samples, 0.08%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (1,152 samples, 0.04%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +rec (846 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyMulTerm (624 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-412.5 (286 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-229.5 (306 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +correction (1,040 samples, 0.03%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +generate (832 samples, 0.03%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyPadLeft (591 samples, 0.02%) + + + +generate (381 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +encode (800 samples, 0.03%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +interleave (850 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-54.15 (462 samples, 0.01%) + + + +anon-func-435.5 (10,912 samples, 0.35%) + + + +pathCoords (1,638 samples, 0.05%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +anon-func-161.5 (2,418 samples, 0.08%) + + + +interleave (326 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (1,120 samples, 0.04%) + + + +$lambda (4,882 samples, 0.16%) + + + +anon-func-453.5 (2,170 samples, 0.07%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +map (2,448 samples, 0.08%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +rec (6,039 samples, 0.20%) + + + +encode (352 samples, 0.01%) + + + +anon-func-412.5 (663 samples, 0.02%) + + + +pathCoords (8,130 samples, 0.26%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +patternCoords (4,194 samples, 0.14%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +map (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (384 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +go (527 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-494.5 (450 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (2,533 samples, 0.08%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +map (326 samples, 0.01%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +rec (1,044 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polySub (27,760 samples, 0.90%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (4,772 samples, 0.15%) + + + +anon-func-30.36 (361 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +traceCoords (904 samples, 0.03%) + + + +interleave (290 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +elemAdd (6,720 samples, 0.22%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +polyAdd (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (850 samples, 0.03%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-265.5 (1,625 samples, 0.05%) + + + +anon-func-51.11 (2,634 samples, 0.09%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-48.7 (446 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +patternCoords (1,764 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-51.11 (364 samples, 0.01%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (317 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +encode (1,920 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (1,496 samples, 0.05%) + + + +correction (688 samples, 0.02%) + + + +anon-func-412.5 (1,261 samples, 0.04%) + + + +rec (485 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-412.5 (290 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (283 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +rec (14,482 samples, 0.47%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +toBlocks (274 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-412.5 (539 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +polyMulTerm (556 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-481.5 (646 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyAdd (378 samples, 0.01%) + + + +polyZipWith (342 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +generate (357 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-435.5 (4,352 samples, 0.14%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-229.5 (1,188 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (28,896 samples, 0.93%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-161.5 (1,786 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (3,627 samples, 0.12%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +timingHCoords (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-32.65 (1,152 samples, 0.04%) + + + +polyDivMod (618 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (2,448 samples, 0.08%) + + + +anon-func-79.3 (2,304 samples, 0.07%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (619 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (425 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +scale (2,112 samples, 0.07%) + + + +map (416 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-30.36 (338 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-300.5 (6,392 samples, 0.21%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (1,600 samples, 0.05%) + + + +interleave (1,024 samples, 0.03%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (374 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (10,240 samples, 0.33%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (414 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +map (1,120 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +polyZipWith (304 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (1,683 samples, 0.05%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (1,025 samples, 0.03%) + + + +rec (7,340 samples, 0.24%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (17,472 samples, 0.56%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-265.5 (605 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (810 samples, 0.03%) + + + +rec (1,887 samples, 0.06%) + + + +polyAdd (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-161.5 (399 samples, 0.01%) + + + +anon-func-435.5 (5,600 samples, 0.18%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (3,648 samples, 0.12%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (328 samples, 0.01%) + + + +anon-func-244.5 (370,725 samples, 11.99%) +anon-func-244.5 + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +scale (2,992 samples, 0.10%) + + + +anon-func-481.5 (488 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +rec (499 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (630 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-161.5 (472 samples, 0.02%) + + + +elemMul (5,984 samples, 0.19%) + + + +encode (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (306 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +rec (1,075 samples, 0.03%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-30.36 (517 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (289 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +interleave (512 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +toListWithLength (377 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (465 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +flatten (1,942 samples, 0.06%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-48.7 (381 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +interleave (1,520 samples, 0.05%) + + + +anon-func-481.5 (448 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (1,224 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (3,008 samples, 0.10%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +rec (1,452 samples, 0.05%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-387.7 (357 samples, 0.01%) + + + +$lambda (279 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyGrow (297 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (4,224 samples, 0.14%) + + + +map (272 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (1,836 samples, 0.06%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-453.5 (472 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +rec (2,538 samples, 0.08%) + + + +correction (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-79.3 (290 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (1,058 samples, 0.03%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +formatCoords (270 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +pathCoords (137,574 samples, 4.45%) +pathC.. + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-393.5 (351 samples, 0.01%) + + + +correction (400 samples, 0.01%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +rec (795 samples, 0.03%) + + + +encode (272 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +encode (3,456 samples, 0.11%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +pathCoords (323,033 samples, 10.44%) +pathCoords + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +polyMulTerm (408 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (384 samples, 0.01%) + + + +anon-func-30.36 (317 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-300.5 (918 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (8,086 samples, 0.26%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (27,760 samples, 0.90%) + + + +map (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (9,609 samples, 0.31%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +rec (2,158 samples, 0.07%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +encode (384 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (15,808 samples, 0.51%) + + + +go (576 samples, 0.02%) + + + +polyPadLeft (763 samples, 0.02%) + + + +traceCoords (137,574 samples, 4.45%) +trace.. + + +finderBLCoords (2,644 samples, 0.09%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +polyScale (384 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-161.5 (855 samples, 0.03%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +generate (4,466 samples, 0.14%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +flatten (9,308 samples, 0.30%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-161.5 (2,448 samples, 0.08%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-48.7 (1,224 samples, 0.04%) + + + +go (4,760 samples, 0.15%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polyPadLeft (486 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-161.5 (1,536 samples, 0.05%) + + + +rec (368 samples, 0.01%) + + + +foldr (572 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-481.5 (1,034 samples, 0.03%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +rec (760 samples, 0.02%) + + + +polyLeadCoeff (306 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (363 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +map (274 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-300.5 (826 samples, 0.03%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (19,584 samples, 0.63%) + + + +polyMulTerm (403 samples, 0.01%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +polyNew (459 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +encode (618 samples, 0.02%) + + + +anon-func-38.11 (446 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +scale (14,984 samples, 0.48%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +anon-func-38.11 (408 samples, 0.01%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (12,104 samples, 0.39%) + + + +anon-func-48.7 (400 samples, 0.01%) + + + +rec (3,330 samples, 0.11%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +rec (2,730 samples, 0.09%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-412.5 (470 samples, 0.02%) + + + +encode (306 samples, 0.01%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +rec (273 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyScale (624 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (760 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polyPadLeft (527 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-265.5 (1,440 samples, 0.05%) + + + +encode (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (12,002 samples, 0.39%) + + + +polyScale (544 samples, 0.02%) + + + +map (1,440 samples, 0.05%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (8,704 samples, 0.28%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (4,466 samples, 0.14%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (910 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (4,925 samples, 0.16%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-435.5 (49,856 samples, 1.61%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +$lambda (27,760 samples, 0.90%) + + + +generate (704 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (84,073 samples, 2.72%) +an.. + + +$lambda (320 samples, 0.01%) + + + +go (486 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +anon-func-412.5 (956 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-161.5 (274 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-32.65 (704 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (5,355 samples, 0.17%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (372 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,720 samples, 0.09%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +pathCoords (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +rec (407 samples, 0.01%) + + + +anon-func-481.5 (2,030 samples, 0.07%) + + + +go (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (403 samples, 0.01%) + + + +traceCoords (756 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (2,166 samples, 0.07%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-453.5 (590 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyDivMod (5,508 samples, 0.18%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +polyMulTerm (288 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +polyAdd (403 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (8,780 samples, 0.28%) + + + +interleave (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyZipWith (527 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (270 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (5,627 samples, 0.18%) + + + +polyScale (384 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (48,384 samples, 1.56%) + + + +correction (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyDivMod (480 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +interleave (1,326 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-300.5 (619 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-30.36 (12,104 samples, 0.39%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (5,728 samples, 0.19%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (6,392 samples, 0.21%) + + + +elemAdd (5,376 samples, 0.17%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-435.5 (880 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-412.5 (980 samples, 0.03%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-161.5 (4,320 samples, 0.14%) + + + +$lambda (288 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (1,942 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (317 samples, 0.01%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +rec (1,700 samples, 0.05%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +patternCoords (704 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +link_start (665 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (468 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyPadLeft (459 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (9,918 samples, 0.32%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-435.5 (5,376 samples, 0.17%) + + + +correction (288 samples, 0.01%) + + + +pathCoords (2,226 samples, 0.07%) + + + +go (576 samples, 0.02%) + + + +map (338 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (360 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyAdd (325 samples, 0.01%) + + + +anon-func-300.5 (1,819 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (3,008 samples, 0.10%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (317 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +go (320 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (12,104 samples, 0.39%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-435.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (7,392 samples, 0.24%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (676 samples, 0.02%) + + + +anon-func-435.5 (8,144 samples, 0.26%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (420 samples, 0.01%) + + + +anon-func-435.5 (20,992 samples, 0.68%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +anon-func-435.5 (3,536 samples, 0.11%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-79.3 (806 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (403 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (465 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (403 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +rec (5,695 samples, 0.18%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (595 samples, 0.02%) + + + +rec (2,899 samples, 0.09%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (1,683 samples, 0.05%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +scale (2,464 samples, 0.08%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-161.5 (3,264 samples, 0.11%) + + + +anon-func-453.5 (3,422 samples, 0.11%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +finderTRCoords (1,152 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-51.11 (1,440 samples, 0.05%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-300.5 (317 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +toBlocks (2,304 samples, 0.07%) + + + +polySub (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (1,786 samples, 0.06%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (360 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-133.5 (21,672 samples, 0.70%) + + + +pathCoords (2,644 samples, 0.09%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +correction (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (408 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (1,190 samples, 0.04%) + + + +natToBytes (24,192 samples, 0.78%) + + + +anon-func-79.3 (1,408 samples, 0.05%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +anon-func-48.7 (400 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +$lambda (317 samples, 0.01%) + + + +polyAdd (304 samples, 0.01%) + + + +encode (290 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-300.5 (517 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +anon-func-435.5 (44,800 samples, 1.45%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (595 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +anon-func-79.3 (780 samples, 0.03%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +elemFromBits (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-48.7 (403 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +patternCoords (381 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (2,162 samples, 0.07%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-481.5 (1,098 samples, 0.04%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (594 samples, 0.02%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-481.5 (793 samples, 0.03%) + + + +encode (1,216 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (1,136 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyAdd (1,376 samples, 0.04%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-435.5 (5,984 samples, 0.19%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-48.7 (2,644 samples, 0.09%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +toListWithLength (493 samples, 0.02%) + + + +rec (900 samples, 0.03%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +$lambda (416 samples, 0.01%) + + + +rec (715 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (2,754 samples, 0.09%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (1,792 samples, 0.06%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (306 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (38,912 samples, 1.26%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyPadLeft (333 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +go (297 samples, 0.01%) + + + +correction (374 samples, 0.01%) + + + +anon-func-229.5 (3,158 samples, 0.10%) + + + +map (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (1,786 samples, 0.06%) + + + +correction (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +rec (1,332 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-393.5 (280 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (4,466 samples, 0.14%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-229.5 (1,098 samples, 0.04%) + + + +anon-func-300.5 (760 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (22,848 samples, 0.74%) + + + +anon-func-481.5 (1,008 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-48.7 (6,768 samples, 0.22%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (880 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +anon-func-435.5 (11,264 samples, 0.36%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-435.5 (12,160 samples, 0.39%) + + + +elemFromBits (316 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-265.5 (1,440 samples, 0.05%) + + + +polyDivMod (480 samples, 0.02%) + + + +elemMul (1,408 samples, 0.05%) + + + +anon-func-161.5 (2,720 samples, 0.09%) + + + +encode (352 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +$lambda (527 samples, 0.02%) + + + +patternCoords (270 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-161.5 (1,048 samples, 0.03%) + + + +go (1,312 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (1,440 samples, 0.05%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-265.5 (350 samples, 0.01%) + + + +encode (2,312 samples, 0.07%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (3,008 samples, 0.10%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-289.5 (96,074 samples, 3.11%) +ano.. + + +encode (544 samples, 0.02%) + + + +$lambda (306 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-161.5 (2,977 samples, 0.10%) + + + +polyMulTerm (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyMulTerm (340 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (317 samples, 0.01%) + + + +polyDivMod (446 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +elemAdd (8,736 samples, 0.28%) + + + +polyDivMod (288 samples, 0.01%) + + + +rec (1,904 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (374 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-265.5 (810 samples, 0.03%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (559 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +range (468 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (361 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-404.5 (1,584 samples, 0.05%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +rec (935 samples, 0.03%) + + + +finderTLCoords (704 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (2,448 samples, 0.08%) + + + +polyDivMod (576 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (429 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +elemFromBits (316 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +rec (720 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +rec (793 samples, 0.03%) + + + +map (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-265.5 (340 samples, 0.01%) + + + +anon-func-481.5 (582 samples, 0.02%) + + + +anon-func-435.5 (13,120 samples, 0.42%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +padLeftTo (434 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyPadLeft (935 samples, 0.03%) + + + +$lambda (352 samples, 0.01%) + + + +elemToBits (949 samples, 0.03%) + + + +rec (3,146 samples, 0.10%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyAdd (558 samples, 0.02%) + + + +map (5,508 samples, 0.18%) + + + +polyPadRight (594 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +encode (3,029 samples, 0.10%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (1,040 samples, 0.03%) + + + +anon-func-32.65 (270 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +elemAdd (22,848 samples, 0.74%) + + + +map (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +anon-func-79.3 (328 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (400 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (304 samples, 0.01%) + + + +rec (896 samples, 0.03%) + + + +encode (904 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (270 samples, 0.01%) + + + +anon-func-435.5 (13,664 samples, 0.44%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +interleave (624 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +map (5,728 samples, 0.19%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +polyScale (624 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-393.5 (470 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polyAddTerm (14,992 samples, 0.48%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +rec (399 samples, 0.01%) + + + +interleave (3,008 samples, 0.10%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (14,992 samples, 0.48%) + + + +rec (1,205 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-51.11 (2,448 samples, 0.08%) + + + +map (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (286 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (624 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +polyAdd (522 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +interleave (624 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-393.5 (362 samples, 0.01%) + + + +encode (465 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (1,496 samples, 0.05%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (12,212 samples, 0.39%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +map (661 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (6,392 samples, 0.21%) + + + +Array.idx (8,004 samples, 0.26%) + + + +interleave (2,304 samples, 0.07%) + + + +map (271 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (336 samples, 0.01%) + + + +anon-func-79.3 (8,780 samples, 0.28%) + + + +anon-func-229.5 (1,983 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-161.5 (326 samples, 0.01%) + + + +anon-func-435.5 (528 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (5,544 samples, 0.18%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAddTerm (304 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-32.65 (2,226 samples, 0.07%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +correction (1,024 samples, 0.03%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (360 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +rec (2,448 samples, 0.08%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +rec (1,199 samples, 0.04%) + + + +natZipWith (2,688 samples, 0.09%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +elemAdd (6,720 samples, 0.22%) + + + +polyAdd (527 samples, 0.02%) + + + +anon-func-48.7 (27,760 samples, 0.90%) + + + +anon-func-30.36 (1,440 samples, 0.05%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (625 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (1,024 samples, 0.03%) + + + +toList (319 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +go (442 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +go (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-265.5 (360 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +pathCoords (1,764 samples, 0.06%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +$lambda (378 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-48.7 (3,382 samples, 0.11%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (27,760 samples, 0.90%) + + + +map (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +generate (704 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (1,312 samples, 0.04%) + + + +rec (396 samples, 0.01%) + + + +anon-func-435.5 (880 samples, 0.03%) + + + +anon-func-435.5 (2,112 samples, 0.07%) + + + +anon-func-435.5 (6,659 samples, 0.22%) + + + +anon-func-79.3 (1,360 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-54.15 (604 samples, 0.02%) + + + +anon-func-435.5 (18,336 samples, 0.59%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +natZipWith (12,096 samples, 0.39%) + + + +rec (609 samples, 0.02%) + + + +anon-func-51.11 (3,456 samples, 0.11%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-38.11 (317 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-481.5 (400 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (290 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (374 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-412.5 (1,566 samples, 0.05%) + + + +encode (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-32.65 (8,086 samples, 0.26%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (1,664 samples, 0.05%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polySub (12,816 samples, 0.41%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polySub (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-161.5 (1,536 samples, 0.05%) + + + +go (1,920 samples, 0.06%) + + + +go (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +interleave (618 samples, 0.02%) + + + +correction (270 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +natFromBits (326 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +rec (1,185 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +rec (822 samples, 0.03%) + + + +anon-func-435.5 (18,240 samples, 0.59%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +$lambda (2,448 samples, 0.08%) + + + +interleave (272 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +natToBytes (1,344 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +encode (1,216 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-161.5 (3,032 samples, 0.10%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-54.15 (2,563 samples, 0.08%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +$lambda (8,758 samples, 0.28%) + + + +rec (856 samples, 0.03%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (1,107 samples, 0.04%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-393.5 (495 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-161.5 (512 samples, 0.02%) + + + +anon-func-393.5 (875 samples, 0.03%) + + + +$lambda (374 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +rec (695 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +__wasm_apply_data_relocs (665 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (880 samples, 0.03%) + + + +anon-func-300.5 (2,601 samples, 0.08%) + + + +$lambda (1,216 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +generate (2,496 samples, 0.08%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +natFromBytes (22,848 samples, 0.74%) + + + +encode (326 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-481.5 (1,750 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +encode (754 samples, 0.02%) + + + +anon-func-300.5 (1,400 samples, 0.05%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +$lambda (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (381 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +rec (1,989 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +polyOrder (306 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (14,992 samples, 0.48%) + + + +$lambda (1,312 samples, 0.04%) + + + +map (6,392 samples, 0.21%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (704 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +rec (372 samples, 0.01%) + + + +anon-func-48.7 (306 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +finderBLCoords (1,224 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +finderBLCoords (704 samples, 0.02%) + + + +anon-func-79.3 (400 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (512 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (1,942 samples, 0.06%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +anon-func-48.7 (328 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (6,768 samples, 0.22%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-435.5 (6,080 samples, 0.20%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +polySub (576 samples, 0.02%) + + + +finderTLCoords (288 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (385 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (2,563 samples, 0.08%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-51.11 (2,125 samples, 0.07%) + + + +anon-func-30.36 (5,696 samples, 0.18%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (2,496 samples, 0.08%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (403 samples, 0.01%) + + + +anon-func-161.5 (1,760 samples, 0.06%) + + + +anon-func-435.5 (6,243 samples, 0.20%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +generate (270 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +rec (456 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +rec (3,970 samples, 0.13%) + + + +map (576 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +correction (272 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (378 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +rec (3,354 samples, 0.11%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyZipWith (731 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +rec (15,840 samples, 0.51%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (1,764 samples, 0.06%) + + + +anon-func-481.5 (764 samples, 0.02%) + + + +foldr (450 samples, 0.01%) + + + +anon-func-265.5 (1,190 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +$lambda (8,780 samples, 0.28%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +go (2,304 samples, 0.07%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyDivMod (624 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-38.11 (3,008 samples, 0.10%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-32.65 (462 samples, 0.01%) + + + +polyZipWith (688 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (282 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (867 samples, 0.03%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +map (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +generate (832 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-229.5 (342 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-32.65 (3,456 samples, 0.11%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (468 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +rec (660 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (1,786 samples, 0.06%) + + + +go (1,120 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +rec (3,078 samples, 0.10%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-393.5 (1,261 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +polyDivMod (289 samples, 0.01%) + + + +pathCoords (756 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (784 samples, 0.03%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +map (326 samples, 0.01%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +$lambda (5,508 samples, 0.18%) + + + +anon-func-30.36 (14,992 samples, 0.48%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (476 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyAdd (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-79.3 (5,696 samples, 0.18%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +rec (990 samples, 0.03%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +rec (1,449 samples, 0.05%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-161.5 (1,241 samples, 0.04%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (5,445 samples, 0.18%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +rec (2,860 samples, 0.09%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +$lambda (364 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +pathCoords (288 samples, 0.01%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (446 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +rec (1,354 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +generate (2,646 samples, 0.09%) + + + +anon-func-38.11 (4,760 samples, 0.15%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,664 samples, 0.05%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +encode (645 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-435.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyDivMod (274 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +polyScale (480 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (966 samples, 0.03%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +natFromBits (608 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-229.5 (342 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-51.11 (3,032 samples, 0.10%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +go (271 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (1,920 samples, 0.06%) + + + +encode (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (1,055 samples, 0.03%) + + + +anon-func-161.5 (512 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyPadRight (594 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,584 samples, 0.12%) + + + +polyPadLeft (1,193 samples, 0.04%) + + + +polyPadLeft (306 samples, 0.01%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +correction (476 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (972 samples, 0.03%) + + + +correction (1,216 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +B_gt (27,010 samples, 0.87%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (3,564 samples, 0.12%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (649 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-481.5 (280 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +go (403 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (270 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +$lambda (2,312 samples, 0.07%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (384 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-229.5 (774 samples, 0.03%) + + + +polyAdd (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +go (274 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-79.3 (5,202 samples, 0.17%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +polyPadLeft (409 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +$lambda (286 samples, 0.01%) + + + +correction (575 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +flatten (964 samples, 0.03%) + + + +anon-func-51.11 (306 samples, 0.01%) + + + +rec (1,722 samples, 0.06%) + + + +anon-func-435.5 (103,232 samples, 3.34%) +ano.. + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rec (767 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-435.5 (8,512 samples, 0.28%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +rec (1,785 samples, 0.06%) + + + +polyPadRight (323 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-435.5 (20,672 samples, 0.67%) + + + +polyPadLeft (273 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +generate (832 samples, 0.03%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (799 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyGrow (450 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +map (320 samples, 0.01%) + + + +map (338 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (3,069 samples, 0.10%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +correction (5,696 samples, 0.18%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (14,784 samples, 0.48%) + + + +B_div (28,899 samples, 0.93%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-161.5 (5,440 samples, 0.18%) + + + +go (288 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +anon-func-161.5 (2,448 samples, 0.08%) + + + +polyGrow (527 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (360 samples, 0.01%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +correction (544 samples, 0.02%) + + + +rec (38,312 samples, 1.24%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +$lambda (378 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +polyDivMod (624 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (10,560 samples, 0.34%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +encode (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +traceCoords (378 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +polyDivMod (322 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (373 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-481.5 (952 samples, 0.03%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (8,758 samples, 0.28%) + + + +anon-func-481.5 (344 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-161.5 (3,432 samples, 0.11%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (1,024 samples, 0.03%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-161.5 (1,836 samples, 0.06%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-79.3 (3,029 samples, 0.10%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (1,480 samples, 0.05%) + + + +$lambda (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-481.5 (572 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +map (1,216 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-32.65 (2,644 samples, 0.09%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +elemFromBits (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (4,540 samples, 0.15%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +anon-func-51.11 (1,000 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +B_pow (5,752 samples, 0.19%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (27,760 samples, 0.90%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +generate (4,194 samples, 0.14%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-68.41 (12,768 samples, 0.41%) + + + +$lambda (544 samples, 0.02%) + + + +rec (2,124 samples, 0.07%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-481.5 (315 samples, 0.01%) + + + +anon-func-435.5 (9,856 samples, 0.32%) + + + +correction (272 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +anon-func-393.5 (882 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +polyZipWith (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-92.40 (1,862 samples, 0.06%) + + + +natToBytes (24,192 samples, 0.78%) + + + +polySub (1,120 samples, 0.04%) + + + +rec (3,096 samples, 0.10%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +rec (385 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-32.65 (4,194 samples, 0.14%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +formatVCoords (381 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (286 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyTrim (612 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-54.15 (2,496 samples, 0.08%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-30.36 (476 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-435.5 (800 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +rec (9,919 samples, 0.32%) + + + +anon-func-435.5 (14,976 samples, 0.48%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +anon-func-435.5 (800 samples, 0.03%) + + + +encode (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyGrow (280 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (4,080 samples, 0.13%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyZipWith (351 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (290 samples, 0.01%) + + + +$lambda (480 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (297 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +traceCoords (1,786 samples, 0.06%) + + + +encode (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-51.11 (2,563 samples, 0.08%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (1,746 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-161.5 (2,552 samples, 0.08%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (6,264 samples, 0.20%) + + + +$lambda (304 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyAddTerm (544 samples, 0.02%) + + + +rec (442 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +generate (99,362 samples, 3.21%) +gen.. + + +anon-func-161.5 (350 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-435.5 (26,240 samples, 0.85%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +interleave (6,768 samples, 0.22%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +polyScale (512 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-51.11 (279 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +go (1,920 samples, 0.06%) + + + +polySub (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-481.5 (671 samples, 0.02%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +polySub (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (2,704 samples, 0.09%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +B_sub (8,520 samples, 0.28%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +finderCoords (704 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +toBlocks (280 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (16,128 samples, 0.52%) + + + +anon-func-30.36 (306 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (517 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +rec (4,202 samples, 0.14%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-54.15 (810 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (754 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +traceCoords (495 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (510 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +alloc_size<4>_tag<1> (14,443 samples, 0.47%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (850 samples, 0.03%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (285 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-435.5 (8,192 samples, 0.26%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-393.5 (585 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (3,382 samples, 0.11%) + + + +map (440 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +interleave (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-481.5 (728 samples, 0.02%) + + + +rec (2,160 samples, 0.07%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-161.5 (10,064 samples, 0.33%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +interleave (1,683 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +encode (1,408 samples, 0.05%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (575 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (601 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-161.5 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (858 samples, 0.03%) + + + +map (320 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-481.5 (525 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (688 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (1,280 samples, 0.04%) + + + +polyGrow (378 samples, 0.01%) + + + +rec (1,258 samples, 0.04%) + + + +encode (704 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-300.5 (1,440 samples, 0.05%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (9,632 samples, 0.31%) + + + +$lambda (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (558 samples, 0.02%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +polyZipWith (333 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +patternCoords (3,032 samples, 0.10%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-79.3 (595 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +rec (4,986 samples, 0.16%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +generate (756 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-48.7 (645 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (494 samples, 0.02%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +anon-func-161.5 (1,003 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (1,440 samples, 0.05%) + + + +anon-func-48.7 (358 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (286 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +toBlocks (2,250 samples, 0.07%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-38.11 (1,496 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyScale (595 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +rec (1,255 samples, 0.04%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +interleave (384 samples, 0.01%) + + + +anon-func-79.3 (468 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +$lambda (810 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-435.5 (5,248 samples, 0.17%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +step (491 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (618 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +encode (468 samples, 0.02%) + + + +flatten (338 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyScale (340 samples, 0.01%) + + + +anon-func-481.5 (400 samples, 0.01%) + + + +anon-func-435.5 (4,688 samples, 0.15%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +rec (704 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (27,760 samples, 0.90%) + + + +anon-func-435.5 (3,264 samples, 0.11%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +map (1,920 samples, 0.06%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +toListWithLength (522 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +go (289 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (37,280 samples, 1.21%) + + + +anon-func-481.5 (2,113 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyGrow (589 samples, 0.02%) + + + +rec (344 samples, 0.01%) + + + +go (661 samples, 0.02%) + + + +polyAddTerm (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +polyDivMod (27,760 samples, 0.90%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-54.15 (364 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +generate (137,574 samples, 4.45%) +gener.. + + +finderTRCoords (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (1,786 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +map (439 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (974 samples, 0.03%) + + + +polyGrow (342 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (850 samples, 0.03%) + + + +correction (1,216 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +rec (625 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-161.5 (2,948 samples, 0.10%) + + + +anon-func-161.5 (2,646 samples, 0.09%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (306 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +natXor (24,192 samples, 0.78%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +go (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-32.65 (2,630 samples, 0.09%) + + + +rec (5,116 samples, 0.17%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +rec (270 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +correction (270 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyScale (1,024 samples, 0.03%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (760 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +generate (1,764 samples, 0.06%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +go (416 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-481.5 (580 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-435.5 (11,552 samples, 0.37%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (316 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +pathCoords (3,032 samples, 0.10%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (2,754 samples, 0.09%) + + + +rec (1,854 samples, 0.06%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +elemDiv (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (8,802 samples, 0.28%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyTrim (10,780 samples, 0.35%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +patternCoords (1,224 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (767 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +rec (335 samples, 0.01%) + + + +generate (9,808 samples, 0.32%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (357 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (624 samples, 0.02%) + + + +interleave (754 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (322 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-161.5 (1,360 samples, 0.04%) + + + +anon-func-161.5 (688 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +elemDiv (272 samples, 0.01%) + + + +anon-func-48.7 (3,032 samples, 0.10%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-161.5 (473 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyPadLeft (280 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +generate (357 samples, 0.01%) + + + +polyAdd (419 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +anon-func-481.5 (316 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-393.5 (341 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +$lambda (880 samples, 0.03%) + + + +map (304 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +$lambda (478 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +rec (8,540 samples, 0.28%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +natFromBits (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +polyMulTerm (384 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +finderTRCoords (704 samples, 0.02%) + + + +encode (624 samples, 0.02%) + + + +rec (1,105 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +wpow_nat<Nat64> (5,894 samples, 0.19%) + + + +go (6,392 samples, 0.21%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +polyPadLeft (558 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (560 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +anon-func-48.7 (2,563 samples, 0.08%) + + + +encode (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-265.5 (2,145 samples, 0.07%) + + + +encode (608 samples, 0.02%) + + + +anon-func-412.5 (341 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +natXor (51,072 samples, 1.65%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-453.5 (1,003 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +anon-func-38.11 (595 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (9,918 samples, 0.32%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +rec (783 samples, 0.03%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +pathCoords (1,152 samples, 0.04%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +natXor (3,360 samples, 0.11%) + + + +anon-func-161.5 (2,430 samples, 0.08%) + + + +polyZipWith (325 samples, 0.01%) + + + +anon-func-30.36 (285 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (384 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +anon-func-412.5 (565 samples, 0.02%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +rec (12,528 samples, 0.41%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (6,768 samples, 0.22%) + + + +correction (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyPadLeft (289 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (3,029 samples, 0.10%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +polyDivMod (340 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +rec (616 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (3,032 samples, 0.10%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +elemFromBits (326 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (1,377 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (880 samples, 0.03%) + + + +polyZipWith (512 samples, 0.02%) + + + +$lambda (1,224 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (675 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (754 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +encode (608 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +flatten (806 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (304 samples, 0.01%) + + + +rec (2,023 samples, 0.07%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +rec (9,756 samples, 0.32%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (652 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (663 samples, 0.02%) + + + +anon-func-161.5 (2,904 samples, 0.09%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-38.11 (271 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-48.7 (1,058 samples, 0.03%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-300.5 (2,975 samples, 0.10%) + + + +generate (3,456 samples, 0.11%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (619 samples, 0.02%) + + + +rec (664 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +formatHCoords (270 samples, 0.01%) + + + +anon-func-161.5 (858 samples, 0.03%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-300.5 (360 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +rec (704 samples, 0.02%) + + + +correction (368 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +generate (1,224 samples, 0.04%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (2,448 samples, 0.08%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,600 samples, 0.05%) + + + +anon-func-161.5 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +rec (442 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyZipWith (522 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +$lambda (1,312 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (1,156 samples, 0.04%) + + + +rec (1,350 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +log (4,224 samples, 0.14%) + + + +rec (1,069 samples, 0.03%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +rec (1,134 samples, 0.04%) + + + +next (6,889 samples, 0.22%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (384 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (1,190 samples, 0.04%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (9,520 samples, 0.31%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (1,584 samples, 0.05%) + + + +go (688 samples, 0.02%) + + + +finderTRCoords (832 samples, 0.03%) + + + +anon-func-79.3 (527 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (368 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (2,448 samples, 0.08%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (2,754 samples, 0.09%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-435.5 (2,448 samples, 0.08%) + + + +anon-func-300.5 (1,024 samples, 0.03%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,040 samples, 0.03%) + + + +anon-func-51.11 (271 samples, 0.01%) + + + +anon-func-393.5 (609 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +interleave (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (1,800 samples, 0.06%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-51.11 (800 samples, 0.03%) + + + +encode (381 samples, 0.01%) + + + +rec (1,728 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (816 samples, 0.03%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (1,456 samples, 0.05%) + + + +interleave (1,920 samples, 0.06%) + + + +polyDivMod (317 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +log (5,760 samples, 0.19%) + + + +polyAdd (288 samples, 0.01%) + + + +rec (918 samples, 0.03%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +correction (384 samples, 0.01%) + + + +map (384 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyOrder (5,670 samples, 0.18%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +elemAdd (11,424 samples, 0.37%) + + + +anon-func-161.5 (651 samples, 0.02%) + + + +polyMulTerm (512 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyPadRight (429 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (7,296 samples, 0.24%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +rec (638 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-435.5 (13,440 samples, 0.43%) + + + +correction (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (489 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (347 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-51.11 (378 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyMulTerm (288 samples, 0.01%) + + + +@deserialize_go<t> (265 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyPadRight (459 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +flatten (338 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-161.5 (840 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +elemNew (559 samples, 0.02%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (370 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-453.5 (590 samples, 0.02%) + + + +anon-func-435.5 (72,960 samples, 2.36%) +a.. + + +anon-func-30.36 (352 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-453.5 (2,784 samples, 0.09%) + + + +generate (2,226 samples, 0.07%) + + + +map (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (3,029 samples, 0.10%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (2,644 samples, 0.09%) + + + +rec (318,170 samples, 10.29%) +rec + + +anon-func-453.5 (767 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +map (270 samples, 0.01%) + + + +anon-func-265.5 (490 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (14,992 samples, 0.48%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +finderBLCoords (1,152 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-48.7 (3,744 samples, 0.12%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (1,024 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +patternCoords (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (1,890 samples, 0.06%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +patternCoords (288 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-32.65 (357 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-481.5 (3,132 samples, 0.10%) + + + +go (1,216 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (2,704 samples, 0.09%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-161.5 (774 samples, 0.03%) + + + +anon-func-481.5 (726 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-48.7 (340 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (5,202 samples, 0.17%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyGrow (1,021 samples, 0.03%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-161.5 (3,780 samples, 0.12%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (624 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-161.5 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-412.5 (595 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +interleave (484 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +rec (512 samples, 0.02%) + + + +finderCoords (1,764 samples, 0.06%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +$lambda (270 samples, 0.01%) + + + +interleave (322 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +rec (18,187 samples, 0.59%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-412.5 (696 samples, 0.02%) + + + +rec (536 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (493 samples, 0.02%) + + + +interleave (338 samples, 0.01%) + + + +foldr (459 samples, 0.01%) + + + +finderTRCoords (2,630 samples, 0.09%) + + + +encode (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-393.5 (420 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-393.5 (1,581 samples, 0.05%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (6,768 samples, 0.22%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polySub (304 samples, 0.01%) + + + +polyZipWith (465 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (283 samples, 0.01%) + + + +anon-func-51.11 (880 samples, 0.03%) + + + +anon-func-30.36 (440 samples, 0.01%) + + + +anon-func-161.5 (3,608 samples, 0.12%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +interleave (400 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-453.5 (2,148 samples, 0.07%) + + + +correction (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +anon-func-265.5 (935 samples, 0.03%) + + + +anon-func-481.5 (782 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (2,376 samples, 0.08%) + + + +polyOrder (1,694 samples, 0.05%) + + + +finderCoords (1,224 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +anon-func-300.5 (1,224 samples, 0.04%) + + + +map (2,304 samples, 0.07%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +map (480 samples, 0.02%) + + + +finderTLCoords (342 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (338 samples, 0.01%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-30.36 (3,580 samples, 0.12%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-79.3 (5,696 samples, 0.18%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-48.7 (1,224 samples, 0.04%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +anon-func-161.5 (1,672 samples, 0.05%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (2,754 samples, 0.09%) + + + +anon-func-48.7 (326 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-435.5 (14,784 samples, 0.48%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-30.36 (279 samples, 0.01%) + + + +anon-func-79.3 (4,466 samples, 0.14%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-51.11 (546 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (618 samples, 0.02%) + + + +finderTRCoords (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +polyScale (361 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +toList (377 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-161.5 (1,764 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (5,696 samples, 0.18%) + + + +rec (1,548 samples, 0.05%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (3,456 samples, 0.11%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +$lambda (271 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (835 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +generate (273 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-265.5 (954 samples, 0.03%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polyZipWith (320 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-161.5 (520 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +map (645 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +patternCoords (2,496 samples, 0.08%) + + + +correction (352 samples, 0.01%) + + + +anon-func-99.14 (522 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (850 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (8,802 samples, 0.28%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyPadLeft (465 samples, 0.02%) + + + +natXor (5,376 samples, 0.17%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +go (352 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +interleave (1,136 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-265.5 (450 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +anon-func-481.5 (590 samples, 0.02%) + + + +interleave (439 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +polyPadLeft (744 samples, 0.02%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (2,754 samples, 0.09%) + + + +$lambda (342 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +rec (819 samples, 0.03%) + + + +interleave (326 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +traceCoords (357 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (606 samples, 0.02%) + + + +anon-func-265.5 (1,155 samples, 0.04%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +pathCoords (704 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +step (360 samples, 0.01%) + + + +anon-func-435.5 (24,160 samples, 0.78%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (2,900 samples, 0.09%) + + + +correction (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-51.11 (2,312 samples, 0.07%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-481.5 (306 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (8,736 samples, 0.28%) + + + +map (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +rec (375 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +map (1,040 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +$lambda (688 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (374 samples, 0.01%) + + + +anon-func-481.5 (630 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (532 samples, 0.02%) + + + +anon-func-289.5 (113,545 samples, 3.67%) +anon.. + + +map (290 samples, 0.01%) + + + +$lambda (4,194 samples, 0.14%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-38.11 (328 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +compacting_gc (3,138 samples, 0.10%) + + + +anon-func-161.5 (4,122 samples, 0.13%) + + + +polyAdd (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (320 samples, 0.01%) + + + +rec (2,121 samples, 0.07%) + + + +map (304 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +rec (915 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +correction (304 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +natFromBits (391 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +rec (8,448 samples, 0.27%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +elemAdd (24,192 samples, 0.78%) + + + +anon-func-246.51 (704 samples, 0.02%) + + + +interleave (280 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-161.5 (1,024 samples, 0.03%) + + + +correction (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +map (2,288 samples, 0.07%) + + + +interleave (416 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +formatVCoords (652 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-48.7 (283 samples, 0.01%) + + + +anon-func-161.5 (462 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (624 samples, 0.02%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (1,248 samples, 0.04%) + + + +rec (1,192 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (640 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-161.5 (896 samples, 0.03%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-412.5 (507 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +rec (3,263 samples, 0.11%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-435.5 (2,064 samples, 0.07%) + + + +anon-func-79.3 (2,704 samples, 0.09%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (8,802 samples, 0.28%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +correction (608 samples, 0.02%) + + + +interleave (279 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-481.5 (348 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyGrow (18,496 samples, 0.60%) + + + +anon-func-453.5 (472 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-99.14 (319 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +go (6,528 samples, 0.21%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +toListWithLength (319 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +correction (283 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +rec (328 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-412.5 (765 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +rec (27,024 samples, 0.87%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +map (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (484 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (2,112 samples, 0.07%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (374 samples, 0.01%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (672 samples, 0.02%) + + + +interleave (964 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (2,646 samples, 0.09%) + + + +polyZipWith (1,333 samples, 0.04%) + + + +polyMulTerm (442 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rec (1,260 samples, 0.04%) + + + +anon-func-54.15 (2,112 samples, 0.07%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +interleave (14,992 samples, 0.48%) + + + +polySub (352 samples, 0.01%) + + + +polyPadLeft (447 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (462 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +polyAdd (608 samples, 0.02%) + + + +natFromBytes (12,768 samples, 0.41%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (1,040 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +B_div (12,168 samples, 0.39%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-161.5 (960 samples, 0.03%) + + + +anon-func-30.36 (271 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (661 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyPadRight (351 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (322 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (972 samples, 0.03%) + + + +go (320 samples, 0.01%) + + + +rec (7,137 samples, 0.23%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (320 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyPadLeft (403 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (99,362 samples, 3.21%) +$la.. + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-481.5 (3,199 samples, 0.10%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyPadRight (280 samples, 0.01%) + + + +map (624 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +rec (556 samples, 0.02%) + + + +anon-func-300.5 (442 samples, 0.01%) + + + +anon-func-79.3 (442 samples, 0.01%) + + + +anon-func-435.5 (3,744 samples, 0.12%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +alog (2,030 samples, 0.07%) + + + +parse (470 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-481.5 (1,050 samples, 0.03%) + + + +map (510 samples, 0.02%) + + + +anon-func-481.5 (408 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (2,920 samples, 0.09%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (2,288 samples, 0.07%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (2,288 samples, 0.07%) + + + +encode (9,308 samples, 0.30%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +encode (306 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (320 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-161.5 (800 samples, 0.03%) + + + +$lambda (338 samples, 0.01%) + + + +anon-func-38.11 (290 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (446 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (4,212 samples, 0.14%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (5,627 samples, 0.18%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +anon-func-435.5 (9,504 samples, 0.31%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +$lambda (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +compacting_gc (1,089 samples, 0.04%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +rec (792 samples, 0.03%) + + + +anon-func-38.11 (360 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +encode (372 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +polyMulTerm (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +rec (4,161 samples, 0.13%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +$lambda (688 samples, 0.02%) + + + +map (326 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (532 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-32.65 (3,456 samples, 0.11%) + + + +natToBits (1,947 samples, 0.06%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-435.5 (624 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (5,440 samples, 0.18%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (957 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (13,056 samples, 0.42%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (289 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (1,162 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (304 samples, 0.01%) + + + +pathCoords (1,224 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (3,008 samples, 0.10%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +interleave (1,440 samples, 0.05%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (20,160 samples, 0.65%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +anon-func-387.7 (357 samples, 0.01%) + + + +rec (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (664 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +generate (2,112 samples, 0.07%) + + + +elemAdd (7,392 samples, 0.24%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-30.36 (478 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-133.5 (50,898 samples, 1.65%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyAdd (304 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (12,992 samples, 0.42%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +natZipWith (10,752 samples, 0.35%) + + + +polySub (352 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +rec (1,661 samples, 0.05%) + + + +correction (416 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +go (338 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (2,250 samples, 0.07%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (972 samples, 0.03%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-453.5 (472 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyGrow (319 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (6,392 samples, 0.21%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyScale (384 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +rec (1,768 samples, 0.06%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-51.11 (2,448 samples, 0.08%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (5,627 samples, 0.18%) + + + +polyPadRight (299 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-161.5 (4,352 samples, 0.14%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polyDivMod (304 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +map (1,024 samples, 0.03%) + + + +anon-func-393.5 (744 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +polyZipWith (1,107 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (740 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (522 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyLen (44,874 samples, 1.45%) + + + +anon-func-435.5 (10,240 samples, 0.33%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (12,104 samples, 0.39%) + + + +anon-func-38.11 (465 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (575 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-265.5 (4,034 samples, 0.13%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-387.7 (273 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +rec (6,534 samples, 0.21%) + + + +$lambda (619 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (34,560 samples, 1.12%) + + + +correction (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (966 samples, 0.03%) + + + +polyDivMod (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +polySub (1,312 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +encode (384 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (756 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +$lambda (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +interleave (289 samples, 0.01%) + + + +anon-func-51.11 (273 samples, 0.01%) + + + +rec (3,588 samples, 0.12%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +rec (1,581 samples, 0.05%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (3,872 samples, 0.13%) + + + +anon-func-435.5 (5,504 samples, 0.18%) + + + +anon-func-48.7 (1,440 samples, 0.05%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (476 samples, 0.02%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-393.5 (702 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-229.5 (666 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (280 samples, 0.01%) + + + +map (1,440 samples, 0.05%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-453.5 (413 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-51.11 (532 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +generate (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +polyAdd (704 samples, 0.02%) + + + +rec (12,844 samples, 0.42%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +polyAdd (608 samples, 0.02%) + + + +encode (325 samples, 0.01%) + + + +map (595 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +polySub (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyPadLeft (325 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +natFromBits (391 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (2,530 samples, 0.08%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +polyAddTerm (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +polyZipWith (18,496 samples, 0.60%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +polyGrow (325 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyMulTerm (688 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (7,072 samples, 0.23%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +rec (765 samples, 0.02%) + + + +flatten (3,744 samples, 0.12%) + + + +interleave (320 samples, 0.01%) + + + +rec (306 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-435.5 (2,016 samples, 0.07%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-161.5 (456 samples, 0.01%) + + + +rec (1,365 samples, 0.04%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-161.5 (290 samples, 0.01%) + + + +rec (360 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natToBytes (22,848 samples, 0.74%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (1,487 samples, 0.05%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +correction (1,440 samples, 0.05%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyMulTerm (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (13,856 samples, 0.45%) + + + +anon-func-51.11 (645 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +rec (21,888 samples, 0.71%) + + + +foldr (884 samples, 0.03%) + + + +map (608 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (137,574 samples, 4.45%) +anon-.. + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +map (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +map (1,326 samples, 0.04%) + + + +anon-func-79.3 (8,758 samples, 0.28%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +anon-func-161.5 (10,652 samples, 0.34%) + + + +polyOrder (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +anon-func-161.5 (1,440 samples, 0.05%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-393.5 (765 samples, 0.02%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-435.5 (36,256 samples, 1.17%) + + + +anon-func-435.5 (24,768 samples, 0.80%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +rec (1,098 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +polyAdd (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (496 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (1,040 samples, 0.03%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (317 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-244.5 (45,998 samples, 1.49%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +correction (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.08%) + + + +map (272 samples, 0.01%) + + + +anon-func-481.5 (1,080 samples, 0.03%) + + + +$lambda (2,754 samples, 0.09%) + + + +go (6,508 samples, 0.21%) + + + +interleave (688 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (1,664 samples, 0.05%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (404 samples, 0.01%) + + + +anon-func-161.5 (1,530 samples, 0.05%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (12,160 samples, 0.39%) + + + +encode (304 samples, 0.01%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +$lambda (1,024 samples, 0.03%) + + + +parse (340 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (2,448 samples, 0.08%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +rec (3,850 samples, 0.12%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-161.5 (273 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (280 samples, 0.01%) + + + +anon-func-79.3 (400 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (294 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (84,073 samples, 2.72%) +an.. + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +encode (280 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +map (352 samples, 0.01%) + + + +$lambda (3,456 samples, 0.11%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (306 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-435.5 (41,984 samples, 1.36%) + + + +rec (2,268 samples, 0.07%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +rec (3,780 samples, 0.12%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-300.5 (317 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +map (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +rec (3,910 samples, 0.13%) + + + +polyZipWith (688 samples, 0.02%) + + + +go (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +rec (360 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +rec (2,220 samples, 0.07%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +correction (480 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-481.5 (1,276 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +natZipWith (22,848 samples, 0.74%) + + + +polyAddTerm (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (661 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (640 samples, 0.02%) + + + +polyGrow (275 samples, 0.01%) + + + +anon-func-435.5 (10,240 samples, 0.33%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +generate (1,638 samples, 0.05%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +rec (1,224 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +rec (1,275 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +scale (2,072 samples, 0.07%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-300.5 (403 samples, 0.01%) + + + +map (966 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (575 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (4,760 samples, 0.15%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (475 samples, 0.02%) + + + +natFromBits (608 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (12,104 samples, 0.39%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-435.5 (16,288 samples, 0.53%) + + + +map (320 samples, 0.01%) + + + +polyAdd (3,840 samples, 0.12%) + + + +elemToBits (803 samples, 0.03%) + + + +polyDivMod (688 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +map (560 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +elemMul (10,064 samples, 0.33%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +go (320 samples, 0.01%) + + + +rec (2,915 samples, 0.09%) + + + +polySub (576 samples, 0.02%) + + + +rec (1,313 samples, 0.04%) + + + +rec (646 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +generate (756 samples, 0.02%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-481.5 (328 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyPadLeft (378 samples, 0.01%) + + + +rec (354 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +encode (6,768 samples, 0.22%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +correction (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +anon-func-453.5 (1,116 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +go (1,408 samples, 0.05%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-435.5 (26,880 samples, 0.87%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +rec (1,245 samples, 0.04%) + + + +rec (2,816 samples, 0.09%) + + + +polyScale (480 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyScale (384 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-51.11 (342 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-435.5 (24,320 samples, 0.79%) + + + +map (2,601 samples, 0.08%) + + + +correction (1,120 samples, 0.04%) + + + +correction (608 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +patternCoords (604 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-481.5 (1,008 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (2,496 samples, 0.08%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-30.36 (2,448 samples, 0.08%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +go (1,312 samples, 0.04%) + + + +rec (1,458 samples, 0.05%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +range (468 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-453.5 (472 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (290 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (439 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +polyAdd (1,920 samples, 0.06%) + + + +polySub (272 samples, 0.01%) + + + +correction (480 samples, 0.02%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-495.31 (450 samples, 0.01%) + + + +polyDivMod (12,002 samples, 0.39%) + + + +polyAdd (1,376 samples, 0.04%) + + + +pathCoords (3,456 samples, 0.11%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +revAppend (157,212 samples, 5.08%) +revApp.. + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyAdd (403 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +rec (330 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (2,601 samples, 0.08%) + + + +anon-func-161.5 (1,080 samples, 0.03%) + + + +anon-func-435.5 (47,232 samples, 1.53%) + + + +$lambda (1,312 samples, 0.04%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +rec (33,345 samples, 1.08%) + + + +correction (446 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (2,704 samples, 0.09%) + + + +interleave (416 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +polyDivMod (465 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +map (1,120 samples, 0.04%) + + + +polyAdd (935 samples, 0.03%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +go (6,516 samples, 0.21%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (468 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-61.36 (5,398 samples, 0.17%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +rec (5,032 samples, 0.16%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +encode (546 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +log (4,608 samples, 0.15%) + + + +natToBytes (10,752 samples, 0.35%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (333 samples, 0.01%) + + + +$lambda (271 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-229.5 (1,044 samples, 0.03%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +rec (637 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (20,736 samples, 0.67%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (292 samples, 0.01%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +alog (1,624 samples, 0.05%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +rec (2,210 samples, 0.07%) + + + +$lambda (1,312 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (27,760 samples, 0.90%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +polyAdd (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +forIn (522 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-453.5 (590 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +go (384 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-481.5 (1,330 samples, 0.04%) + + + +rec (605 samples, 0.02%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +map (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-229.5 (946 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (384 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (419 samples, 0.01%) + + + +polyMulTerm (320 samples, 0.01%) + + + +pathCoords (704 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-54.15 (342 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (360 samples, 0.01%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyPadLeft (403 samples, 0.01%) + + + +rec (1,881 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +encode (306 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (9,190 samples, 0.30%) + + + +pathCoords (546 samples, 0.02%) + + + +anon-func-412.5 (702 samples, 0.02%) + + + +elemMul (3,848 samples, 0.12%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +rec (1,080 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (462 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (6,720 samples, 0.22%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (340 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (342 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (1,024 samples, 0.03%) + + + +anon-func-481.5 (3,364 samples, 0.11%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-51.11 (2,226 samples, 0.07%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +pathCoords (357 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (2,178 samples, 0.07%) + + + +$lambda (1,920 samples, 0.06%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-435.5 (15,808 samples, 0.51%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (2,704 samples, 0.09%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-265.5 (720 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +go (5,236 samples, 0.17%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (688 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +anon-func-481.5 (404 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +skip_leb128 (408 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (1,360 samples, 0.04%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +rec (780 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-435.5 (5,184 samples, 0.17%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (799 samples, 0.03%) + + + +correction (289 samples, 0.01%) + + + +rec (384 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-161.5 (1,760 samples, 0.06%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (280 samples, 0.01%) + + + +polyScale (480 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-161.5 (1,170 samples, 0.04%) + + + +polyAdd (351 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-161.5 (418 samples, 0.01%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +encode (289 samples, 0.01%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (882 samples, 0.03%) + + + +correction (320 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +encode (624 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-412.5 (360 samples, 0.01%) + + + +rec (1,145 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-48.7 (625 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (6,768 samples, 0.22%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +pathCoords (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +rec (2,684 samples, 0.09%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +rec (2,268 samples, 0.07%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-435.5 (4,992 samples, 0.16%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +log (6,528 samples, 0.21%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-435.5 (6,656 samples, 0.22%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-161.5 (3,640 samples, 0.12%) + + + +map (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +go (290 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-412.5 (730 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +toBlocks (2,125 samples, 0.07%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-73.5 (73,206 samples, 2.37%) +a.. + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-30.36 (322 samples, 0.01%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +encode (576 samples, 0.02%) + + + +rowwise (137,574 samples, 4.45%) +rowwise + + +rec (352 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-161.5 (292 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +rec (5,022 samples, 0.16%) + + + +encode (2,754 samples, 0.09%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyScale (288 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyAdd (371 samples, 0.01%) + + + +rec (1,278 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-38.11 (489 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +polyPadLeft (300 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +interleave (3,744 samples, 0.12%) + + + +go (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyScale (624 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +rec (1,632 samples, 0.05%) + + + +polyDivMod (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (289 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (2,720 samples, 0.09%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +correction (688 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +map (806 samples, 0.03%) + + + +map (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +go (688 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (756 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +polyPadLeft (310 samples, 0.01%) + + + +anon-func-48.7 (306 samples, 0.01%) + + + +$lambda (3,580 samples, 0.12%) + + + +elemToBits (584 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyPadRight (731 samples, 0.02%) + + + +anon-func-54.15 (270 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-161.5 (1,920 samples, 0.06%) + + + +anon-func-481.5 (598 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyMulTerm (480 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-265.5 (2,634 samples, 0.09%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-48.7 (2,288 samples, 0.07%) + + + +correction (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +rec (649 samples, 0.02%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +rec (295 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (619 samples, 0.02%) + + + +anon-func-300.5 (27,760 samples, 0.90%) + + + +go (288 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +correction (272 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +map (274 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +$lambda (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (42,528 samples, 1.38%) + + + +$lambda (2,304 samples, 0.07%) + + + +map (544 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-481.5 (500 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (285 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +map (368 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-38.11 (5,508 samples, 0.18%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +encode (468 samples, 0.02%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +rec (1,298 samples, 0.04%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +toTarget (640 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (368 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +patternCoords (270 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (17,472 samples, 0.56%) + + + +encode (324 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (342 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +polyGrow (357 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (880 samples, 0.03%) + + + +interleave (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyDivMod (403 samples, 0.01%) + + + +interleave (800 samples, 0.03%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-435.5 (1,056 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +elemFromBits (326 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +utf8_validate (265 samples, 0.01%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (399 samples, 0.01%) + + + +rec (5,791 samples, 0.19%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-51.11 (966 samples, 0.03%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-32.65 (273 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (289 samples, 0.01%) + + + +anon-func-435.5 (1,904 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-161.5 (1,024 samples, 0.03%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (1,740 samples, 0.06%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +map (608 samples, 0.02%) + + + +anon-func-435.5 (6,688 samples, 0.22%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +generate (378 samples, 0.01%) + + + +anon-func-79.3 (1,638 samples, 0.05%) + + + +$lambda (544 samples, 0.02%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-412.5 (429 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (595 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (384 samples, 0.01%) + + + +rec (728 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,040 samples, 0.03%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (286 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-161.5 (310 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +$lambda (273 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-161.5 (280 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-54.15 (2,646 samples, 0.09%) + + + +anon-func-161.5 (4,352 samples, 0.14%) + + + +polyDivMod (408 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +polyGrow (377 samples, 0.01%) + + + +rec (1,297 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (2,418 samples, 0.08%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (512 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +rec (306 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +generate (288 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (1,024 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +polyPadLeft (357 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (6,528 samples, 0.21%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +B_add (54,792 samples, 1.77%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (386 samples, 0.01%) + + + +natXor (14,784 samples, 0.48%) + + + +anon-func-161.5 (4,744 samples, 0.15%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +interleave (1,440 samples, 0.05%) + + + +polyDivMod (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-54.15 (462 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyNew (360 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (2,518 samples, 0.08%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-393.5 (279 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +rec (321 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyScale (624 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +rec (1,404 samples, 0.05%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (624 samples, 0.02%) + + + +rec (391 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (1,105 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-229.5 (528 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAdd (288 samples, 0.01%) + + + +anon-func-300.5 (2,448 samples, 0.08%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-54.15 (357 samples, 0.01%) + + + +anon-func-79.3 (273 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +go (1,920 samples, 0.06%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyGrow (310 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (756 samples, 0.02%) + + + +anon-func-51.11 (4,882 samples, 0.16%) + + + +encode (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polyDivMod (480 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +polyZipWith (832 samples, 0.03%) + + + +$lambda (546 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +interleave (289 samples, 0.01%) + + + +anon-func-435.5 (36,736 samples, 1.19%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +rec (841 samples, 0.03%) + + + +anon-func-412.5 (280 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +encode (546 samples, 0.02%) + + + +generate (378 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +generate (8,130 samples, 0.26%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (361 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (8,160 samples, 0.26%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +rec (6,804 samples, 0.22%) + + + +anon-func-79.3 (8,130 samples, 0.26%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyAddTerm (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (1,664 samples, 0.05%) + + + +polyAdd (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-32.65 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (495 samples, 0.02%) + + + +anon-func-412.5 (1,062 samples, 0.03%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (1,394 samples, 0.05%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (624 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +polyPadRight (295 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +$lambda (403 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (360 samples, 0.01%) + + + +anon-func-51.11 (2,704 samples, 0.09%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +$lambda (12,104 samples, 0.39%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +rec (6,259 samples, 0.20%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-30.36 (384 samples, 0.01%) + + + +finderCoords (704 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-54.15 (273 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +natFromBytes (4,032 samples, 0.13%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (1,440 samples, 0.05%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +correction (5,008 samples, 0.16%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,408 samples, 0.05%) + + + +natFromBits (326 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +flatten (468 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +anon-func-412.5 (362 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (5,696 samples, 0.18%) + + + +anon-func-481.5 (468 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (3,744 samples, 0.12%) + + + +$lambda (352 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-51.11 (972 samples, 0.03%) + + + +correction (608 samples, 0.02%) + + + +rec (671 samples, 0.02%) + + + +$lambda (810 samples, 0.03%) + + + +anon-func-79.3 (1,000 samples, 0.03%) + + + +rec (1,624 samples, 0.05%) + + + +correction (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (1,058 samples, 0.03%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (1,920 samples, 0.06%) + + + +anon-func-435.5 (17,024 samples, 0.55%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +finderTLCoords (832 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (317 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-300.5 (1,496 samples, 0.05%) + + + +interleave (274 samples, 0.01%) + + + +patternCoords (4,194 samples, 0.14%) + + + +polyAdd (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +natZipWith (12,768 samples, 0.41%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +rec (725 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyAdd (459 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (489 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (13,024 samples, 0.42%) + + + +polyZipWith (608 samples, 0.02%) + + + +toList (664 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (285 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +rec (649 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +rec (19,024 samples, 0.62%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyDivMod (271 samples, 0.01%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-32.65 (4,194 samples, 0.14%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-229.5 (671 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (403 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +$lambda (3,456 samples, 0.11%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +patternCoords (2,563 samples, 0.08%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +anon-func-481.5 (408 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +correction (544 samples, 0.02%) + + + +polyPadLeft (561 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-435.5 (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-412.5 (685 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +encode (652 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyZipWith (1,120 samples, 0.04%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-435.5 (3,456 samples, 0.11%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-51.11 (832 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-481.5 (696 samples, 0.02%) + + + +anon-func-30.36 (850 samples, 0.03%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-435.5 (4,928 samples, 0.16%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyPadRight (319 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +polyScale (320 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-265.5 (674 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-412.5 (420 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-300.5 (4,032 samples, 0.13%) + + + +map (480 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (5,627 samples, 0.18%) + + + +encode (2,288 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-412.5 (771 samples, 0.02%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +map (1,942 samples, 0.06%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-229.5 (936 samples, 0.03%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +interleave (310 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (5,398 samples, 0.17%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-30.36 (274 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +correction (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +toListWithLength (581 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (480 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-38.11 (850 samples, 0.03%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +go (374 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +map (964 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyGrow (1,279 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +rec (865 samples, 0.03%) + + + +correction (271 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +flatten (338 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-435.5 (3,520 samples, 0.11%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +encode (6,768 samples, 0.22%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyMulTerm (320 samples, 0.01%) + + + +go (676 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +encode (338 samples, 0.01%) + + + +anon-func-161.5 (2,652 samples, 0.09%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +anon-func-494.5 (325 samples, 0.01%) + + + +polyAddTerm (368 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (618 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-481.5 (459 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +rec (767 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +rec (918 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +elemDiv (352 samples, 0.01%) + + + +polyGrow (289 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (2,630 samples, 0.09%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +generate (270 samples, 0.01%) + + + +generate (288 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +anon-func-481.5 (1,044 samples, 0.03%) + + + +finderCoords (1,224 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (6,144 samples, 0.20%) + + + +anon-func-48.7 (810 samples, 0.03%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-161.5 (1,904 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (5,508 samples, 0.18%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +correction (271 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (403 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (7,296 samples, 0.24%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (8,130 samples, 0.26%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +correction (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (756 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-161.5 (336 samples, 0.01%) + + + +anon-func-51.11 (5,696 samples, 0.18%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (280 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-265.5 (420 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +map (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +alog (3,451 samples, 0.11%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (2,030 samples, 0.07%) + + + +rec (536 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-265.5 (540 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +go (1,024 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +map (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-481.5 (464 samples, 0.02%) + + + +anon-func-51.11 (1,440 samples, 0.05%) + + + +patternCoords (9,808 samples, 0.32%) + + + +map (1,040 samples, 0.03%) + + + +anon-func-30.36 (368 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-453.5 (536 samples, 0.02%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +polyAdd (341 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (2,880 samples, 0.09%) + + + +polyPadLeft (450 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +rec (879 samples, 0.03%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (1,095 samples, 0.04%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-54.15 (1,224 samples, 0.04%) + + + +anon-func-161.5 (99,362 samples, 3.21%) +ano.. + + +$lambda (608 samples, 0.02%) + + + +anon-func-161.5 (1,116 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +traceCoords (1,786 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +$lambda (576 samples, 0.02%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (480 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (27,760 samples, 0.90%) + + + +polySub (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-79.3 (810 samples, 0.03%) + + + +encode (1,312 samples, 0.04%) + + + +rec (345 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (2,754 samples, 0.09%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +polyDivMod (1,024 samples, 0.03%) + + + +parse (826 samples, 0.03%) + + + +anon-func-161.5 (1,001 samples, 0.03%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-435.5 (10,752 samples, 0.35%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-435.5 (608 samples, 0.02%) + + + +natFromBits (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +natXor (12,096 samples, 0.39%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polyAdd (677 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +rec (814 samples, 0.03%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +$lambda (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +interleave (4,882 samples, 0.16%) + + + +correction (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +encode (9,808 samples, 0.32%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-38.11 (1,768 samples, 0.06%) + + + +correction (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (312 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-54.15 (810 samples, 0.03%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +encode (832 samples, 0.03%) + + + +anon-func-481.5 (506 samples, 0.02%) + + + +go (532 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +rec (1,326 samples, 0.04%) + + + +anon-func-79.3 (12,002 samples, 0.39%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +elemFromBits (266 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (358 samples, 0.01%) + + + +$lambda (1,520 samples, 0.05%) + + + +anon-func-481.5 (564 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyPadRight (731 samples, 0.02%) + + + +rec (1,170 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +rec (1,464 samples, 0.05%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (532 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (550 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (775 samples, 0.03%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (618 samples, 0.02%) + + + +anon-func-453.5 (472 samples, 0.02%) + + + +anon-func-435.5 (19,456 samples, 0.63%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (1,408 samples, 0.05%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (720 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +map (1,120 samples, 0.04%) + + + +generate (342 samples, 0.01%) + + + +rec (2,771 samples, 0.09%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-435.5 (12,096 samples, 0.39%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +rec (2,592 samples, 0.08%) + + + +toBlocks (625 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +anon-func-481.5 (406 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyScale (310 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +step (486 samples, 0.02%) + + + +anon-func-48.7 (361 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (340 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (1,024 samples, 0.03%) + + + +anon-func-79.3 (357 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAddTerm (384 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +finderCoords (288 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +polyZipWith (304 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +map (850 samples, 0.03%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (5,148 samples, 0.17%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (396 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyLeadCoeff (1,781 samples, 0.06%) + + + +go (5,355 samples, 0.17%) + + + +$lambda (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +log (6,528 samples, 0.21%) + + + +correction (310 samples, 0.01%) + + + +anon-func-229.5 (666 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +polyAdd (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyScale (517 samples, 0.02%) + + + +anon-func-161.5 (546 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-32.65 (1,764 samples, 0.06%) + + + +$lambda (1,764 samples, 0.06%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +polyMulTerm (480 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-161.5 (1,062 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (384 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +finderCoords (576 samples, 0.02%) + + + +rec (860 samples, 0.03%) + + + +rec (1,020 samples, 0.03%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +rec (1,014 samples, 0.03%) + + + +map (416 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +polyZipWith (935 samples, 0.03%) + + + +polyDivMod (576 samples, 0.02%) + + + +pathCoords (1,055 samples, 0.03%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-79.3 (754 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (50,400 samples, 1.63%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +parse (340 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-161.5 (5,320 samples, 0.17%) + + + +map (270 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (14,992 samples, 0.48%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +encode (361 samples, 0.01%) + + + +anon-func-435.5 (2,176 samples, 0.07%) + + + +correction (480 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +generate (288 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +elemNew (731 samples, 0.02%) + + + +B_mul (5,480 samples, 0.18%) + + + +polyAddTerm (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (624 samples, 0.02%) + + + +rec (650 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (2,418 samples, 0.08%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-265.5 (1,365 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (1,344 samples, 0.04%) + + + +correction (1,312 samples, 0.04%) + + + +elemAdd (5,376 samples, 0.17%) + + + +go (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +toBlocks (2,304 samples, 0.07%) + + + +$lambda (320 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (660 samples, 0.02%) + + + +anon-func-435.5 (14,592 samples, 0.47%) + + + +correction (352 samples, 0.01%) + + + +rec (374 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyTrim (5,544 samples, 0.18%) + + + +encode (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAdd (688 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (326 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +rec (7,668 samples, 0.25%) + + + +correction (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-51.11 (274 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +polyDivMod (560 samples, 0.02%) + + + +anon-func-161.5 (5,984 samples, 0.19%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +scale (2,288 samples, 0.07%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-412.5 (1,545 samples, 0.05%) + + + +anon-func-481.5 (510 samples, 0.02%) + + + +polyAddTerm (270 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +$lambda (2,304 samples, 0.07%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +correction (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +encode (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (592 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-79.3 (3,456 samples, 0.11%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (7,617 samples, 0.25%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (9,808 samples, 0.32%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +map (403 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +$lambda (290 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-79.3 (6,392 samples, 0.21%) + + + +go (270 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-393.5 (459 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +rec (2,093 samples, 0.07%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (2,448 samples, 0.08%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-30.36 (400 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (3,008 samples, 0.10%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-51.11 (595 samples, 0.02%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-229.5 (270 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyScale (408 samples, 0.01%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +anon-func-435.5 (11,616 samples, 0.38%) + + + +anon-func-300.5 (12,816 samples, 0.41%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (1,440 samples, 0.05%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-61.36 (1,408 samples, 0.05%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +$lambda (3,744 samples, 0.12%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +natToBytes (51,072 samples, 1.65%) + + + +go (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (372 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-412.5 (472 samples, 0.02%) + + + +rec (1,183 samples, 0.04%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-435.5 (528 samples, 0.02%) + + + +anon-func-161.5 (2,112 samples, 0.07%) + + + +rec (3,530 samples, 0.11%) + + + +polyDivMod (384 samples, 0.01%) + + + +rec (2,193 samples, 0.07%) + + + +go (1,120 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-161.5 (1,624 samples, 0.05%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-54.15 (378 samples, 0.01%) + + + +polyScale (624 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-133.5 (21,672 samples, 0.70%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (341 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +parse_idl_header (1,518 samples, 0.05%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (510 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (304 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-412.5 (1,683 samples, 0.05%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +go (271 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +$lambda (363 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polyAdd (299 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (2,016 samples, 0.07%) + + + +anon-func-481.5 (500 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +rec (1,962 samples, 0.06%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 0.01%) + + + +rec (1,496 samples, 0.05%) + + + +rec (864 samples, 0.03%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (575 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (1,024 samples, 0.03%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +polyPadLeft (677 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-51.11 (780 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +anon-func-161.5 (570 samples, 0.02%) + + + +anon-func-435.5 (13,728 samples, 0.44%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +rec (949 samples, 0.03%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-48.7 (341 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyPadRight (731 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-48.7 (12,104 samples, 0.39%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (9,214 samples, 0.30%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (64,448 samples, 2.08%) +a.. + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (270 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +elemToBits (1,314 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-161.5 (532 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (1,920 samples, 0.06%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-161.5 (84,073 samples, 2.72%) +an.. + + +polyAddTerm (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (1,024 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (768 samples, 0.02%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-48.7 (357 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (550 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +finderCoords (810 samples, 0.03%) + + + +go (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyScale (270 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (285 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-229.5 (4,258 samples, 0.14%) + + + +interleave (3,744 samples, 0.12%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-161.5 (3,094 samples, 0.10%) + + + +anon-func-161.5 (272 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +rec (702 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +encode (304 samples, 0.01%) + + + +scale (3,256 samples, 0.11%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyZipWith (1,328 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (1,279 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (7,392 samples, 0.24%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +map (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (289 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-229.5 (2,128 samples, 0.07%) + + + +scale (5,984 samples, 0.19%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (378 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyDivMod (274 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +pathCoords (4,194 samples, 0.14%) + + + +correction (608 samples, 0.02%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (18,496 samples, 0.60%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +rec (8,828 samples, 0.29%) + + + +anon-func-30.36 (806 samples, 0.03%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-54.15 (832 samples, 0.03%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +interleave (326 samples, 0.01%) + + + +polyGrow (527 samples, 0.02%) + + + +anon-func-48.7 (2,312 samples, 0.07%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-265.5 (495 samples, 0.02%) + + + +rec (5,796 samples, 0.19%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (1,326 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-481.5 (332 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +map (286 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (357 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (806 samples, 0.03%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +rec (1,071 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +interleave (280 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (1,382 samples, 0.04%) + + + +interleave (3,744 samples, 0.12%) + + + +map (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +rec (352 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-32.65 (1,224 samples, 0.04%) + + + +polyScale (480 samples, 0.02%) + + + +anon-func-412.5 (810 samples, 0.03%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +$lambda (1,024 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (638 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +map (3,744 samples, 0.12%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyZipWith (272 samples, 0.01%) + + + +toBlocks (280 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (5,696 samples, 0.18%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (1,200 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (416 samples, 0.01%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-161.5 (4,896 samples, 0.16%) + + + +pathCoords (546 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +$lambda (2,601 samples, 0.08%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyDivMod (5,696 samples, 0.18%) + + + +go (320 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (2,448 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +traceCoords (4,466 samples, 0.14%) + + + +interleave (352 samples, 0.01%) + + + +correction (624 samples, 0.02%) + + + +anon-func-481.5 (834 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (381 samples, 0.01%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-265.5 (4,314 samples, 0.14%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (342 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-435.5 (8,192 samples, 0.26%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyAddTerm (290 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (1,055 samples, 0.03%) + + + +rec (568 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +natFromBits (374 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (480 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +patternCoords (8,130 samples, 0.26%) + + + +go (544 samples, 0.02%) + + + +patternCoords (2,112 samples, 0.07%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polySub (1,120 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (2,080 samples, 0.07%) + + + +rec (325 samples, 0.01%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (799 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +rec (440 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +anon-func-161.5 (637 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-229.5 (638 samples, 0.02%) + + + +interleave (624 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +$lambda (645 samples, 0.02%) + + + +anon-func-289.5 (3,312 samples, 0.11%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (5,627 samples, 0.18%) + + + +$lambda (352 samples, 0.01%) + + + +rec (17,391 samples, 0.56%) + + + +anon-func-79.3 (462 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyGrow (351 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +go (1,664 samples, 0.05%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-48.7 (378 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +rec (1,598 samples, 0.05%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-453.5 (413 samples, 0.01%) + + + +anon-func-79.3 (289 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +compacting_gc (855 samples, 0.03%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (704 samples, 0.02%) + + + +natXor (2,688 samples, 0.09%) + + + +encode (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +rec (2,034 samples, 0.07%) + + + +correction (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polyScale (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +encode (608 samples, 0.02%) + + + +anon-func-48.7 (468 samples, 0.02%) + + + +B_sub (18,105 samples, 0.59%) + + + +anon-func-30.36 (1,440 samples, 0.05%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAddTerm (304 samples, 0.01%) + + + +anon-func-265.5 (795 samples, 0.03%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-481.5 (594 samples, 0.02%) + + + +polyDivMod (2,312 samples, 0.07%) + + + +go (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (1,235 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-161.5 (316 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-229.5 (481 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +interleave (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-435.5 (352 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (372 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyMulTerm (480 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (285 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-161.5 (2,754 samples, 0.09%) + + + +anon-func-435.5 (4,800 samples, 0.16%) + + + +polyAdd (416 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polySub (1,216 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (768 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +anon-func-481.5 (3,132 samples, 0.10%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-161.5 (312 samples, 0.01%) + + + +anon-func-79.3 (2,563 samples, 0.08%) + + + +anon-func-161.5 (1,560 samples, 0.05%) + + + +polyAdd (1,152 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,664 samples, 0.05%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-161.5 (4,040 samples, 0.13%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +map (575 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-48.7 (338 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +polyScale (352 samples, 0.01%) + + + +anon-func-481.5 (910 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (372 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-435.5 (960 samples, 0.03%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (1,408 samples, 0.05%) + + + +interleave (304 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-38.11 (560 samples, 0.02%) + + + +anon-func-435.5 (24,320 samples, 0.79%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +rec (297 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (1,456 samples, 0.05%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-229.5 (2,284 samples, 0.07%) + + + +anon-func-435.5 (3,648 samples, 0.12%) + + + +natFromBits (288 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-161.5 (1,776 samples, 0.06%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +anon-func-481.5 (494 samples, 0.02%) + + + +step (470 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (2,704 samples, 0.09%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +polyMulTerm (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +rec (720 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (357 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +anon-func-435.5 (11,648 samples, 0.38%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +finderCoords (2,112 samples, 0.07%) + + + +polySub (576 samples, 0.02%) + + + +rec (806 samples, 0.03%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +correction (446 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +correction (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +flatten (638 samples, 0.02%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +anon-func-435.5 (1,152 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +finderCoords (3,456 samples, 0.11%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +polySub (544 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +generate (606 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +polyScale (352 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (6,912 samples, 0.22%) + + + +anon-func-435.5 (2,432 samples, 0.08%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-300.5 (645 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (496 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-161.5 (5,904 samples, 0.19%) + + + +elemFromBits (608 samples, 0.02%) + + + +$lambda (575 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +finderTLCoords (832 samples, 0.03%) + + + +correction (320 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (1,942 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +interleave (270 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +go (608 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-481.5 (756 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +interleave (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (320 samples, 0.01%) + + + +anon-func-265.5 (1,485 samples, 0.05%) + + + +map (8,802 samples, 0.28%) + + + +interleave (12,816 samples, 0.41%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +go (320 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (955 samples, 0.03%) + + + +polyAdd (2,240 samples, 0.07%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (274 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +map (3,744 samples, 0.12%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (419 samples, 0.01%) + + + +rec (46,717 samples, 1.51%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +anon-func-435.5 (4,480 samples, 0.14%) + + + +rec (615 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-265.5 (845 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (704 samples, 0.02%) + + + +encode (676 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +encode (270 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +correction (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +go (304 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-161.5 (665 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +elemMul (2,816 samples, 0.09%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (434 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +rec (882 samples, 0.03%) + + + +polySub (352 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +polyZipWith (42,752 samples, 1.38%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polyDivMod (320 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +elemFromBits (608 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (1,440 samples, 0.05%) + + + +anon-func-435.5 (24,192 samples, 0.78%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +polyDivMod (480 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-435.5 (24,320 samples, 0.79%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (8,758 samples, 0.28%) + + + +correction (480 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (4,194 samples, 0.14%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-68.41 (22,848 samples, 0.74%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +go (476 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +interleave (9,308 samples, 0.30%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (324 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-161.5 (1,408 samples, 0.05%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-481.5 (324 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +rec (1,479 samples, 0.05%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +correction (1,024 samples, 0.03%) + + + +polyAdd (512 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (403 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +go (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (885 samples, 0.03%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyGrow (522 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-161.5 (391 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +polyMulTerm (480 samples, 0.02%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +correction (544 samples, 0.02%) + + + +polyZipWith (403 samples, 0.01%) + + + +polyMulTerm (595 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (1,134 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +map (1,920 samples, 0.06%) + + + +go (1,120 samples, 0.04%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (2,754 samples, 0.09%) + + + +encode (416 samples, 0.01%) + + + +anon-func-435.5 (1,040 samples, 0.03%) + + + +$lambda (608 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (625 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-161.5 (1,224 samples, 0.04%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +anon-func-54.15 (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyScale (624 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-435.5 (3,040 samples, 0.10%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-161.5 (1,600 samples, 0.05%) + + + +anon-func-54.15 (378 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (6,768 samples, 0.22%) + + + +correction (304 samples, 0.01%) + + + +polySub (272 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,664 samples, 0.05%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyDivMod (676 samples, 0.02%) + + + +anon-func-229.5 (559 samples, 0.02%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-300.5 (400 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +$lambda (1,312 samples, 0.04%) + + + +rec (960 samples, 0.03%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-79.3 (306 samples, 0.01%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +polyDivMod (352 samples, 0.01%) + + + +natFromBits (364 samples, 0.01%) + + + +anon-func-48.7 (880 samples, 0.03%) + + + +finderCoords (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +toTarget (2,250 samples, 0.07%) + + + +map (419 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-453.5 (649 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polySub (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (476 samples, 0.02%) + + + +encode (317 samples, 0.01%) + + + +rec (558 samples, 0.02%) + + + +anon-func-481.5 (1,972 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +elemAdd (5,376 samples, 0.17%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +$lambda (1,920 samples, 0.06%) + + + +padLeftTo (1,746 samples, 0.06%) + + + +anon-func-30.36 (5,627 samples, 0.18%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (2,630 samples, 0.09%) + + + +polyPadRight (270 samples, 0.01%) + + + +B_rem (39,848 samples, 1.29%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +$lambda (286 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyAddTerm (270 samples, 0.01%) + + + +rec (552 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-48.7 (2,601 samples, 0.08%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (12,800 samples, 0.41%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +correction (416 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +correction (1,216 samples, 0.04%) + + + +anon-func-161.5 (1,408 samples, 0.05%) + + + +anon-func-38.11 (400 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-393.5 (539 samples, 0.02%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyPadLeft (419 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (5,627 samples, 0.18%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-435.5 (832 samples, 0.03%) + + + +polyAddTerm (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +formatVCoords (606 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +patternCoords (704 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-300.5 (5,376 samples, 0.17%) + + + +anon-func-161.5 (2,048 samples, 0.07%) + + + +polyAdd (576 samples, 0.02%) + + + +rec (319 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-51.11 (484 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +rec (1,394 samples, 0.05%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (304 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +$lambda (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (326 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyLeadCoeff (289 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +toBlocks (1,360 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-54.15 (704 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +rec (2,376 samples, 0.08%) + + + +polyZipWith (512 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +anon-func-435.5 (3,360 samples, 0.11%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (855 samples, 0.03%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (5,696 samples, 0.18%) + + + +pathCoords (2,496 samples, 0.08%) + + + +correction (272 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyPadLeft (270 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-161.5 (1,314 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polyAdd (273 samples, 0.01%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +anon-func-79.3 (364 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-161.5 (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +finderCoords (342 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-30.36 (3,744 samples, 0.12%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +rec (583 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +correction (320 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-435.5 (4,160 samples, 0.13%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +rec (656 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-161.5 (3,848 samples, 0.12%) + + + +correction (880 samples, 0.03%) + + + +anon-func-51.11 (5,728 samples, 0.19%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +rec (1,292 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-48.7 (1,683 samples, 0.05%) + + + +map (595 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (489 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +patternCoords (4,194 samples, 0.14%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +rec (782 samples, 0.03%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +flatten (468 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +encode (364 samples, 0.01%) + + + +anon-func-393.5 (702 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-481.5 (1,763 samples, 0.06%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyMulTerm (624 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyScale (480 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +generate (780 samples, 0.03%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-265.5 (1,794 samples, 0.06%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +rec (416 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +anon-func-481.5 (918 samples, 0.03%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polyMulTerm (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +rec (5,151 samples, 0.17%) + + + +encode (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +elemDiv (320 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (1,638 samples, 0.05%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +$lambda (1,312 samples, 0.04%) + + + +rec (1,408 samples, 0.05%) + + + +go (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +encode (480 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +finderTLCoords (1,764 samples, 0.06%) + + + +anon-func-48.7 (5,008 samples, 0.16%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (1,040 samples, 0.03%) + + + +anon-func-161.5 (2,483 samples, 0.08%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (1,040 samples, 0.03%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +interleave (1,120 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +polyAddTerm (3,008 samples, 0.10%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +correction (272 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (1,768 samples, 0.06%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +rec (2,453 samples, 0.08%) + + + +rec (1,469 samples, 0.05%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (5,696 samples, 0.18%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +pathCoords (832 samples, 0.03%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (3,200 samples, 0.10%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-435.5 (1,248 samples, 0.04%) + + + +anon-func-435.5 (640 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-435.5 (3,568 samples, 0.12%) + + + +polyGrow (342 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +encode (360 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyGrow (414 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +rec (1,320 samples, 0.04%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +generate (1,224 samples, 0.04%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +anon-func-481.5 (962 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-435.5 (2,752 samples, 0.09%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +$lambda (608 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polySub (288 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (517 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (308 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (306 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-435.5 (12,480 samples, 0.40%) + + + +anon-func-48.7 (1,920 samples, 0.06%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (446 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +generate (462 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +rec (752 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +rec (3,864 samples, 0.12%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-30.36 (496 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +toBlocks (1,408 samples, 0.05%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-481.5 (380 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (904 samples, 0.03%) + + + +encode (608 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +map (1,989 samples, 0.06%) + + + +polyMulTerm (320 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-79.3 (14,992 samples, 0.48%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyDivMod (5,202 samples, 0.17%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-265.5 (1,260 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +$lambda (5,627 samples, 0.18%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-161.5 (544 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-481.5 (408 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +rec (5,323 samples, 0.17%) + + + +polyMulTerm (688 samples, 0.02%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +generate (323,033 samples, 10.44%) +generate + + +interleave (1,216 samples, 0.04%) + + + +anon-func-38.11 (27,760 samples, 0.90%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +encode (1,520 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +anon-func-161.5 (300 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-79.3 (364 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-453.5 (413 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-32.65 (4,194 samples, 0.14%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-161.5 (294 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (1,408 samples, 0.05%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-300.5 (326 samples, 0.01%) + + + +interleave (2,704 samples, 0.09%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +$lambda (2,634 samples, 0.09%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-79.3 (2,646 samples, 0.09%) + + + +correction (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (4,760 samples, 0.15%) + + + +correction (576 samples, 0.02%) + + + +anon-func-161.5 (730 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +generate (2,644 samples, 0.09%) + + + +anon-func-161.5 (606 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-30.36 (360 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +natFromBytes (25,536 samples, 0.83%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +go (338 samples, 0.01%) + + + +interleave (688 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (904 samples, 0.03%) + + + +polyZipWith (527 samples, 0.02%) + + + +anon-func-32.65 (1,152 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (595 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +$lambda (274 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (704 samples, 0.02%) + + + +anon-func-435.5 (3,648 samples, 0.12%) + + + +encode (544 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +polyDivMod (384 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +rec (1,368 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (1,764 samples, 0.06%) + + + +anon-func-435.5 (2,560 samples, 0.08%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-435.5 (5,408 samples, 0.17%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +polyAdd (306 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-265.5 (3,474 samples, 0.11%) + + + +natXor (1,344 samples, 0.04%) + + + +anon-func-435.5 (2,912 samples, 0.09%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +traceCoords (378 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (288 samples, 0.01%) + + + +polyAdd (1,920 samples, 0.06%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +correction (304 samples, 0.01%) + + + +rec (308 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAddTerm (272 samples, 0.01%) + + + +polySub (1,312 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-30.36 (624 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +correction (288 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +interleave (434 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polySub (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +rec (2,088 samples, 0.07%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-161.5 (8,380 samples, 0.27%) + + + +anon-func-300.5 (491 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +rec (1,339 samples, 0.04%) + + + +anon-func-435.5 (36,480 samples, 1.18%) + + + +$lambda (576 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-435.5 (12,672 samples, 0.41%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-435.5 (1,440 samples, 0.05%) + + + +anon-func-481.5 (1,675 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (1,008 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (6,392 samples, 0.21%) + + + +natZipWith (8,736 samples, 0.28%) + + + +rec (7,063 samples, 0.23%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (342 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +correction (1,216 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-435.5 (8,960 samples, 0.29%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-453.5 (3,422 samples, 0.11%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-51.11 (306 samples, 0.01%) + + + +anon-func-30.36 (306 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +finderCoords (1,152 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-435.5 (7,872 samples, 0.25%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +$lambda (270 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (403 samples, 0.01%) + + + +rec (2,711 samples, 0.09%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-435.5 (3,808 samples, 0.12%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +finderCoords (704 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-265.5 (2,074 samples, 0.07%) + + + +rec (608 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-435.5 (672 samples, 0.02%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +$lambda (320 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polySub (1,312 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (532 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (288 samples, 0.01%) + + + +anon-func-435.5 (480 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-161.5 (280 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +rec (1,476 samples, 0.05%) + + + +map (272 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (363 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (480 samples, 0.02%) + + + +anon-func-161.5 (2,720 samples, 0.09%) + + + +correction (352 samples, 0.01%) + + + +go (12,816 samples, 0.41%) + + + +correction (576 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +polySub (576 samples, 0.02%) + + + +interleave (2,704 samples, 0.09%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +interleave (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +interleave (516 samples, 0.02%) + + + +anon-func-30.36 (9,308 samples, 0.30%) + + + +polyAddTerm (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (290 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +go (1,216 samples, 0.04%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (619 samples, 0.02%) + + + +rec (925 samples, 0.03%) + + + +formatVCoords (270 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (10,944 samples, 0.35%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +polyZipWith (704 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +rec (339 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +polyGrow (505 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-51.11 (661 samples, 0.02%) + + + +anon-func-48.7 (12,816 samples, 0.41%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (1,055 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +encode (1,989 samples, 0.06%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-435.5 (13,312 samples, 0.43%) + + + +correction (544 samples, 0.02%) + + + +correction (27,760 samples, 0.90%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +go (576 samples, 0.02%) + + + +anon-func-38.11 (484 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (780 samples, 0.03%) + + + +$lambda (304 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +polyAdd (3,840 samples, 0.12%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +anon-func-79.3 (1,768 samples, 0.06%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-38.11 (271 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.04%) + + + +interleave (320 samples, 0.01%) + + + +encode (688 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +$lambda (832 samples, 0.03%) + + + +anon-func-481.5 (770 samples, 0.02%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-48.7 (1,638 samples, 0.05%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-48.7 (1,040 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +correction (480 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-51.11 (2,304 samples, 0.07%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (24,192 samples, 0.78%) + + + +anon-func-435.5 (16,640 samples, 0.54%) + + + +go (1,312 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyGrow (333 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-51.11 (2,630 samples, 0.09%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +correction (288 samples, 0.01%) + + + +anon-func-161.5 (284 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (1,470 samples, 0.05%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polySub (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (423 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +rec (2,363 samples, 0.08%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +$lambda (320 samples, 0.01%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +toBlocks (4,882 samples, 0.16%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +anon-func-79.3 (84,073 samples, 2.72%) +an.. + + +$lambda (288 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +polyTrim (1,720 samples, 0.06%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +natFromBits (316 samples, 0.01%) + + + +go (595 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-161.5 (2,560 samples, 0.08%) + + + +anon-func-453.5 (358 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-435.5 (12,160 samples, 0.39%) + + + +anon-func-435.5 (1,760 samples, 0.06%) + + + +encode (2,496 samples, 0.08%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +rec (533 samples, 0.02%) + + + +polyDivMod (645 samples, 0.02%) + + + +anon-func-435.5 (17,408 samples, 0.56%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +encode (304 samples, 0.01%) + + + +polyAddTerm (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyAdd (304 samples, 0.01%) + + + +anon-func-435.5 (2,592 samples, 0.08%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +anon-func-161.5 (768 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (4,264 samples, 0.14%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-412.5 (515 samples, 0.02%) + + + +anon-func-79.3 (556 samples, 0.02%) + + + +anon-func-453.5 (330 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyPadRight (273 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-161.5 (390 samples, 0.01%) + + + +anon-func-481.5 (2,668 samples, 0.09%) + + + +polySub (576 samples, 0.02%) + + + +encode (384 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-481.5 (350 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +anon-func-435.5 (7,040 samples, 0.23%) + + + +anon-func-435.5 (22,848 samples, 0.74%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +anon-func-481.5 (904 samples, 0.03%) + + + +polyScale (384 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +rec (1,134 samples, 0.04%) + + + +anon-func-51.11 (2,644 samples, 0.09%) + + + +go (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (645 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (288 samples, 0.01%) + + + +map (14,992 samples, 0.48%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-481.5 (2,135 samples, 0.07%) + + + +correction (1,920 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-435.5 (3,168 samples, 0.10%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-435.5 (17,024 samples, 0.55%) + + + +polyTrim (4,004 samples, 0.13%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (512 samples, 0.02%) + + + +forIn (493 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (320 samples, 0.01%) + + + +interleave (286 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (8,393 samples, 0.27%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-435.5 (5,520 samples, 0.18%) + + + +anon-func-393.5 (1,674 samples, 0.05%) + + + +rec (765 samples, 0.02%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +pathCoords (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (338 samples, 0.01%) + + + +polyPadRight (333 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyMulTerm (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-161.5 (440 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-300.5 (1,876 samples, 0.06%) + + + +rec (3,965 samples, 0.13%) + + + +polyAdd (544 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +map (1,216 samples, 0.04%) + + + +rec (840 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (1,024 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (23,040 samples, 0.74%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-481.5 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-393.5 (565 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polySub (1,120 samples, 0.04%) + + + +anon-func-79.3 (8,086 samples, 0.26%) + + + +anon-func-79.3 (489 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +polyDivMod (384 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-38.11 (12,816 samples, 0.41%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +natXor (17,472 samples, 0.56%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +polyAddTerm (320 samples, 0.01%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-79.3 (478 samples, 0.02%) + + + +anon-func-51.11 (338 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-481.5 (336 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (273 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (480 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (1,312 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (5,398 samples, 0.17%) + + + +anon-func-79.3 (2,288 samples, 0.07%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +$lambda (360 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (806 samples, 0.03%) + + + +encode (352 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +flatten (2,704 samples, 0.09%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +rec (378 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +encode (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-161.5 (780 samples, 0.03%) + + + +elemDiv (1,120 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +polyAdd (1,088 samples, 0.04%) + + + +polyAdd (688 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +go (2,754 samples, 0.09%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (378 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-161.5 (969 samples, 0.03%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +go (2,304 samples, 0.07%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-161.5 (3,456 samples, 0.11%) + + + +polySub (576 samples, 0.02%) + + + +polySub (645 samples, 0.02%) + + + +anon-func-161.5 (8,086 samples, 0.26%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-51.11 (270 samples, 0.01%) + + + +rec (1,155 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (7,616 samples, 0.25%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-161.5 (364 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +correction (532 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-435.5 (1,024 samples, 0.03%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (368 samples, 0.01%) + + + +polyAdd (544 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +go (608 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-300.5 (1,040 samples, 0.03%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-229.5 (495 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +polyAdd (377 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyDivMod (304 samples, 0.01%) + + + +rec (1,666 samples, 0.05%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyAdd (2,240 samples, 0.07%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +rec (2,172 samples, 0.07%) + + + +anon-func-435.5 (6,336 samples, 0.20%) + + + +anon-func-161.5 (4,524 samples, 0.15%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +encode (364 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-30.36 (270 samples, 0.01%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +encode (384 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-161.5 (1,088 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyMulTerm (688 samples, 0.02%) + + + +anon-func-161.5 (546 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-435.5 (10,880 samples, 0.35%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-48.7 (664 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (5,696 samples, 0.18%) + + + +anon-func-54.15 (546 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-38.11 (1,920 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +encode (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +rec (975 samples, 0.03%) + + + +polySub (1,312 samples, 0.04%) + + + +generate (756 samples, 0.02%) + + + +anon-func-435.5 (40,736 samples, 1.32%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-161.5 (832 samples, 0.03%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-435.5 (11,520 samples, 0.37%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (27,760 samples, 0.90%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyAdd (42,752 samples, 1.38%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +$lambda (832 samples, 0.03%) + + + +anon-func-79.3 (2,644 samples, 0.09%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +polySub (465 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (496 samples, 0.02%) + + + +anon-func-161.5 (3,029 samples, 0.10%) + + + +go (608 samples, 0.02%) + + + +polyZipWith (323 samples, 0.01%) + + + +interleave (8,802 samples, 0.28%) + + + +rec (345 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +encode (304 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (624 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (880 samples, 0.03%) + + + +encode (416 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-300.5 (680 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-51.11 (624 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +rec (1,530 samples, 0.05%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (608 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (12,816 samples, 0.41%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +rec (855 samples, 0.03%) + + + +polyGrow (8,704 samples, 0.28%) + + + +$lambda (272 samples, 0.01%) + + + +rec (666 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +encode (416 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-48.7 (384 samples, 0.01%) + + + +anon-func-79.3 (624 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +natFromBits (608 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +interleave (1,920 samples, 0.06%) + + + +interleave (384 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyScale (270 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (4,256 samples, 0.14%) + + + +polyMulTerm (544 samples, 0.02%) + + + +anon-func-38.11 (374 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (439 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (2,112 samples, 0.07%) + + + +$lambda (352 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +correction (5,202 samples, 0.17%) + + + +anon-func-435.5 (1,664 samples, 0.05%) + + + +interleave (320 samples, 0.01%) + + + +polyAdd (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (2,048 samples, 0.07%) + + + +anon-func-481.5 (330 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-44.5 (48,035 samples, 1.55%) + + + +polyZipWith (2,432 samples, 0.08%) + + + +polyPadRight (1,023 samples, 0.03%) + + + +polyDivMod (304 samples, 0.01%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +anon-func-435.5 (2,896 samples, 0.09%) + + + +polyAddTerm (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-48.7 (439 samples, 0.01%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyZipWith (272 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-435.5 (17,280 samples, 0.56%) + + + +polyAdd (704 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-161.5 (1,298 samples, 0.04%) + + + +anon-func-435.5 (576 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (360 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +map (341 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-161.5 (2,994 samples, 0.10%) + + + +interleave (1,216 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-48.7 (279 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-51.11 (446 samples, 0.01%) + + + +anon-func-161.5 (1,728 samples, 0.06%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +polyAdd (3,840 samples, 0.12%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +encode (272 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +polyZipWith (704 samples, 0.02%) + + + +anon-func-453.5 (1,098 samples, 0.04%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-435.5 (1,792 samples, 0.06%) + + + +rec (369 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (416 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +map (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyAddTerm (446 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-435.5 (1,728 samples, 0.06%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-30.36 (289 samples, 0.01%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (270 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-435.5 (7,296 samples, 0.24%) + + + +toBlocks (280 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (2,288 samples, 0.07%) + + + +$lambda (352 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +polyAdd (403 samples, 0.01%) + + + +anon-func-161.5 (1,314 samples, 0.04%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +polyMulTerm (320 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +map (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +correction (352 samples, 0.01%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +anon-func-481.5 (986 samples, 0.03%) + + + +polyPadLeft (522 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +map (608 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +encode (5,508 samples, 0.18%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-48.7 (560 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +elemToBits (1,241 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-38.11 (440 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +encode (880 samples, 0.03%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyAdd (288 samples, 0.01%) + + + +encode (1,152 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-48.7 (84,073 samples, 2.72%) +an.. + + +correction (688 samples, 0.02%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +polySub (608 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +anon-func-481.5 (1,508 samples, 0.05%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (11,648 samples, 0.38%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +interleave (608 samples, 0.02%) + + + +rec (303 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +generate (2,563 samples, 0.08%) + + + +map (688 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-161.5 (1,584 samples, 0.05%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +go (1,408 samples, 0.05%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +encode (137,574 samples, 4.45%) +encode + + +map (352 samples, 0.01%) + + + +anon-func-265.5 (720 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +anon-func-48.7 (1,024 samples, 0.03%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyAdd (18,496 samples, 0.60%) + + + +polyZipWith (320 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +$lambda (688 samples, 0.02%) + + + +anon-func-435.5 (2,688 samples, 0.09%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +encode (576 samples, 0.02%) + + + +rec (1,188 samples, 0.04%) + + + +go (272 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +elemFromBits (391 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +polyScale (478 samples, 0.02%) + + + +anon-func-48.7 (496 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-481.5 (300 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (434 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-161.5 (3,840 samples, 0.12%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-48.7 (403 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-300.5 (360 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-51.11 (556 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyNew (864 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-79.3 (1,055 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-435.5 (320 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-229.5 (605 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +encode (357 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (468 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-38.11 (5,202 samples, 0.17%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (1,024 samples, 0.03%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +polyAddTerm (352 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyPadLeft (377 samples, 0.01%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +map (272 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +$lambda (274 samples, 0.01%) + + + +patternCoords (342 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAdd (688 samples, 0.02%) + + + +polyDivMod (272 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-481.5 (460 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +go (283 samples, 0.01%) + + + +rec (510 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +encode (480 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-30.36 (374 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +rec (3,077 samples, 0.10%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (1,768 samples, 0.06%) + + + +go (320 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-435.5 (8,064 samples, 0.26%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-73.5 (6,052 samples, 0.20%) + + + +$lambda (1,216 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (22,016 samples, 0.71%) + + + +polyDivMod (306 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (2,226 samples, 0.07%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-265.5 (595 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +$lambda (1,152 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +map (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-38.11 (6,768 samples, 0.22%) + + + +map (5,398 samples, 0.17%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-300.5 (856 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (528 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-300.5 (290 samples, 0.01%) + + + +$lambda (608 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-481.5 (610 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +$lambda (352 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +interleave (363 samples, 0.01%) + + + +anon-func-435.5 (4,800 samples, 0.16%) + + + +anon-func-435.5 (4,032 samples, 0.13%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-481.5 (357 samples, 0.01%) + + + +anon-func-435.5 (21,888 samples, 0.71%) + + + +anon-func-435.5 (9,792 samples, 0.32%) + + + +anon-func-300.5 (283 samples, 0.01%) + + + +anon-func-481.5 (3,248 samples, 0.11%) + + + +interleave (1,312 samples, 0.04%) + + + +polyDivMod (688 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +encode (480 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +log (3,072 samples, 0.10%) + + + +go (1,312 samples, 0.04%) + + + +anon-func-161.5 (2,046 samples, 0.07%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-481.5 (1,750 samples, 0.06%) + + + +anon-func-435.5 (4,576 samples, 0.15%) + + + +$lambda (280 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (280 samples, 0.01%) + + + +anon-func-38.11 (270 samples, 0.01%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +anon-func-161.5 (320 samples, 0.01%) + + + +anon-func-51.11 (2,112 samples, 0.07%) + + + +anon-func-265.5 (320 samples, 0.01%) + + + +polyAddTerm (317 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +$lambda (1,312 samples, 0.04%) + + + +rec (348 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +anon-func-161.5 (3,456 samples, 0.11%) + + + +rec (306 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-161.5 (480 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +anon-func-481.5 (304 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (832 samples, 0.03%) + + + +correction (304 samples, 0.01%) + + + +anon-func-481.5 (612 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +$lambda (1,440 samples, 0.05%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-435.5 (9,216 samples, 0.30%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +polyDivMod (512 samples, 0.02%) + + + +anon-func-435.5 (18,432 samples, 0.60%) + + + +elemMul (2,288 samples, 0.07%) + + + +traceCoords (323,033 samples, 10.44%) +traceCoords + + +anon-func-161.5 (364 samples, 0.01%) + + + +anon-func-79.3 (1,224 samples, 0.04%) + + + +anon-func-300.5 (532 samples, 0.02%) + + + +anon-func-481.5 (972 samples, 0.03%) + + + +rec (363 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-79.3 (363 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-51.11 (810 samples, 0.03%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +anon-func-435.5 (3,328 samples, 0.11%) + + + +$lambda (688 samples, 0.02%) + + + +encode (1,040 samples, 0.03%) + + + +map (288 samples, 0.01%) + + + +finderTRCoords (342 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-161.5 (602 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (272 samples, 0.01%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (352 samples, 0.01%) + + + +anon-func-161.5 (2,496 samples, 0.08%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +map (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-435.5 (31,776 samples, 1.03%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +rec (708 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +go (416 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +encode (320 samples, 0.01%) + + + +interleave (510 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyAdd (1,120 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +map (688 samples, 0.02%) + + + +rec (1,045 samples, 0.03%) + + + +anon-func-68.41 (22,848 samples, 0.74%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyGrow (450 samples, 0.01%) + + + +polyAdd (320 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (29,568 samples, 0.96%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (1,920 samples, 0.06%) + + + +interleave (1,216 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (2,754 samples, 0.09%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (608 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.04%) + + + +anon-func-51.11 (374 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +rec (1,048 samples, 0.03%) + + + +anon-func-161.5 (289 samples, 0.01%) + + + +correction (608 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polyDivMod (384 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +polySub (270 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (270 samples, 0.01%) + + + +map (1,024 samples, 0.03%) + + + +anon-func-161.5 (378 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +forIn (581 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-161.5 (266 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +polyGrow (447 samples, 0.01%) + + + +anon-func-300.5 (12,816 samples, 0.41%) + + + +correction (320 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +polyAdd (640 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +$lambda (780 samples, 0.03%) + + + +go (304 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +polyMulTerm (478 samples, 0.02%) + + + +go (320 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +encode (1,920 samples, 0.06%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (271 samples, 0.01%) + + + +rec (7,894 samples, 0.26%) + + + +go (416 samples, 0.01%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-38.11 (304 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +toListWithLength (377 samples, 0.01%) + + + +polyGrow (961 samples, 0.03%) + + + +go (576 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-54.15 (9,918 samples, 0.32%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-435.5 (8,096 samples, 0.26%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (832 samples, 0.03%) + + + +anon-func-435.5 (4,864 samples, 0.16%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +correction (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (966 samples, 0.03%) + + + +encode (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +interleave (688 samples, 0.02%) + + + +polyScale (320 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +flatten (286 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-435.5 (13,376 samples, 0.43%) + + + +rec (793 samples, 0.03%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +encode (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-435.5 (9,152 samples, 0.30%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-161.5 (544 samples, 0.02%) + + + +rec (1,314 samples, 0.04%) + + + +anon-func-435.5 (800 samples, 0.03%) + + + +encode (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-161.5 (344 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +go (624 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +finderCoords (832 samples, 0.03%) + + + +map (1,920 samples, 0.06%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyScale (352 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-453.5 (767 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-435.5 (3,200 samples, 0.10%) + + + +go (544 samples, 0.02%) + + + +anon-func-481.5 (294 samples, 0.01%) + + + +go (304 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyMulTerm (624 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +encode (2,601 samples, 0.08%) + + + +rec (1,826 samples, 0.06%) + + + +anon-func-30.36 (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-300.5 (1,920 samples, 0.06%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +anon-func-51.11 (595 samples, 0.02%) + + + +anon-func-481.5 (870 samples, 0.03%) + + + +polyZipWith (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-48.7 (652 samples, 0.02%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyPadLeft (450 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyZipWith (576 samples, 0.02%) + + + +polyMulTerm (384 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +encode (304 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +go (2,304 samples, 0.07%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-265.5 (400 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +encode (1,845 samples, 0.06%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +natXor (22,848 samples, 0.74%) + + + +anon-func-161.5 (374 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +interleave (1,920 samples, 0.06%) + + + +go (352 samples, 0.01%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +go (1,120 samples, 0.04%) + + + +go (304 samples, 0.01%) + + + +polyScale (288 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +encode (403 samples, 0.01%) + + + +anon-func-38.11 (3,580 samples, 0.12%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-481.5 (2,204 samples, 0.07%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-79.3 (2,754 samples, 0.09%) + + + +go (510 samples, 0.02%) + + + +blob_of_principal (372 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +traceCoords (378 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +polyAdd (1,376 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +encode (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +anon-func-79.3 (2,634 samples, 0.09%) + + + +map (754 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +encode (1,224 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-453.5 (1,062 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-161.5 (8,130 samples, 0.26%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-265.5 (1,105 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyZipWith (832 samples, 0.03%) + + + +anon-func-51.11 (756 samples, 0.02%) + + + +anon-func-79.3 (4,194 samples, 0.14%) + + + +encode (576 samples, 0.02%) + + + +$lambda (2,704 samples, 0.09%) + + + +anon-func-51.11 (4,194 samples, 0.14%) + + + +go (372 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (880 samples, 0.03%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +patternCoords (1,224 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-161.5 (1,040 samples, 0.03%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +polyMulTerm (1,024 samples, 0.03%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +rec (648 samples, 0.02%) + + + +anon-func-79.3 (1,216 samples, 0.04%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +polyAddTerm (1,312 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-54.15 (576 samples, 0.02%) + + + +anon-func-300.5 (271 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (1,024 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +rec (4,734 samples, 0.15%) + + + +anon-func-481.5 (396 samples, 0.01%) + + + +anon-func-79.3 (1,058 samples, 0.03%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-51.11 (676 samples, 0.02%) + + + +toListWithLength (1,105 samples, 0.04%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +patternCoords (704 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (2,624 samples, 0.08%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +encode (1,120 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-229.5 (990 samples, 0.03%) + + + +go (5,508 samples, 0.18%) + + + +map (544 samples, 0.02%) + + + +anon-func-435.5 (7,488 samples, 0.24%) + + + +anon-func-435.5 (2,240 samples, 0.07%) + + + +elemAdd (3,360 samples, 0.11%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-79.3 (1,058 samples, 0.03%) + + + +anon-func-161.5 (270 samples, 0.01%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-51.11 (480 samples, 0.02%) + + + +rec (374 samples, 0.01%) + + + +natZipWith (13,440 samples, 0.43%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-161.5 (380 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-229.5 (754 samples, 0.02%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-30.36 (363 samples, 0.01%) + + + +encode (1,024 samples, 0.03%) + + + +map (352 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +encode (322 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +polyMulTerm (270 samples, 0.01%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyAddTerm (544 samples, 0.02%) + + + +anon-func-435.5 (1,600 samples, 0.05%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-161.5 (429 samples, 0.01%) + + + +go (1,720 samples, 0.06%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +interleave (576 samples, 0.02%) + + + +polyDivMod (688 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-32.65 (832 samples, 0.03%) + + + +rec (776 samples, 0.03%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (341 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-79.3 (496 samples, 0.02%) + + + +anon-func-481.5 (1,610 samples, 0.05%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +correction (384 samples, 0.01%) + + + +anon-func-161.5 (637 samples, 0.02%) + + + +$lambda (832 samples, 0.03%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +encode (352 samples, 0.01%) + + + +interleave (624 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (13,824 samples, 0.45%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (1,058 samples, 0.03%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-494.5 (300 samples, 0.01%) + + + +natZipWith (28,896 samples, 0.93%) + + + +polyAdd (306 samples, 0.01%) + + + +rec (1,157 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-289.5 (9,309 samples, 0.30%) + + + +map (556 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +polySub (416 samples, 0.01%) + + + +anon-func-30.36 (1,920 samples, 0.06%) + + + +motoko_rts::idl::parse_fields::h16db5574f7c8c078 (729 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +map (608 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +polyMulTerm (320 samples, 0.01%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +$lambda (272 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-161.5 (340 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (272 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +anon-func-229.5 (715 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-244.5 (19,638 samples, 0.63%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polyDivMod (288 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +polyDivMod (271 samples, 0.01%) + + + +anon-func-435.5 (39,904 samples, 1.29%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +go (560 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.04%) + + + +anon-func-30.36 (688 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +natToBits (1,416 samples, 0.05%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-481.5 (292 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +polyScale (442 samples, 0.01%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +anon-func-48.7 (480 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +$lambda (320 samples, 0.01%) + + + +anon-func-246.51 (157,212 samples, 5.08%) +anon-f.. + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (896 samples, 0.03%) + + + +anon-func-48.7 (304 samples, 0.01%) + + + +anon-func-435.5 (12,064 samples, 0.39%) + + + +go (288 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (480 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +polyMulTerm (288 samples, 0.01%) + + + +rec (697 samples, 0.02%) + + + +correction (320 samples, 0.01%) + + + +anon-func-48.7 (688 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +rec (1,551 samples, 0.05%) + + + +go (465 samples, 0.02%) + + + +polyDivMod (363 samples, 0.01%) + + + +polyAdd (640 samples, 0.02%) + + + +anon-func-30.36 (326 samples, 0.01%) + + + +anon-func-435.5 (14,080 samples, 0.46%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-481.5 (3,132 samples, 0.10%) + + + +rec (1,926 samples, 0.06%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +$lambda (8,086 samples, 0.26%) + + + +polyDivMod (608 samples, 0.02%) + + + +polySub (288 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-412.5 (443 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +polyZipWith (352 samples, 0.01%) + + + +go (6,768 samples, 0.22%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-453.5 (366 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +$lambda (1,920 samples, 0.06%) + + + +encode (272 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-38.11 (1,216 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-161.5 (286 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +forIn (1,105 samples, 0.04%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +rec (1,241 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +natZipWith (5,376 samples, 0.17%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAdd (576 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-161.5 (342 samples, 0.01%) + + + +anon-func-412.5 (1,051 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAddTerm (688 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (480 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-161.5 (2,816 samples, 0.09%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-435.5 (8,704 samples, 0.28%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +$lambda (608 samples, 0.02%) + + + +rec (727 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-30.36 (2,288 samples, 0.07%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +rec (616 samples, 0.02%) + + + +anon-func-435.5 (1,600 samples, 0.05%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (338 samples, 0.01%) + + + +anon-func-38.11 (1,440 samples, 0.05%) + + + +correction (288 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +interleave (1,440 samples, 0.05%) + + + +polySub (688 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +natZipWith (14,784 samples, 0.48%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +polyScale (272 samples, 0.01%) + + + +map (27,760 samples, 0.90%) + + + +anon-func-161.5 (2,430 samples, 0.08%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +polyAdd (2,624 samples, 0.08%) + + + +rec (360 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +anon-func-435.5 (13,376 samples, 0.43%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-435.5 (1,824 samples, 0.06%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (364 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (702 samples, 0.02%) + + + +anon-func-161.5 (1,241 samples, 0.04%) + + + +$lambda (280 samples, 0.01%) + + + +anon-func-393.5 (486 samples, 0.02%) + + + +anon-func-435.5 (19,584 samples, 0.63%) + + + +anon-func-30.36 (608 samples, 0.02%) + + + +anon-func-412.5 (403 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +polyMulTerm (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (374 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +rec (481 samples, 0.02%) + + + +anon-func-51.11 (810 samples, 0.03%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +polyDivMod (304 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +go (1,120 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +go (576 samples, 0.02%) + + + +anon-func-48.7 (527 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +rec (2,052 samples, 0.07%) + + + +interleave (576 samples, 0.02%) + + + +rec (408 samples, 0.01%) + + + +polyPadLeft (961 samples, 0.03%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyZipWith (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-481.5 (540 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +rec (10,134 samples, 0.33%) + + + +polySub (608 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-435.5 (14,592 samples, 0.47%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (1,312 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +elemMul (3,872 samples, 0.13%) + + + +anon-func-481.5 (828 samples, 0.03%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (352 samples, 0.01%) + + + +encode (1,024 samples, 0.03%) + + + +interleave (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-435.5 (1,328 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-481.5 (578 samples, 0.02%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-161.5 (1,131 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-435.5 (4,608 samples, 0.15%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +anon-func-161.5 (2,821 samples, 0.09%) + + + +go (288 samples, 0.01%) + + + +anon-func-481.5 (638 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +step (370 samples, 0.01%) + + + +interleave (1,312 samples, 0.04%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-30.36 (2,601 samples, 0.08%) + + + +$lambda (1,120 samples, 0.04%) + + + +encode (544 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +correction (304 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-48.7 (280 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (2,112 samples, 0.07%) + + + +rec (2,528 samples, 0.08%) + + + +anon-func-481.5 (340 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (285 samples, 0.01%) + + + +anon-func-51.11 (1,920 samples, 0.06%) + + + +map (1,312 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (1,216 samples, 0.04%) + + + +map (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-48.7 (465 samples, 0.02%) + + + +$lambda (323,033 samples, 10.44%) +$lambda + + +interleave (416 samples, 0.01%) + + + +encode (416 samples, 0.01%) + + + +anon-func-51.11 (704 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (880 samples, 0.03%) + + + +go (544 samples, 0.02%) + + + +polyAdd (2,240 samples, 0.07%) + + + +$lambda (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +map (468 samples, 0.02%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +anon-func-393.5 (810 samples, 0.03%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (546 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-435.5 (1,280 samples, 0.04%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-412.5 (459 samples, 0.01%) + + + +polyAdd (270 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +map (468 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +polyAdd (352 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (1,152 samples, 0.04%) + + + +map (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (949 samples, 0.03%) + + + +map (576 samples, 0.02%) + + + +anon-func-481.5 (432 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-300.5 (624 samples, 0.02%) + + + +anon-func-54.15 (2,496 samples, 0.08%) + + + +toBlocks (1,408 samples, 0.05%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-481.5 (286 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +correction (320 samples, 0.01%) + + + +polyZipWith (352 samples, 0.01%) + + + +elemToBits (1,776 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (832 samples, 0.03%) + + + +correction (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-435.5 (21,760 samples, 0.70%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (289 samples, 0.01%) + + + +go (1,920 samples, 0.06%) + + + +encode (288 samples, 0.01%) + + + +polyDivMod (272 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +polySub (688 samples, 0.02%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +patternCoords (2,496 samples, 0.08%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +anon-func-38.11 (661 samples, 0.02%) + + + +anon-func-79.3 (1,152 samples, 0.04%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +anon-func-265.5 (900 samples, 0.03%) + + + +polyDivMod (416 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyAdd (1,312 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (468 samples, 0.02%) + + + +polyDivMod (320 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +$lambda (1,408 samples, 0.05%) + + + +polyZipWith (961 samples, 0.03%) + + + +polyAdd (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-79.3 (1,520 samples, 0.05%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAddTerm (544 samples, 0.02%) + + + +encode (320 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (688 samples, 0.02%) + + + +rec (488 samples, 0.02%) + + + +anon-func-481.5 (266 samples, 0.01%) + + + +rec (4,392 samples, 0.14%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +natFromBytes (22,848 samples, 0.74%) + + + +polyZipWith (704 samples, 0.02%) + + + +rec (1,368 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-300.5 (352 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +anon-func-435.5 (12,320 samples, 0.40%) + + + +anon-func-30.36 (352 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +interleave (1,440 samples, 0.05%) + + + +anon-func-161.5 (1,786 samples, 0.06%) + + + +encode (608 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +finderTRCoords (832 samples, 0.03%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-30.36 (1,440 samples, 0.05%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +generate (4,194 samples, 0.14%) + + + +map (1,216 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (9,728 samples, 0.31%) + + + +natZipWith (22,848 samples, 0.74%) + + + +anon-func-30.36 (6,768 samples, 0.22%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +$lambda (754 samples, 0.02%) + + + +correction (416 samples, 0.01%) + + + +anon-func-481.5 (2,436 samples, 0.08%) + + + +encode (352 samples, 0.01%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +polyZipWith (608 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +map (1,664 samples, 0.05%) + + + +polySub (608 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyDivMod (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +polyZipWith (352 samples, 0.01%) + + + +anon-func-300.5 (270 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (342 samples, 0.01%) + + + +range (1,368 samples, 0.04%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +anon-func-481.5 (900 samples, 0.03%) + + + +polyDivMod (352 samples, 0.01%) + + + +polyScale (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-435.5 (4,096 samples, 0.13%) + + + +go (576 samples, 0.02%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-32.65 (756 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +flatten (286 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-435.5 (5,632 samples, 0.18%) + + + +encode (576 samples, 0.02%) + + + +map (1,312 samples, 0.04%) + + + +anon-func-435.5 (29,184 samples, 0.94%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyAdd (352 samples, 0.01%) + + + +interleave (272 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +correction (544 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +encode (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-54.15 (756 samples, 0.02%) + + + +polySub (1,920 samples, 0.06%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-435.5 (3,840 samples, 0.12%) + + + +anon-func-30.36 (304 samples, 0.01%) + + + +rec (805 samples, 0.03%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polySub (304 samples, 0.01%) + + + +anon-func-435.5 (14,592 samples, 0.47%) + + + +polyDivMod (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +correction (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +interleave (1,216 samples, 0.04%) + + + +rec (1,615 samples, 0.05%) + + + +map (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +interleave (280 samples, 0.01%) + + + +interleave (5,696 samples, 0.18%) + + + +$lambda (304 samples, 0.01%) + + + +anon-func-161.5 (326 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +interleave (1,120 samples, 0.04%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +polyZipWith (576 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +rec (1,040 samples, 0.03%) + + + +anon-func-79.3 (1,764 samples, 0.06%) + + + +rec (936 samples, 0.03%) + + + +polyAddTerm (544 samples, 0.02%) + + + +interleave (624 samples, 0.02%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-435.5 (11,968 samples, 0.39%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +$lambda (289 samples, 0.01%) + + + +encode (480 samples, 0.02%) + + + +correction (517 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-51.11 (3,744 samples, 0.12%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-161.5 (268 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyScale (341 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-481.5 (338 samples, 0.01%) + + + +anon-func-453.5 (2,065 samples, 0.07%) + + + +correction (288 samples, 0.01%) + + + +anon-func-481.5 (374 samples, 0.01%) + + + +go (270 samples, 0.01%) + + + +anon-func-30.36 (2,754 samples, 0.09%) + + + +interleave (416 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +interleave (1,942 samples, 0.06%) + + + +elemFromBits (336 samples, 0.01%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (35,840 samples, 1.16%) + + + +polyZipWith (1,216 samples, 0.04%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-48.7 (1,312 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-300.5 (272 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +anon-func-48.7 (704 samples, 0.02%) + + + +anon-func-48.7 (352 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +anon-func-300.5 (12,768 samples, 0.41%) + + + +anon-func-435.5 (11,424 samples, 0.37%) + + + +polyAdd (832 samples, 0.03%) + + + +anon-func-30.36 (1,024 samples, 0.03%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +anon-func-435.5 (16,320 samples, 0.53%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +go (341 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyAdd (320 samples, 0.01%) + + + +interleave (6,392 samples, 0.21%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +interleave (576 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +encode (285 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-161.5 (3,096 samples, 0.10%) + + + +polyGrow (270 samples, 0.01%) + + + +anon-func-161.5 (1,512 samples, 0.05%) + + + +$lambda (576 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-229.5 (2,413 samples, 0.08%) + + + +polyDivMod (320 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +go (304 samples, 0.01%) + + + +anon-func-481.5 (390 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +encode (384 samples, 0.01%) + + + +map (304 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +polyAdd (416 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-48.7 (608 samples, 0.02%) + + + +polyAddTerm (272 samples, 0.01%) + + + +anon-func-435.5 (5,760 samples, 0.19%) + + + +anon-func-79.3 (1,326 samples, 0.04%) + + + +polyDivMod (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyZipWith (288 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +anon-func-38.11 (1,312 samples, 0.04%) + + + +$lambda (270 samples, 0.01%) + + + +encode (704 samples, 0.02%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polyZipWith (591 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +$lambda (416 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +interleave (1,920 samples, 0.06%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +encode (320 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-435.5 (3,072 samples, 0.10%) + + + +anon-func-300.5 (2,448 samples, 0.08%) + + + +anon-func-48.7 (270 samples, 0.01%) + + + +encode (8,780 samples, 0.28%) + + + +map (272 samples, 0.01%) + + + +anon-func-435.5 (2,816 samples, 0.09%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +generate (3,456 samples, 0.11%) + + + +polySub (576 samples, 0.02%) + + + +polySub (272 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +rec (715 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-387.7 (273 samples, 0.01%) + + + +anon-func-435.5 (1,536 samples, 0.05%) + + + +rec (630 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (544 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (285 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (288 samples, 0.01%) + + + +go (288 samples, 0.01%) + + + +anon-func-38.11 (688 samples, 0.02%) + + + +polyAddTerm (352 samples, 0.01%) + + + +interleave (480 samples, 0.02%) + + + +encode (1,312 samples, 0.04%) + + + +polyAdd (1,152 samples, 0.04%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +polyZipWith (320 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +rec (1,295 samples, 0.04%) + + + +encode (352 samples, 0.01%) + + + +anon-func-30.36 (272 samples, 0.01%) + + + +anon-func-300.5 (37,452 samples, 1.21%) + + + +map (352 samples, 0.01%) + + + +polyDivMod (576 samples, 0.02%) + + + +$lambda (544 samples, 0.02%) + + + +anon-func-300.5 (1,216 samples, 0.04%) + + + +$lambda (1,312 samples, 0.04%) + + + +anon-func-481.5 (561 samples, 0.02%) + + + +anon-func-161.5 (675 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (272 samples, 0.01%) + + + +interleave (320 samples, 0.01%) + + + +natXor (7,392 samples, 0.24%) + + + +go (544 samples, 0.02%) + + + +map (272 samples, 0.01%) + + + +anon-func-79.3 (688 samples, 0.02%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +interleave (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +polySub (416 samples, 0.01%) + + + +go (688 samples, 0.02%) + + + +polyZipWith (2,624 samples, 0.08%) + + + +anon-func-435.5 (1,632 samples, 0.05%) + + + +encode (576 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +interleave (576 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +correction (1,312 samples, 0.04%) + + + +correction (12,816 samples, 0.41%) + + + +correction (608 samples, 0.02%) + + + +map (400 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-38.11 (288 samples, 0.01%) + + + +anon-func-481.5 (1,598 samples, 0.05%) + + + +$lambda (544 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.04%) + + + +polyDivMod (2,754 samples, 0.09%) + + + +map (544 samples, 0.02%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +map (1,216 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-435.5 (2,304 samples, 0.07%) + + + +anon-func-51.11 (608 samples, 0.02%) + + + +anon-func-51.11 (352 samples, 0.01%) + + + +map (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +polyAdd (512 samples, 0.02%) + + + +anon-func-32.65 (288 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +elemAdd (22,848 samples, 0.74%) + + + +polyAddTerm (1,920 samples, 0.06%) + + + +map (576 samples, 0.02%) + + + +go (1,120 samples, 0.04%) + + + +polyAddTerm (416 samples, 0.01%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.04%) + + + +anon-func-161.5 (1,014 samples, 0.03%) + + + +interleave (527 samples, 0.02%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (3,382 samples, 0.11%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +interleave (416 samples, 0.01%) + + + +$lambda (352 samples, 0.01%) + + + +interleave (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +interleave (317 samples, 0.01%) + + + +anon-func-79.3 (2,644 samples, 0.09%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +toList (319 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +B_add (116,433 samples, 3.76%) +B_add + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyDivMod (576 samples, 0.02%) + + + +anon-func-435.5 (2,496 samples, 0.08%) + + + +go (288 samples, 0.01%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-30.36 (416 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-161.5 (704 samples, 0.02%) + + + +interleave (352 samples, 0.01%) + + + +go (416 samples, 0.01%) + + + +polyZipWith (832 samples, 0.03%) + + + +go (352 samples, 0.01%) + + + +anon-func-265.5 (630 samples, 0.02%) + + + +anon-func-481.5 (418 samples, 0.01%) + + + +anon-func-481.5 (270 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +polyZipWith (416 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (2,304 samples, 0.07%) + + + +anon-func-300.5 (688 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-61.36 (1,408 samples, 0.05%) + + + +encode (288 samples, 0.01%) + + + +generate (3,456 samples, 0.11%) + + + +polyAddTerm (544 samples, 0.02%) + + + +$lambda (403 samples, 0.01%) + + + +anon-func-51.11 (1,845 samples, 0.06%) + + + +polyAdd (416 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +anon-func-481.5 (442 samples, 0.01%) + + + +anon-func-48.7 (546 samples, 0.02%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +polySub (1,120 samples, 0.04%) + + + +rec (1,746 samples, 0.06%) + + + +polyAddTerm (272 samples, 0.01%) + + + +encode (3,744 samples, 0.12%) + + + +anon-func-51.11 (1,312 samples, 0.04%) + + + +anon-func-51.11 (688 samples, 0.02%) + + + +polyScale (544 samples, 0.02%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +encode (288 samples, 0.01%) + + + +anon-func-246.51 (113,545 samples, 3.67%) +anon.. + + +anon-func-79.3 (374 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyZipWith (1,088 samples, 0.04%) + + + +anon-func-265.5 (715 samples, 0.02%) + + + +polyAddTerm (688 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +go (544 samples, 0.02%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-79.3 (360 samples, 0.01%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (304 samples, 0.01%) + + + +$lambda (544 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-300.5 (1,312 samples, 0.04%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +traceCoords (546 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +$lambda (576 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +anon-func-161.5 (715 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +polyZipWith (1,376 samples, 0.04%) + + + +polyMulTerm (352 samples, 0.01%) + + + +polySub (1,120 samples, 0.04%) + + + +polyZipWith (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +correction (688 samples, 0.02%) + + + +map (384 samples, 0.01%) + + + +anon-func-481.5 (400 samples, 0.01%) + + + +polyDivMod (1,920 samples, 0.06%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-38.11 (3,382 samples, 0.11%) + + + +polyAdd (2,624 samples, 0.08%) + + + +anon-func-79.3 (1,136 samples, 0.04%) + + + +finderBLCoords (1,764 samples, 0.06%) + + + +anon-func-51.11 (12,816 samples, 0.41%) + + + +encode (576 samples, 0.02%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +go (544 samples, 0.02%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +anon-func-48.7 (624 samples, 0.02%) + + + +polyAddTerm (288 samples, 0.01%) + + + +anon-func-38.11 (1,120 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +map (416 samples, 0.01%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +correction (624 samples, 0.02%) + + + +interleave (608 samples, 0.02%) + + + +toBlocks (288 samples, 0.01%) + + + +leb128_decode (2,842 samples, 0.09%) + + + +polyZipWith (608 samples, 0.02%) + + + +anon-func-51.11 (546 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +polyAddTerm (271 samples, 0.01%) + + + +anon-func-393.5 (595 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-435.5 (704 samples, 0.02%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +anon-func-161.5 (6,792 samples, 0.22%) + + + +polyAddTerm (576 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (272 samples, 0.01%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (416 samples, 0.01%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +encode (688 samples, 0.02%) + + + +correction (1,312 samples, 0.04%) + + + +go (480 samples, 0.02%) + + + +anon-func-32.65 (8,130 samples, 0.26%) + + + +anon-func-161.5 (306 samples, 0.01%) + + + +encode (1,040 samples, 0.03%) + + + +anon-func-79.3 (280 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +anon-func-161.5 (1,190 samples, 0.04%) + + + +anon-func-435.5 (384 samples, 0.01%) + + + +interleave (304 samples, 0.01%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +encode (270 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyMulTerm (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-481.5 (322 samples, 0.01%) + + + +polyGrow (299 samples, 0.01%) + + + +polyAdd (688 samples, 0.02%) + + + +correction (352 samples, 0.01%) + + + +anon-func-161.5 (864 samples, 0.03%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyAddTerm (288 samples, 0.01%) + + + +polyDivMod (544 samples, 0.02%) + + + +go (576 samples, 0.02%) + + + +anon-func-79.3 (304 samples, 0.01%) + + + +anon-func-300.5 (304 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-481.5 (522 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-435.5 (15,232 samples, 0.49%) + + + +polyDivMod (576 samples, 0.02%) + + + +polySub (1,216 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +go (608 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polySub (352 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (352 samples, 0.01%) + + + +rec (1,053 samples, 0.03%) + + + +anon-func-38.11 (272 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +interleave (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-435.5 (5,120 samples, 0.17%) + + + +map (279 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +$lambda (288 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +polyAdd (576 samples, 0.02%) + + + +polyDivMod (1,312 samples, 0.04%) + + + +correction (320 samples, 0.01%) + + + +anon-func-435.5 (5,824 samples, 0.19%) + + + +polySub (352 samples, 0.01%) + + + +interleave (361 samples, 0.01%) + + + +map (320 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +map (352 samples, 0.01%) + + + +rec (632 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +polyZipWith (2,240 samples, 0.07%) + + + +go (576 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +elemToBits (1,387 samples, 0.04%) + + + +natFromBytes (12,096 samples, 0.39%) + + + +map (416 samples, 0.01%) + + + +anon-func-48.7 (288 samples, 0.01%) + + + +polyPadRight (429 samples, 0.01%) + + + +encode (1,920 samples, 0.06%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-79.3 (1,312 samples, 0.04%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +correction (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +polyPadRight (306 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +$lambda (544 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +correction (352 samples, 0.01%) + + + +go (576 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (323 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-300.5 (462 samples, 0.01%) + + + +polyAdd (704 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polyZipWith (357 samples, 0.01%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +encode (544 samples, 0.02%) + + + +encode (1,216 samples, 0.04%) + + + +anon-func-51.11 (1,216 samples, 0.04%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyMulTerm (322 samples, 0.01%) + + + +polyPadRight (306 samples, 0.01%) + + + +map (272 samples, 0.01%) + + + +go (352 samples, 0.01%) + + + +polyZipWith (512 samples, 0.02%) + + + +patternCoords (3,456 samples, 0.11%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (855 samples, 0.03%) + + + +anon-func-51.11 (304 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-79.3 (320 samples, 0.01%) + + + +polyAddTerm (352 samples, 0.01%) + + + +correction (1,920 samples, 0.06%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polySub (544 samples, 0.02%) + + + +go (608 samples, 0.02%) + + + +rec (494 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +$lambda (272 samples, 0.01%) + + + +anon-func-393.5 (649 samples, 0.02%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-300.5 (288 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +anon-func-38.11 (384 samples, 0.01%) + + + +anon-func-300.5 (608 samples, 0.02%) + + + +encode (280 samples, 0.01%) + + + +interleave (352 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-435.5 (4,896 samples, 0.16%) + + + +interleave (576 samples, 0.02%) + + + +encode (304 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (546 samples, 0.02%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +polyPadRight (429 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-79.3 (384 samples, 0.01%) + + + +$lambda (288 samples, 0.01%) + + + +anon-func-79.3 (270 samples, 0.01%) + + + +polyAddTerm (608 samples, 0.02%) + + + +toTarget (280 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +go (352 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +rec (1,448 samples, 0.05%) + + + +polyAddTerm (1,120 samples, 0.04%) + + + +polySub (352 samples, 0.01%) + + + +anon-func-161.5 (539 samples, 0.02%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +go (416 samples, 0.01%) + + + +encode (1,312 samples, 0.04%) + + + +encode (1,920 samples, 0.06%) + + + +polyAdd (544 samples, 0.02%) + + + +$lambda (416 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.04%) + + + +encode (576 samples, 0.02%) + + + +anon-func-38.11 (544 samples, 0.02%) + + + +polyAdd (704 samples, 0.02%) + + + +polyDivMod (352 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-38.11 (352 samples, 0.01%) + + + +polyZipWith (640 samples, 0.02%) + + + +anon-func-30.36 (1,120 samples, 0.04%) + + + +interleave (288 samples, 0.01%) + + + +anon-func-30.36 (1,312 samples, 0.04%) + + + +anon-func-51.11 (3,008 samples, 0.10%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +go (480 samples, 0.02%) + + + +anon-func-38.11 (326 samples, 0.01%) + + + +$lambda (416 samples, 0.01%) + + + +encode (576 samples, 0.02%) + + + +anon-func-435.5 (7,680 samples, 0.25%) + + + +polyZipWith (576 samples, 0.02%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +correction (544 samples, 0.02%) + + + +map (288 samples, 0.01%) + + + +polyAdd (416 samples, 0.01%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-300.5 (1,440 samples, 0.05%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polySub (544 samples, 0.02%) + + + +anon-func-51.11 (320 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-481.5 (284 samples, 0.01%) + + + +anon-func-51.11 (137,574 samples, 4.45%) +anon-.. + + +anon-func-30.36 (320 samples, 0.01%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +polySub (576 samples, 0.02%) + + + +anon-func-435.5 (22,400 samples, 0.72%) + + + +polyAdd (8,704 samples, 0.28%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + +anon-func-435.5 (3,872 samples, 0.13%) + + + +interleave (352 samples, 0.01%) + + + +correction (272 samples, 0.01%) + + + +polySub (288 samples, 0.01%) + + + +anon-func-161.5 (640 samples, 0.02%) + + + +anon-func-435.5 (10,560 samples, 0.34%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +map (608 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +anon-func-79.3 (272 samples, 0.01%) + + + +correction (288 samples, 0.01%) + + + +map (1,312 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +go (272 samples, 0.01%) + + + +anon-func-48.7 (320 samples, 0.01%) + + + +$lambda (1,216 samples, 0.04%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-48.7 (1,120 samples, 0.04%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +rec (1,122 samples, 0.04%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +anon-func-51.11 (416 samples, 0.01%) + + + +map (576 samples, 0.02%) + + + +anon-func-79.3 (756 samples, 0.02%) + + + +polyDivMod (416 samples, 0.01%) + + + +go (320 samples, 0.01%) + + + +$lambda (576 samples, 0.02%) + + + +anon-func-435.5 (448 samples, 0.01%) + + + +anon-func-30.36 (288 samples, 0.01%) + + + +anon-func-300.5 (1,120 samples, 0.04%) + + + +polyAdd (608 samples, 0.02%) + + + +anon-func-38.11 (1,024 samples, 0.03%) + + + +anon-func-435.5 (1,872 samples, 0.06%) + + + +polyPadRight (306 samples, 0.01%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (288 samples, 0.01%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +rec (1,287 samples, 0.04%) + + + +map (288 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +anon-func-48.7 (416 samples, 0.01%) + + + +anon-func-51.11 (288 samples, 0.01%) + + + +anon-func-79.3 (1,920 samples, 0.06%) + + + +anon-func-453.5 (670 samples, 0.02%) + + + +anon-func-435.5 (768 samples, 0.02%) + + + +anon-func-435.5 (10,368 samples, 0.34%) + + + +anon-func-54.15 (2,226 samples, 0.07%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +natFromBits (266 samples, 0.01%) + + + +anon-func-435.5 (8,320 samples, 0.27%) + + + +polyZipWith (1,152 samples, 0.04%) + + + +encode (1,312 samples, 0.04%) + + + +anon-func-435.5 (1,088 samples, 0.04%) + + + +encode (1,216 samples, 0.04%) + + + +encode (272 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +go (288 samples, 0.01%) + + + +interleave (544 samples, 0.02%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +go (1,216 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +rec (7,470 samples, 0.24%) + + + +map (8,780 samples, 0.28%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +polyDivMod (608 samples, 0.02%) + + + +anon-func-79.3 (2,250 samples, 0.07%) + + + +anon-func-38.11 (608 samples, 0.02%) + + + +anon-func-30.36 (320 samples, 0.01%) + + + +anon-func-30.36 (576 samples, 0.02%) + + + +map (544 samples, 0.02%) + + + +polySub (352 samples, 0.01%) + + + +polyScale (272 samples, 0.01%) + + + +anon-func-435.5 (14,144 samples, 0.46%) + + + +anon-func-79.3 (352 samples, 0.01%) + + + +anon-func-48.7 (272 samples, 0.01%) + + + +anon-func-51.11 (272 samples, 0.01%) + + + +all (3,092,730 samples, 100%) + + + +polyDivMod (544 samples, 0.02%) + + + +anon-func-38.11 (320 samples, 0.01%) + + + +anon-func-435.5 (6,240 samples, 0.20%) + + + +go (1,216 samples, 0.04%) + + + +rec (323 samples, 0.01%) + + + +correction (1,120 samples, 0.04%) + + + +anon-func-435.5 (26,880 samples, 0.87%) + + + +$lambda (416 samples, 0.01%) + + + +anon-func-30.36 (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +$lambda (352 samples, 0.01%) + + + +pathCoords (756 samples, 0.02%) + + + +encode (416 samples, 0.01%) + + + +anon-func-48.7 (544 samples, 0.02%) + + + +anon-func-435.5 (1,216 samples, 0.04%) + + + +$lambda (442 samples, 0.01%) + + + +go (544 samples, 0.02%) + + + +anon-func-48.7 (1,216 samples, 0.04%) + + + +anon-func-481.5 (754 samples, 0.02%) + + + +polyAdd (1,088 samples, 0.04%) + + + +anon-func-38.11 (576 samples, 0.02%) + + + +go (338 samples, 0.01%) + + + +polyZipWith (544 samples, 0.02%) + + + +polyZipWith (3,840 samples, 0.12%) + + + +anon-func-481.5 (420 samples, 0.01%) + + + +anon-func-481.5 (650 samples, 0.02%) + + + +anon-func-38.11 (480 samples, 0.02%) + + + +map (1,120 samples, 0.04%) + + + +anon-func-481.5 (663 samples, 0.02%) + + + +anon-func-300.5 (544 samples, 0.02%) + + + +pathCoords (378 samples, 0.01%) + + + +polyLeadCoeff (770 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (20,267 samples, 0.66%) + + + +anon-func-38.11 (416 samples, 0.01%) + + + +$lambda (1,120 samples, 0.04%) + + + +anon-func-51.11 (1,120 samples, 0.04%) + + + +interleave (544 samples, 0.02%) + + + +map (576 samples, 0.02%) + + + +correction (576 samples, 0.02%) + + + +anon-func-48.7 (576 samples, 0.02%) + + + +anon-func-300.5 (320 samples, 0.01%) + + + +anon-func-51.11 (576 samples, 0.02%) + + + +anon-func-51.11 (384 samples, 0.01%) + + + +anon-func-79.3 (465 samples, 0.02%) + + + +$lambda (272 samples, 0.01%) + + + +polyMulTerm (272 samples, 0.01%) + + + +anon-func-51.11 (544 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +interleave (288 samples, 0.01%) + + + +polySub (304 samples, 0.01%) + + + +encode (544 samples, 0.02%) + + + +anon-func-161.5 (516 samples, 0.02%) + + + +polyDivMod (544 samples, 0.02%) + + + +polyDivMod (288 samples, 0.01%) + + + +anon-func-300.5 (416 samples, 0.01%) + + + +anon-func-79.3 (1,120 samples, 0.04%) + + + +anon-func-300.5 (446 samples, 0.01%) + + + +anon-func-38.11 (306 samples, 0.01%) + + + +anon-func-300.5 (576 samples, 0.02%) + + + +anon-func-435.5 (912 samples, 0.03%) + + + +anon-func-79.3 (544 samples, 0.02%) + + + +map (688 samples, 0.02%) + + + +go (1,920 samples, 0.06%) + + + +anon-func-300.5 (470 samples, 0.02%) + + + +encode (576 samples, 0.02%) + + + +anon-func-79.3 (608 samples, 0.02%) + + + +anon-func-79.3 (576 samples, 0.02%) + + + +anon-func-481.5 (684 samples, 0.02%) + + + + diff --git a/flamegraphs/qr.svg b/flamegraphs/qr.svg new file mode 100644 index 00000000000..5848ddb56d4 --- /dev/null +++ b/flamegraphs/qr.svg @@ -0,0 +1,16469 @@ + + + + + + + + + + + + + + +qr.mo + +Reset Zoom +Search + + + +rec (2,092 samples, 0.07%) + + + +correction (1,761,887 samples, 56.97%) +correction + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (312 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,664 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-161.5 (8,621 samples, 0.28%) + + + +to_2_tuple (264 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +@deserialize_go<v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)> (979 samples, 0.03%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-161.5 (1,042 samples, 0.03%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +opt_project (576 samples, 0.02%) + + + +rec (2,254 samples, 0.07%) + + + +anon-func-265.5 (279 samples, 0.01%) + + + +anon-func-133.5 (4,310 samples, 0.14%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (325 samples, 0.01%) + + + +rec (2,246 samples, 0.07%) + + + +rec (682 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (1,198 samples, 0.04%) + + + +rec (6,940 samples, 0.22%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemMul (7,776 samples, 0.25%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (576 samples, 0.02%) + + + +rec (12,781 samples, 0.41%) + + + +rec (1,123 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-300.5 (939 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +rec (7,171 samples, 0.23%) + + + +rec (1,362 samples, 0.04%) + + + +to_2_tuple (3,264 samples, 0.11%) + + + +to_2_tuple (360 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +next (332 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (414 samples, 0.01%) + + + +anon-func-265.5 (10,289 samples, 0.33%) + + + +rec (1,808 samples, 0.06%) + + + +rec (5,356 samples, 0.17%) + + + +rec (2,852 samples, 0.09%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +scale (777 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-73.5 (31,288 samples, 1.01%) + + + +rec (18,620 samples, 0.60%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-246.51 (23,922 samples, 0.77%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (1,824 samples, 0.06%) + + + +rec (9,514 samples, 0.31%) + + + +obj_idx<0> (340 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +rec (12,286 samples, 0.40%) + + + +B_div (864 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,297 samples, 0.04%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (634 samples, 0.02%) + + + +anon-func-300.5 (1,165 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +rec (3,637 samples, 0.12%) + + + +opt_project (288 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-133.5 (842 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (9,316 samples, 0.30%) + + + +B_rem (275 samples, 0.01%) + + + +anon-func-161.5 (42,723 samples, 1.38%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +alloc_size<4>_tag<5> (2,496 samples, 0.08%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +natToBytes (5,280 samples, 0.17%) + + + +finderBLCoords (13,282 samples, 0.43%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (7,039 samples, 0.23%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +rec (21,536 samples, 0.70%) + + + +rec (17,075 samples, 0.55%) + + + +anon-func-453.5 (663 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +opt_project (576 samples, 0.02%) + + + +rec (3,202 samples, 0.10%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +rec (1,354 samples, 0.04%) + + + +anon-func-435.5 (324,960 samples, 10.51%) +anon-func-435.5 + + +natFromBits (1,086 samples, 0.04%) + + + +alog (1,136 samples, 0.04%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (346 samples, 0.01%) + + + +rec (1,641 samples, 0.05%) + + + +can_tag_i64 (576 samples, 0.02%) + + + +rec (6,643 samples, 0.21%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_add (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (2,708 samples, 0.09%) + + + +render (4,382 samples, 0.14%) + + + +revAppend (13,408 samples, 0.43%) + + + +opt_inject (288 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,306 samples, 0.04%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +opt_project (306 samples, 0.01%) + + + +Array_tabulate (1,574 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (624 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-453.5 (1,850 samples, 0.06%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +B_add (800 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +rec (5,752 samples, 0.19%) + + + +next (1,324 samples, 0.04%) + + + +B_mul (432 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (3,178 samples, 0.10%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (9,712 samples, 0.31%) + + + +polyTrim (24,216 samples, 0.78%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +B_sub (1,024 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-453.5 (663 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-161.5 (39,478 samples, 1.28%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (2,704 samples, 0.09%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +anon-func-481.5 (17,411 samples, 0.56%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +to_2_tuple (288 samples, 0.01%) + + + +anon-func-435.5 (216,928 samples, 7.01%) +anon-func.. + + +rec (1,840 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +rec (428 samples, 0.01%) + + + +anon-func-481.5 (30,826 samples, 1.00%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (3,296 samples, 0.11%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +elemNew (583 samples, 0.02%) + + + +to_2_tuple (288 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemMul (7,776 samples, 0.25%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (16,798 samples, 0.54%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (270 samples, 0.01%) + + + +rec (653 samples, 0.02%) + + + +rec (840 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +to_2_tuple (384 samples, 0.01%) + + + +polyScale (130,752 samples, 4.23%) +polyS.. + + +opt_inject (1,440 samples, 0.05%) + + + +elemToBits (1,968 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rowwise (802,786 samples, 25.96%) +rowwise + + +rec (828 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +opt_inject (756 samples, 0.02%) + + + +rec (3,277 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-265.5 (7,559 samples, 0.24%) + + + +rec (13,771 samples, 0.45%) + + + +rec (2,149 samples, 0.07%) + + + +anon-func-265.5 (3,009 samples, 0.10%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +range (693 samples, 0.02%) + + + +range (693 samples, 0.02%) + + + +rec (1,123 samples, 0.04%) + + + +rec (1,990 samples, 0.06%) + + + +to_2_tuple (830 samples, 0.03%) + + + +rec (14,500 samples, 0.47%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,840 samples, 0.06%) + + + +rec (1,123 samples, 0.04%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_add (9,400 samples, 0.30%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (737 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-161.5 (6,546 samples, 0.21%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-161.5 (2,877 samples, 0.09%) + + + +rec (1,314 samples, 0.04%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_add (525 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-481.5 (11,648 samples, 0.38%) + + + +anon-func-161.5 (7,650 samples, 0.25%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +anon-func-453.5 (3,684 samples, 0.12%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +timingCoords (3,588 samples, 0.12%) + + + +opt_inject (4,194 samples, 0.14%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +B_sub (1,024 samples, 0.03%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (844 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (4,861 samples, 0.16%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +natToBits (1,118 samples, 0.04%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +alog (1,136 samples, 0.04%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_mul (432 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (1,904 samples, 0.06%) + + + +to_2_tuple (624 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +rec (1,354 samples, 0.04%) + + + +rec (892 samples, 0.03%) + + + +elemFromBits (1,055 samples, 0.03%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_inject (2,304 samples, 0.07%) + + + +anon-func-435.5 (270,944 samples, 8.76%) +anon-func-43.. + + +natFromBytes (4,912 samples, 0.16%) + + + +errorPoly (3,964 samples, 0.13%) + + + +rec (3,202 samples, 0.10%) + + + +rec (2,488 samples, 0.08%) + + + +anon-func-161.5 (562 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (264 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +elemFromBits (1,535 samples, 0.05%) + + + +anon-func-161.5 (2,418 samples, 0.08%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (9,231 samples, 0.30%) + + + +anon-func-300.5 (1,395 samples, 0.05%) + + + +rec (1,354 samples, 0.04%) + + + +anon-func-161.5 (72,720 samples, 2.35%) +a.. + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,354 samples, 0.04%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_gt (320 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-161.5 (25,893 samples, 0.84%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (531 samples, 0.02%) + + + +anon-func-161.5 (129,552 samples, 4.19%) +anon.. + + +anon-func-44.5 (736 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (4,306 samples, 0.14%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-300.5 (287 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +polyZipWith (530,032 samples, 17.14%) +polyZipWith + + +rec (4,795 samples, 0.16%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (1,601 samples, 0.05%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (8,819 samples, 0.29%) + + + +B_eq (320 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (312 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +B_add (300 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (661 samples, 0.02%) + + + +rec (3,376 samples, 0.11%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +rec (901 samples, 0.03%) + + + +polyLen (32,024 samples, 1.04%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +B_mul (432 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (270 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (6,445 samples, 0.21%) + + + +anon-func-435.5 (189,920 samples, 6.14%) +anon-fun.. + + +natFromBytes (4,912 samples, 0.16%) + + + +B_add (400 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +rec (1,040 samples, 0.03%) + + + +rec (653 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-481.5 (11,746 samples, 0.38%) + + + +B_add (800 samples, 0.03%) + + + +rec (1,298 samples, 0.04%) + + + +rec (13,474 samples, 0.44%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (828 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +rec (840 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_inject (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-300.5 (994 samples, 0.03%) + + + +B_add (375 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (1,792 samples, 0.06%) + + + +anon-func-481.5 (5,861 samples, 0.19%) + + + +rec (13,573 samples, 0.44%) + + + +opt_inject (288 samples, 0.01%) + + + +B_sub (320 samples, 0.01%) + + + +B_eq (760 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (1,354 samples, 0.04%) + + + +rec (1,149 samples, 0.04%) + + + +rec (661 samples, 0.02%) + + + +anon-func-300.5 (3,500 samples, 0.11%) + + + +rec (1,040 samples, 0.03%) + + + +to_2_tuple (312 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (802 samples, 0.03%) + + + +rec (265 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (12,583 samples, 0.41%) + + + +anon-func-300.5 (814 samples, 0.03%) + + + +rec (634 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_project (576 samples, 0.02%) + + + +map (1,916,671 samples, 61.97%) +map + + +opt_project (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (1,693 samples, 0.05%) + + + +rec (5,059 samples, 0.16%) + + + +anon-func-300.5 (939 samples, 0.03%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (7,336 samples, 0.24%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +traceCoords (837,039 samples, 27.06%) +traceCoords + + +parse (2,532 samples, 0.08%) + + + +rec (1,458 samples, 0.05%) + + + +natXor (20,240 samples, 0.65%) + + + +opt_project (2,250 samples, 0.07%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +opt_project (288 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +rec (3,296 samples, 0.11%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-412.5 (14,152 samples, 0.46%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +alog (1,136 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (307 samples, 0.01%) + + + +elemMul (7,776 samples, 0.25%) + + + +rec (1,601 samples, 0.05%) + + + +alloc_size<4>_tag<5> (1,040 samples, 0.03%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +leb128_decode (1,518 samples, 0.05%) + + + +anon-func-300.5 (497 samples, 0.02%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +anon-func-453.5 (3,660 samples, 0.12%) + + + +B_rem (400 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +opt_inject (576 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +rec (2,852 samples, 0.09%) + + + +anon-func-44.5 (276 samples, 0.01%) + + + +padLeftTo (771 samples, 0.02%) + + + +rec (1,808 samples, 0.06%) + + + +rec (422 samples, 0.01%) + + + +B_add (3,125 samples, 0.10%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (634 samples, 0.02%) + + + +elemFromBits (1,535 samples, 0.05%) + + + +foldr (433 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-229.5 (1,721 samples, 0.06%) + + + +B_div (864 samples, 0.03%) + + + +rec (23,850 samples, 0.77%) + + + +parse_idl_header (4,251 samples, 0.14%) + + + +rec (2,708 samples, 0.09%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,099 samples, 0.04%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-453.5 (3,716 samples, 0.12%) + + + +opt_project (270 samples, 0.01%) + + + +alog (1,136 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +opt_project (288 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_project (306 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-300.5 (939 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +scale (1,110 samples, 0.04%) + + + +anon-func-481.5 (2,011 samples, 0.07%) + + + +B_add (800 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +Array.idx (384 samples, 0.01%) + + + +anon-func-435.5 (568,094 samples, 18.37%) +anon-func-435.5 + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-481.5 (21,253 samples, 0.69%) + + + +anon-func-453.5 (1,842 samples, 0.06%) + + + +rec (645 samples, 0.02%) + + + +obj_idx<0> (374 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,840 samples, 0.06%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (653 samples, 0.02%) + + + +toList (3,397 samples, 0.11%) + + + +to_2_tuple (1,008 samples, 0.03%) + + + +rec (7,633 samples, 0.25%) + + + +rec (1,816 samples, 0.06%) + + + +rec (737 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-481.5 (5,861 samples, 0.19%) + + + +anon-func-161.5 (1,730 samples, 0.06%) + + + +B_rem (800 samples, 0.03%) + + + +B_gt (320 samples, 0.01%) + + + +rec (5,257 samples, 0.17%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (336 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-435.5 (27,872 samples, 0.90%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (1,920 samples, 0.06%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-300.5 (398 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,776 samples, 0.06%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (4,992 samples, 0.16%) + + + +rec (892 samples, 0.03%) + + + +alloc_size<4>_tag<5> (3,029 samples, 0.10%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (398 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +opt_project (6,768 samples, 0.22%) + + + +anon-func-435.5 (649,180 samples, 20.99%) +anon-func-435.5 + + +B_add (800 samples, 0.03%) + + + +rec (1,306 samples, 0.04%) + + + +opt_inject (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (19,666 samples, 0.64%) + + + +B_add (400 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_project (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (2,782 samples, 0.09%) + + + +rec (1,458 samples, 0.05%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (13,672 samples, 0.44%) + + + +B_div (864 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_inject (576 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (3,930 samples, 0.13%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +alloc_size<4>_tag<5> (546 samples, 0.02%) + + + +opt_project (137,574 samples, 4.45%) +opt_p.. + + +B_rem (400 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +anon-func-44.5 (276 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-54.15 (980,807 samples, 31.71%) +anon-func-54.15 + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-244.5 (17,311 samples, 0.56%) + + + +go (1,659,305 samples, 53.65%) +go + + +B_add (800 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (1,252 samples, 0.04%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-161.5 (25,360 samples, 0.82%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-300.5 (592 samples, 0.02%) + + + +opt_project (1,638 samples, 0.05%) + + + +anon-func-79.3 (980,844 samples, 31.71%) +anon-func-79.3 + + +anon-func-229.5 (15,176 samples, 0.49%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (9,118 samples, 0.29%) + + + +can_tag_i64 (5,696 samples, 0.18%) + + + +anon-func-300.5 (897 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-161.5 (36,257 samples, 1.17%) + + + +B_add (400 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_pow (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (751 samples, 0.02%) + + + +rec (2,797 samples, 0.09%) + + + +anon-func-289.5 (19,889 samples, 0.64%) + + + +anon-func-481.5 (2,198 samples, 0.07%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (589 samples, 0.02%) + + + +B_sub (1,024 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (4,136 samples, 0.13%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,561 samples, 0.05%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-481.5 (15,498 samples, 0.50%) + + + +rec (1,123 samples, 0.04%) + + + +rec (8,920 samples, 0.29%) + + + +blob_of_principal (2,083 samples, 0.07%) + + + +rec (10,801 samples, 0.35%) + + + +opt_inject (288 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +B_add (275 samples, 0.01%) + + + +next (4,662 samples, 0.15%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +natZipWith (20,222 samples, 0.65%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +obj_idx<0> (374 samples, 0.01%) + + + +rec (1,545 samples, 0.05%) + + + +opt_project (288 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemDiv (8,384 samples, 0.27%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +map (4,447 samples, 0.14%) + + + +rec (11,291 samples, 0.37%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (2,724 samples, 0.09%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +can_tag_i64 (5,696 samples, 0.18%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,354 samples, 0.04%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +toTarget (59,244 samples, 1.92%) +t.. + + +opt_inject (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (531 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (729 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (374 samples, 0.01%) + + + +rec (892 samples, 0.03%) + + + +rec (3,656 samples, 0.12%) + + + +rec (3,019 samples, 0.10%) + + + +polyTrim (27,183 samples, 0.88%) + + + +rec (1,816 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (653 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (336 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (307 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +rec (1,561 samples, 0.05%) + + + +scale (1,332 samples, 0.04%) + + + +opt_project (3,744 samples, 0.12%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +elemFromBits (1,051 samples, 0.03%) + + + +rec (604 samples, 0.02%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-300.5 (994 samples, 0.03%) + + + +anon-func-481.5 (38,712 samples, 1.25%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (1,808 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (756 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +alog (1,136 samples, 0.04%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-412.5 (439 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-161.5 (424 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +elemMul (7,776 samples, 0.25%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (3,475 samples, 0.11%) + + + +anon-func-481.5 (11,648 samples, 0.38%) + + + +Array.idx (384 samples, 0.01%) + + + +opt_inject (270 samples, 0.01%) + + + +B_eq (625 samples, 0.02%) + + + +anon-func-62.5 (3,878 samples, 0.13%) + + + +rec (8,242 samples, 0.27%) + + + +toBlocks (122,571 samples, 3.96%) +toBl.. + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +elemMul (7,776 samples, 0.25%) + + + +opt_project (1,440 samples, 0.05%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_add (400 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (810 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-481.5 (2,011 samples, 0.07%) + + + +rec (876 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +alloc_size<4>_tag<5> (478 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (11,395 samples, 0.37%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (357 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +elemMul (7,776 samples, 0.25%) + + + +revAppend (19,650 samples, 0.64%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-44.5 (322 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-161.5 (1,386 samples, 0.04%) + + + +anon-func-412.5 (1,033 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +rec (508 samples, 0.02%) + + + +natFromBits (1,076 samples, 0.03%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +opt_project (1,440 samples, 0.05%) + + + +B_add (800 samples, 0.03%) + + + +rec (884 samples, 0.03%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-300.5 (713 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (1,346 samples, 0.04%) + + + +rec (1,808 samples, 0.06%) + + + +natXor (20,240 samples, 0.65%) + + + +opt_inject (576 samples, 0.02%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (11,098 samples, 0.36%) + + + +elemMul (1,560 samples, 0.05%) + + + +anon-func-161.5 (19,250 samples, 0.62%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (670 samples, 0.02%) + + + +rec (2,149 samples, 0.07%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,362 samples, 0.04%) + + + +B_add (800 samples, 0.03%) + + + +B_rem (400 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +polyLen (940 samples, 0.03%) + + + +rec (2,089 samples, 0.07%) + + + +rec (3,296 samples, 0.11%) + + + +elemToBits (1,991 samples, 0.06%) + + + +anon-func-453.5 (1,850 samples, 0.06%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (828 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +anon-func-412.5 (12,525 samples, 0.40%) + + + +B_pow (768 samples, 0.02%) + + + +finderTLCoords (13,316 samples, 0.43%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +rec (1,354 samples, 0.04%) + + + +pathCoords (979,405 samples, 31.67%) +pathCoords + + +to_2_tuple (384 samples, 0.01%) + + + +rec (9,149 samples, 0.30%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +anon-func-229.5 (2,816 samples, 0.09%) + + + +anon-func-481.5 (2,011 samples, 0.07%) + + + +rec (3,518 samples, 0.11%) + + + +B_add (400 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-161.5 (286 samples, 0.01%) + + + +anon-func-133.5 (2,704 samples, 0.09%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (653 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,601 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +rec (3,552 samples, 0.11%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (1,812,306 samples, 58.60%) +anon-func-300.5 + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +rec (645 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemFromBits (1,144 samples, 0.04%) + + + +natToBits (978 samples, 0.03%) + + + +@deserialize_go<v(H:u,L:u,M:u,Q:u)> (677 samples, 0.02%) + + + +anon-func-300.5 (897 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +canister_init (3,945 samples, 0.13%) + + + +anon-func-494.5 (440 samples, 0.01%) + + + +anon-func-265.5 (5,739 samples, 0.19%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (1,840 samples, 0.06%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +can_tag_i64 (1,000 samples, 0.03%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (25,948 samples, 0.84%) + + + +rec (1,601 samples, 0.05%) + + + +polyPadRight (16,248 samples, 0.53%) + + + +B_add (400 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (1,585 samples, 0.05%) + + + +rec (645 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (4,168 samples, 0.13%) + + + +to_2_tuple (384 samples, 0.01%) + + + +obj_idx<0> (2,312 samples, 0.07%) + + + +rec (604 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_gt (810 samples, 0.03%) + + + +rec (1,808 samples, 0.06%) + + + +rec (3,170 samples, 0.10%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (852 samples, 0.03%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +formatVCoords (4,784 samples, 0.15%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_pow (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +anon-func-481.5 (46,372 samples, 1.50%) + + + +anon-func-161.5 (7,234 samples, 0.23%) + + + +B_div (864 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +to_2_tuple (264 samples, 0.01%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (360 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (378 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +alloc_size<4>_tag<5> (99,421 samples, 3.21%) +all.. + + +rec (325 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +B_add (275 samples, 0.01%) + + + +rec (4,267 samples, 0.14%) + + + +rec (2,542 samples, 0.08%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (1,840 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (422 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +map (333 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_rem (400 samples, 0.01%) + + + +natToBits (1,108 samples, 0.04%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,314 samples, 0.04%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (3,296 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-481.5 (34,862 samples, 1.13%) + + + +alog (1,136 samples, 0.04%) + + + +rec (428 samples, 0.01%) + + + +to_2_tuple (264 samples, 0.01%) + + + +rec (1,362 samples, 0.04%) + + + +rec (2,314 samples, 0.07%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +rec (7,831 samples, 0.25%) + + + +formatCoords (9,597 samples, 0.31%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (1,216 samples, 0.04%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_rem (800 samples, 0.03%) + + + +rec (11,791 samples, 0.38%) + + + +next (4,662 samples, 0.15%) + + + +opt_inject (576 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +anon-func-161.5 (29,344 samples, 0.95%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-393.5 (12,120 samples, 0.39%) + + + +rec (2,694 samples, 0.09%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (531 samples, 0.02%) + + + +to_2_tuple (446 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (2,716 samples, 0.09%) + + + +rec (1,107 samples, 0.04%) + + + +rec (3,296 samples, 0.11%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_sub (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_add (400 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (505 samples, 0.02%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<4>_tag<5> (2,704 samples, 0.09%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +timingVCoords (1,850 samples, 0.06%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-481.5 (9,711 samples, 0.31%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (1,784 samples, 0.06%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (1,601 samples, 0.05%) + + + +natToBits (11,115 samples, 0.36%) + + + +alloc_size<4>_tag<5> (2,496 samples, 0.08%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +link_start (707 samples, 0.02%) + + + +natFromBits (1,076 samples, 0.03%) + + + +rec (382 samples, 0.01%) + + + +anon-func-161.5 (11,930 samples, 0.39%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_mul (432 samples, 0.01%) + + + +opt_project (2,754 samples, 0.09%) + + + +anon-func-44.5 (506 samples, 0.02%) + + + +foldr (568 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +elemAdd (21,344 samples, 0.69%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +anon-func-289.5 (9,116 samples, 0.29%) + + + +rec (634 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (1,362 samples, 0.04%) + + + +anon-func-300.5 (301 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,322 samples, 0.04%) + + + +rec (3,186 samples, 0.10%) + + + +rec (531 samples, 0.02%) + + + +Array.idx (384 samples, 0.01%) + + + +rec (3,640 samples, 0.12%) + + + +log (3,360 samples, 0.11%) + + + +anon-func-79.3 (3,047,550 samples, 98.54%) +anon-func-79.3 + + +B_rem (400 samples, 0.01%) + + + +rec (14,365 samples, 0.46%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +natToBits (1,118 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,252 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (8,242 samples, 0.27%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,577 samples, 0.05%) + + + +rec (1,362 samples, 0.04%) + + + +anon-func-133.5 (23,854 samples, 0.77%) + + + +B_eq (320 samples, 0.01%) + + + +B_add (400 samples, 0.01%) + + + +rec (2,222 samples, 0.07%) + + + +B_rem (400 samples, 0.01%) + + + +rec (653 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (3,209 samples, 0.10%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +map (63,291 samples, 2.05%) +map + + +anon-func-435.5 (864 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +alloc_size<4>_tag<5> (546 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-300.5 (1,004 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,816 samples, 0.06%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-412.5 (637 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +B_add (1,800 samples, 0.06%) + + + +anon-func-265.5 (14,839 samples, 0.48%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_inject (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +rec (1,131 samples, 0.04%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +Array.idx (384 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (3,640 samples, 0.12%) + + + +opt_inject (576 samples, 0.02%) + + + +scale (444 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +elemMul (1,144 samples, 0.04%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (9,019 samples, 0.29%) + + + +rec (8,407 samples, 0.27%) + + + +rec (4,069 samples, 0.13%) + + + +rec (1,768 samples, 0.06%) + + + +B_eq (320 samples, 0.01%) + + + +obj_idx<0> (289 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (8,326 samples, 0.27%) + + + +B_add (17,800 samples, 0.58%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-265.5 (9,379 samples, 0.30%) + + + +to_2_tuple (1,008 samples, 0.03%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +opt_project (378 samples, 0.01%) + + + +B_sub (1,024 samples, 0.03%) + + + +log (3,360 samples, 0.11%) + + + +scale (7,888 samples, 0.26%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (1,765 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (12,115 samples, 0.39%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (3,178 samples, 0.10%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +elemFromBits (1,134 samples, 0.04%) + + + +B_rem (800 samples, 0.03%) + + + +rec (8,524 samples, 0.28%) + + + +rec (653 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_gt (320 samples, 0.01%) + + + +rec (1,046 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (634 samples, 0.02%) + + + +rec (1,355 samples, 0.04%) + + + +@serialize_go<(v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t)> (368 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +rec (31,160 samples, 1.01%) + + + +B_div (864 samples, 0.03%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (382 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-161.5 (34,832 samples, 1.13%) + + + +rec (670 samples, 0.02%) + + + +B_add (325 samples, 0.01%) + + + +padLeftTo (1,094 samples, 0.04%) + + + +anon-func-435.5 (189,920 samples, 6.14%) +anon-fun.. + + +B_gt (320 samples, 0.01%) + + + +alloc_size<4>_tag<5> (338 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,585 samples, 0.05%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-435.5 (676,188 samples, 21.86%) +anon-func-435.5 + + +opt_inject (288 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +anon-func-44.5 (276 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (1,123 samples, 0.04%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +rec (6,247 samples, 0.20%) + + + +rec (634 samples, 0.02%) + + + +@serialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (982 samples, 0.03%) + + + +rec (1,362 samples, 0.04%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-300.5 (495 samples, 0.02%) + + + +rec (505 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (12,040 samples, 0.39%) + + + +opt_project (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (1,840 samples, 0.06%) + + + +B_rem (400 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (4,663 samples, 0.15%) + + + +anon-func-73.5 (350 samples, 0.01%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,601 samples, 0.05%) + + + +anon-func-73.5 (593 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +rec (12,088 samples, 0.39%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +anon-func-481.5 (30,996 samples, 1.00%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (531 samples, 0.02%) + + + +rec (14,068 samples, 0.45%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +rec (3,673 samples, 0.12%) + + + +rec (737 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +alog (1,136 samples, 0.04%) + + + +rec (8,623 samples, 0.28%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-300.5 (897 samples, 0.03%) + + + +rec (1,577 samples, 0.05%) + + + +rec (366 samples, 0.01%) + + + +anon-func-161.5 (3,210 samples, 0.10%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (1,260 samples, 0.04%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +rec (1,776 samples, 0.06%) + + + +rec (1,816 samples, 0.06%) + + + +rec (3,296 samples, 0.11%) + + + +B_rem (400 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-481.5 (9,711 samples, 0.31%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-246.51 (4,830 samples, 0.16%) + + + +Array.idx (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +opt_project (288 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +log (3,360 samples, 0.11%) + + + +motoko_rts::idl::parse_fields::h16db5574f7c8c078 (2,676 samples, 0.09%) + + + +to_2_tuple (624 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +natZipWith (20,160 samples, 0.65%) + + + +to_2_tuple (312 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-453.5 (3,700 samples, 0.12%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +natToBits (573 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (1,107 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (840 samples, 0.03%) + + + +rec (2,254 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +B_eq (320 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +natToBytes (5,280 samples, 0.17%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (1,816 samples, 0.06%) + + + +rec (10,545 samples, 0.34%) + + + +opt_inject (288 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +anon-func-161.5 (18,954 samples, 0.61%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (3,194 samples, 0.10%) + + + +opt_project (576 samples, 0.02%) + + + +rec (470 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (1,149 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (322 samples, 0.01%) + + + +anon-func-300.5 (1,395 samples, 0.05%) + + + +B_add (800 samples, 0.03%) + + + +B_rem (2,000 samples, 0.06%) + + + +rec (3,772 samples, 0.12%) + + + +to_2_tuple (336 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (634 samples, 0.02%) + + + +rec (4,477 samples, 0.14%) + + + +to_2_tuple (264 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-289.5 (464 samples, 0.02%) + + + +anon-func-300.5 (994 samples, 0.03%) + + + +polyPadRight (2,808 samples, 0.09%) + + + +to_2_tuple (768 samples, 0.02%) + + + +go (32,051 samples, 1.04%) + + + +rec (382 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (4,049 samples, 0.13%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (4,555 samples, 0.15%) + + + +rec (1,601 samples, 0.05%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_gt (320 samples, 0.01%) + + + +anon-func-481.5 (5,861 samples, 0.19%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-73.5 (593 samples, 0.02%) + + + +rec (1,816 samples, 0.06%) + + + +opt_inject (576 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +natToBits (838 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +B_gt (320 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (1,236 samples, 0.04%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +elemMul (7,776 samples, 0.25%) + + + +rec (414 samples, 0.01%) + + + +anon-func-481.5 (9,711 samples, 0.31%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (7,138 samples, 0.23%) + + + +opt_project (3,456 samples, 0.11%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +polyPadLeft (26,790 samples, 0.87%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (312 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +opt_project (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (11,692 samples, 0.38%) + + + +anon-func-453.5 (3,676 samples, 0.12%) + + + +anon-func-300.5 (897 samples, 0.03%) + + + +anon-func-393.5 (312 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-161.5 (5,960 samples, 0.19%) + + + +anon-func-412.5 (340 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (1,046 samples, 0.03%) + + + +scale (555 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +natXor (20,302 samples, 0.66%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-481.5 (7,798 samples, 0.25%) + + + +B_mul (432 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +polyDivMod (1,661,015 samples, 53.71%) +polyDivMod + + +B_rem (400 samples, 0.01%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (288 samples, 0.01%) + + + +rec (4,033 samples, 0.13%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +obj_idx<1> (272 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (405,984 samples, 13.13%) +anon-func-435.5 + + +log (3,360 samples, 0.11%) + + + +B_add (800 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (3,296 samples, 0.11%) + + + +rec (422 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-69.50 (304 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +rec (2,852 samples, 0.09%) + + + +opt_project (576 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +rec (1,458 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_eq (320 samples, 0.01%) + + + +rec (10,504 samples, 0.34%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +can_tag_i64 (640 samples, 0.02%) + + + +B_add (7,650 samples, 0.25%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-412.5 (12,568 samples, 0.41%) + + + +B_gt (320 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (531 samples, 0.02%) + + + +rec (414 samples, 0.01%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +utf8_validate (288 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_inject (756 samples, 0.02%) + + + +rec (12,484 samples, 0.40%) + + + +rec (422 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +obj_idx<0> (799 samples, 0.03%) + + + +rec (307 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (14,264 samples, 0.46%) + + + +anon-func-265.5 (2,099 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (3,843 samples, 0.12%) + + + +opt_inject (576 samples, 0.02%) + + + +padLeft (527 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +rec (1,355 samples, 0.04%) + + + +rec (428 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (288 samples, 0.01%) + + + +natToBits (848 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +rec (422 samples, 0.01%) + + + +rec (3,648 samples, 0.12%) + + + +rec (634 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (9,643 samples, 0.31%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (9,811 samples, 0.32%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (1,585 samples, 0.05%) + + + +B_gt (320 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (7,930 samples, 0.26%) + + + +opt_project (2,304 samples, 0.07%) + + + +B_gt (320 samples, 0.01%) + + + +rec (21,260 samples, 0.69%) + + + +rec (884 samples, 0.03%) + + + +rec (10,545 samples, 0.34%) + + + +anon-func-300.5 (800 samples, 0.03%) + + + +rec (2,238 samples, 0.07%) + + + +timingHCoords (1,142 samples, 0.04%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (3,970 samples, 0.13%) + + + +rec (1,904 samples, 0.06%) + + + +anon-func-51.11 (3,020,164 samples, 97.65%) +anon-func-51.11 + + +to_2_tuple (384 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +foldr (2,118 samples, 0.07%) + + + +rec (325 samples, 0.01%) + + + +to_2_tuple (408 samples, 0.01%) + + + +rec (2,287 samples, 0.07%) + + + +can_tag_i64 (2,448 samples, 0.08%) + + + +rec (1,808 samples, 0.06%) + + + +B_pow (768 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +next (996 samples, 0.03%) + + + +rec (3,241 samples, 0.10%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-300.5 (12,854 samples, 0.42%) + + + +opt_inject (288 samples, 0.01%) + + + +forIn (2,417 samples, 0.08%) + + + +obj_idx<1> (272 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +opt_inject (1,440 samples, 0.05%) + + + +anon-func-265.5 (11,199 samples, 0.36%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_sub (1,024 samples, 0.03%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +rec (1,115 samples, 0.04%) + + + +rec (884 samples, 0.03%) + + + +rec (5,713 samples, 0.18%) + + + +B_add (325 samples, 0.01%) + + + +anon-func-300.5 (703 samples, 0.02%) + + + +B_sub (512 samples, 0.02%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +to_2_tuple (288 samples, 0.01%) + + + +opt_inject (1,152 samples, 0.04%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +elemFromBits (1,134 samples, 0.04%) + + + +rec (3,296 samples, 0.11%) + + + +opt_inject (288 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +rec (2,195 samples, 0.07%) + + + +opt_project (288 samples, 0.01%) + + + +rec (14,266 samples, 0.46%) + + + +anon-func-481.5 (23,174 samples, 0.75%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (3,296 samples, 0.11%) + + + +rec (4,555 samples, 0.15%) + + + +to_2_tuple (264 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-73.5 (58,504 samples, 1.89%) +a.. + + +anon-func-435.5 (864 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-300.5 (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,107 samples, 0.04%) + + + +B_sub (1,024 samples, 0.03%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-481.5 (50,206 samples, 1.62%) + + + +alloc_size<4>_tag<5> (1,664 samples, 0.05%) + + + +B_add (800 samples, 0.03%) + + + +rec (428 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-62.5 (9,656 samples, 0.31%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-393.5 (609 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (3,012 samples, 0.10%) + + + +rec (327 samples, 0.01%) + + + +finderTRCoords (13,044 samples, 0.42%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (10,545 samples, 0.34%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_add (300 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (9,149 samples, 0.30%) + + + +rec (414 samples, 0.01%) + + + +opt_inject (270 samples, 0.01%) + + + +opt_inject (270 samples, 0.01%) + + + +rec (4,465 samples, 0.14%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (414 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (7,534 samples, 0.24%) + + + +opt_inject (468 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (2,282 samples, 0.07%) + + + +alloc_size<4>_tag<5> (1,664 samples, 0.05%) + + + +anon-func-133.5 (21,242 samples, 0.69%) + + + +rec (1,338 samples, 0.04%) + + + +rec (876 samples, 0.03%) + + + +anon-func-161.5 (6,977 samples, 0.23%) + + + +anon-func-453.5 (3,684 samples, 0.12%) + + + +B_add (800 samples, 0.03%) + + + +rec (428 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (350 samples, 0.01%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +flatten (60,852 samples, 1.97%) +f.. + + +anon-func-300.5 (287 samples, 0.01%) + + + +anon-func-62.5 (10,863 samples, 0.35%) + + + +rec (645 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +natZipWith (20,222 samples, 0.65%) + + + +rec (505 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,601 samples, 0.05%) + + + +rec (4,555 samples, 0.15%) + + + +rec (1,115 samples, 0.04%) + + + +rec (653 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-229.5 (691 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (10,108 samples, 0.33%) + + + +polyPadLeft (30,192 samples, 0.98%) + + + +rec (589 samples, 0.02%) + + + +rec (428 samples, 0.01%) + + + +natFromBits (1,076 samples, 0.03%) + + + +rec (10,405 samples, 0.34%) + + + +rec (1,346 samples, 0.04%) + + + +B_add (275 samples, 0.01%) + + + +anon-func-481.5 (13,561 samples, 0.44%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (468 samples, 0.02%) + + + +elemMul (1,248 samples, 0.04%) + + + +anon-func-300.5 (911 samples, 0.03%) + + + +padLeft (1,335 samples, 0.04%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_inject (270 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +padLeftTo (852 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (4,366 samples, 0.14%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (907 samples, 0.03%) + + + +opt_inject (1,152 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (325 samples, 0.01%) + + + +anon-func-229.5 (485 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (406 samples, 0.01%) + + + +elemMul (1,040 samples, 0.03%) + + + +anon-func-161.5 (4,480 samples, 0.14%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-161.5 (354 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (2,932 samples, 0.09%) + + + +Array.idx (384 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +rec (11,197 samples, 0.36%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +patternCoords (142,357 samples, 4.60%) +patte.. + + +alog (1,136 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (19,606 samples, 0.63%) + + + +anon-func-133.5 (8,186 samples, 0.26%) + + + +rec (943 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-435.5 (270,944 samples, 8.76%) +anon-func-43.. + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +to_2_tuple (360 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-393.5 (14,568 samples, 0.47%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +natToBits (1,118 samples, 0.04%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,322 samples, 0.04%) + + + +rec (2,238 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-229.5 (691 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_add (350 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemMul (7,776 samples, 0.25%) + + + +elemAdd (21,344 samples, 0.69%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (653 samples, 0.02%) + + + +rec (6,990 samples, 0.23%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (620 samples, 0.02%) + + + +anon-func-133.5 (4,310 samples, 0.14%) + + + +opt_project (576 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +B_add (275 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_div (864 samples, 0.03%) + + + +@deserialize<> (513 samples, 0.02%) + + + +rec (15,088 samples, 0.49%) + + + +natFromBytes (4,974 samples, 0.16%) + + + +anon-func-494.5 (575 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +B_add (300 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,362 samples, 0.04%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_mul (432 samples, 0.01%) + + + +rec (428 samples, 0.01%) + + + +rec (844 samples, 0.03%) + + + +rec (884 samples, 0.03%) + + + +anon-func-161.5 (15,626 samples, 0.51%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-435.5 (703,196 samples, 22.74%) +anon-func-435.5 + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +rec (844 samples, 0.03%) + + + +step (3,434 samples, 0.11%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (15,530 samples, 0.50%) + + + +B_add (525 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +__wasm_call_ctors (666 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (2,024 samples, 0.07%) + + + +anon-func-161.5 (53,776 samples, 1.74%) + + + +anon-func-99.14 (1,932 samples, 0.06%) + + + +rec (3,648 samples, 0.12%) + + + +rec (3,079 samples, 0.10%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-73.5 (269 samples, 0.01%) + + + +alloc_size<5>_tag<11> (338 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +rec (653 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +rec (307 samples, 0.01%) + + + +rec (3,106 samples, 0.10%) + + + +opt_project (2,448 samples, 0.08%) + + + +anon-func-246.51 (21,892 samples, 0.71%) + + + +B_gt (320 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +revAppend (8,380 samples, 0.27%) + + + +B_rem (800 samples, 0.03%) + + + +leb128_decode (342 samples, 0.01%) + + + +natFromBits (1,209 samples, 0.04%) + + + +rec (884 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (2,179 samples, 0.07%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +elemFromBits (1,535 samples, 0.05%) + + + +rec (1,886 samples, 0.06%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_project (288 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +polyTrim (2,967 samples, 0.10%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +leb128_decode (342 samples, 0.01%) + + + +rec (2,164 samples, 0.07%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (5,555 samples, 0.18%) + + + +rec (9,149 samples, 0.30%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-133.5 (1,556 samples, 0.05%) + + + +Array.idx (384 samples, 0.01%) + + + +step (4,661 samples, 0.15%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (360 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +opt_project (966 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +natXor (20,240 samples, 0.65%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,783 samples, 0.06%) + + + +opt_project (4,194 samples, 0.14%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,362 samples, 0.04%) + + + +rec (12,880 samples, 0.42%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (273 samples, 0.01%) + + + +opt_inject (3,744 samples, 0.12%) + + + +anon-func-453.5 (537 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +anon-func-244.5 (42,772 samples, 1.38%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (653 samples, 0.02%) + + + +rec (1,577 samples, 0.05%) + + + +polyGrow (87,193 samples, 2.82%) +po.. + + +opt_inject (288 samples, 0.01%) + + + +rec (682 samples, 0.02%) + + + +B_eq (320 samples, 0.01%) + + + +rec (6,022 samples, 0.19%) + + + +natFromBits (1,076 samples, 0.03%) + + + +rec (1,593 samples, 0.05%) + + + +opt_project (576 samples, 0.02%) + + + +rec (531 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (634 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (4,096 samples, 0.13%) + + + +to_2_tuple (5,592 samples, 0.18%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-300.5 (689 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +B_add (800 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-494.5 (1,115 samples, 0.04%) + + + +to_2_tuple (360 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-229.5 (279 samples, 0.01%) + + + +rec (1,040 samples, 0.03%) + + + +opt_inject (576 samples, 0.02%) + + + +sleb128_decode (729 samples, 0.02%) + + + +scale (1,221 samples, 0.04%) + + + +opt_project (756 samples, 0.02%) + + + +anon-func-229.5 (588 samples, 0.02%) + + + +anon-func-481.5 (28,921 samples, 0.94%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-229.5 (21,935 samples, 0.71%) + + + +rec (1,362 samples, 0.04%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (15,015 samples, 0.49%) + + + +elemAdd (21,344 samples, 0.69%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-79.3 (3,020,201 samples, 97.65%) +anon-func-79.3 + + +rec (3,415 samples, 0.11%) + + + +B_div (864 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,594 samples, 0.05%) + + + +anon-func-73.5 (269 samples, 0.01%) + + + +anon-func-300.5 (1,395 samples, 0.05%) + + + +obj_idx<0> (476 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (3,871 samples, 0.13%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-161.5 (22,200 samples, 0.72%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (2,386 samples, 0.08%) + + + +B_rem (800 samples, 0.03%) + + + +rec (892 samples, 0.03%) + + + +anon-func-300.5 (703 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (838 samples, 0.03%) + + + +rec (428 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +compacting_gc (25,949 samples, 0.84%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +B_rem (400 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-481.5 (714 samples, 0.02%) + + + +anon-func-229.5 (279 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (508 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (802 samples, 0.03%) + + + +B_mul (432 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +rec (4,960 samples, 0.16%) + + + +anon-func-300.5 (703 samples, 0.02%) + + + +rec (892 samples, 0.03%) + + + +to_2_tuple (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +padLeftTo (852 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-300.5 (594 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +B_add (275 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +anon-func-481.5 (19,348 samples, 0.63%) + + + +padLeft (1,335 samples, 0.04%) + + + +B_add (800 samples, 0.03%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +$lambda (5,659 samples, 0.18%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-161.5 (6,202 samples, 0.20%) + + + +to_2_tuple (4,608 samples, 0.15%) + + + +rec (3,550 samples, 0.11%) + + + +rec (1,354 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_gt (320 samples, 0.01%) + + + +__wasm_apply_data_relocs (665 samples, 0.02%) + + + +rec (1,338 samples, 0.04%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +opt_project (576 samples, 0.02%) + + + +rec (6,654 samples, 0.22%) + + + +B_gt (320 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +polyLeadCoeff (26,696 samples, 0.86%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +rec (3,296 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (414 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +all (3,092,730 samples, 100%) + + + +anon-func-481.5 (15,588 samples, 0.50%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (336 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (3,852 samples, 0.12%) + + + +rec (3,724 samples, 0.12%) + + + +anon-func-435.5 (135,904 samples, 4.39%) +anon-.. + + +anon-func-44.5 (736 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +polyNew (2,152 samples, 0.07%) + + + +rec (414 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_mul (432 samples, 0.01%) + + + +can_tag_i64 (640 samples, 0.02%) + + + +anon-func-481.5 (25,103 samples, 0.81%) + + + +B_div (864 samples, 0.03%) + + + +padLeftTo (852 samples, 0.03%) + + + +B_add (400 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (1,000 samples, 0.03%) + + + +B_gt (320 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (1,920 samples, 0.06%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +foldr (3,488 samples, 0.11%) + + + +rec (1,123 samples, 0.04%) + + + +log (3,360 samples, 0.11%) + + + +opt_project (288 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,816 samples, 0.06%) + + + +B_rem (800 samples, 0.03%) + + + +opt_inject (2,448 samples, 0.08%) + + + +anon-func-300.5 (994 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-300.5 (8,217 samples, 0.27%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (1,495 samples, 0.05%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +to_2_tuple (288 samples, 0.01%) + + + +log (3,360 samples, 0.11%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +anon-func-265.5 (13,019 samples, 0.42%) + + + +rec (3,225 samples, 0.10%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +opt_project (288 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +padLeftTo (852 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-73.5 (58,504 samples, 1.89%) +a.. + + +anon-func-300.5 (1,165 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +rec (1,355 samples, 0.04%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +polyAddTerm (552,507 samples, 17.86%) +polyAddTerm + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (3,680 samples, 0.12%) + + + +opt_inject (288 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +anon-func-435.5 (487,070 samples, 15.75%) +anon-func-435.5 + + +rec (840 samples, 0.03%) + + + +rec (1,768 samples, 0.06%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (2,813 samples, 0.09%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (3,072 samples, 0.10%) + + + +rec (1,816 samples, 0.06%) + + + +rec (3,664 samples, 0.12%) + + + +B_gt (800 samples, 0.03%) + + + +rec (414 samples, 0.01%) + + + +anon-func-161.5 (4,482 samples, 0.14%) + + + +rec (943 samples, 0.03%) + + + +anon-func-300.5 (287 samples, 0.01%) + + + +anon-func-435.5 (432,992 samples, 14.00%) +anon-func-435.5 + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,306 samples, 0.04%) + + + +rec (1,110 samples, 0.04%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-435.5 (81,888 samples, 2.65%) +an.. + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +scale (1,554 samples, 0.05%) + + + +opt_project (288 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (713 samples, 0.02%) + + + +B_add (17,800 samples, 0.58%) + + + +B_pow (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +rec (14,464 samples, 0.47%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +anon-func-481.5 (42,554 samples, 1.38%) + + + +anon-func-300.5 (800 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-481.5 (19,348 samples, 0.63%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-161.5 (6,890 samples, 0.22%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +to_2_tuple (4,608 samples, 0.15%) + + + +anon-func-435.5 (108,896 samples, 3.52%) +ano.. + + +rec (2,607 samples, 0.08%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (1,601 samples, 0.05%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<4>_tag<5> (2,704 samples, 0.09%) + + + +toListWithLength (3,374 samples, 0.11%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-300.5 (713 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +anon-func-435.5 (297,952 samples, 9.63%) +anon-func-435.5 + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +log (3,360 samples, 0.11%) + + + +rec (1,569 samples, 0.05%) + + + +rec (653 samples, 0.02%) + + + +rec (8,425 samples, 0.27%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +step (1,680 samples, 0.05%) + + + +B_rem (800 samples, 0.03%) + + + +rec (6,148 samples, 0.20%) + + + +rec (1,346 samples, 0.04%) + + + +rec (3,296 samples, 0.11%) + + + +B_eq (320 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +compacting_gc (1,680 samples, 0.05%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (6,347 samples, 0.21%) + + + +B_div (864 samples, 0.03%) + + + +B_gt (320 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +opt_inject (468 samples, 0.02%) + + + +rec (406 samples, 0.01%) + + + +anon-func-481.5 (27,016 samples, 0.87%) + + + +rec (1,149 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_inject (576 samples, 0.02%) + + + +B_rem (400 samples, 0.01%) + + + +Array.idx (384 samples, 0.01%) + + + +rec (1,569 samples, 0.05%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-435.5 (54,880 samples, 1.77%) + + + +anon-func-300.5 (897 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_rem (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +rec (2,724 samples, 0.09%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (11,055 samples, 0.36%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemFromBits (1,535 samples, 0.05%) + + + +anon-func-73.5 (512 samples, 0.02%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +alog (1,136 samples, 0.04%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +B_div (864 samples, 0.03%) + + + +rec (6,654 samples, 0.22%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (604 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-133.5 (13,082 samples, 0.42%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-435.5 (135,904 samples, 4.39%) +anon-.. + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +B_rem (800 samples, 0.03%) + + + +rec (265 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (1,123 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +rec (12,040 samples, 0.39%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,767 samples, 0.06%) + + + +natToBytes (5,280 samples, 0.17%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (13,177 samples, 0.43%) + + + +map (1,609 samples, 0.05%) + + + +rec (1,832 samples, 0.06%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_div (864 samples, 0.03%) + + + +rec (325 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-289.5 (788,143 samples, 25.48%) +anon-func-289.5 + + +rec (12,979 samples, 0.42%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +range (693 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-300.5 (287 samples, 0.01%) + + + +elemMul (1,456 samples, 0.05%) + + + +B_add (1,800 samples, 0.06%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (414 samples, 0.01%) + + + +next (332 samples, 0.01%) + + + +rec (1,545 samples, 0.05%) + + + +B_rem (800 samples, 0.03%) + + + +rec (5,095 samples, 0.16%) + + + +to_2_tuple (360 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-453.5 (3,692 samples, 0.12%) + + + +opt_project (288 samples, 0.01%) + + + +revAppend (23,898 samples, 0.77%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-412.5 (12,568 samples, 0.41%) + + + +anon-func-44.5 (966 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +rec (288 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,816 samples, 0.06%) + + + +to_2_tuple (5,654 samples, 0.18%) + + + +rec (531 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (7,583 samples, 0.25%) + + + +anon-func-289.5 (14,570 samples, 0.47%) + + + +B_pow (768 samples, 0.02%) + + + +rec (8,821 samples, 0.29%) + + + +anon-func-300.5 (287 samples, 0.01%) + + + +rec (1,362 samples, 0.04%) + + + +rec (892 samples, 0.03%) + + + +alloc_size<4>_tag<5> (338 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-161.5 (5,170 samples, 0.17%) + + + +rec (1,585 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +elemFromBits (1,134 samples, 0.04%) + + + +opt_project (378 samples, 0.01%) + + + +opt_inject (1,440 samples, 0.05%) + + + +rec (2,801 samples, 0.09%) + + + +parse (3,367 samples, 0.11%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +rec (366 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-246.51 (782,039 samples, 25.29%) +anon-func-246.51 + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +to_2_tuple (312 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (1,891 samples, 0.06%) + + + +B_sub (1,024 samples, 0.03%) + + + +rec (414 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +rec (4,306 samples, 0.14%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_rem (400 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (325 samples, 0.01%) + + + +rec (1,252 samples, 0.04%) + + + +B_gt (320 samples, 0.01%) + + + +anon-func-44.5 (690 samples, 0.02%) + + + +rec (2,283 samples, 0.07%) + + + +rec (1,973 samples, 0.06%) + + + +anon-func-300.5 (713 samples, 0.02%) + + + +rec (5,555 samples, 0.18%) + + + +opt_inject (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +rec (1,545 samples, 0.05%) + + + +rec (670 samples, 0.02%) + + + +rec (422 samples, 0.01%) + + + +rec (416 samples, 0.01%) + + + +rec (892 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-481.5 (30,826 samples, 1.00%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +B_gt (320 samples, 0.01%) + + + +B_add (375 samples, 0.01%) + + + +anon-func-133.5 (21,268 samples, 0.69%) + + + +opt_inject (3,744 samples, 0.12%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (21,238 samples, 0.69%) + + + +anon-func-481.5 (3,948 samples, 0.13%) + + + +to_2_tuple (504 samples, 0.02%) + + + +rec (531 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (670 samples, 0.02%) + + + +rec (414 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-435.5 (243,936 samples, 7.89%) +anon-func-4.. + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (6,742 samples, 0.22%) + + + +rec (2,275 samples, 0.07%) + + + +opt_project (2,448 samples, 0.08%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemToBits (1,958 samples, 0.06%) + + + +go (32,239 samples, 1.04%) + + + +natToBytes (5,280 samples, 0.17%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (264 samples, 0.01%) + + + +anon-func-161.5 (3,450 samples, 0.11%) + + + +rec (3,170 samples, 0.10%) + + + +anon-func-300.5 (913 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-453.5 (1,842 samples, 0.06%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_rem (400 samples, 0.01%) + + + +anon-func-412.5 (14,596 samples, 0.47%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +revAppend (21,788 samples, 0.70%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-229.5 (4,399 samples, 0.14%) + + + +anon-func-435.5 (324,960 samples, 10.51%) +anon-func-435.5 + + +rec (1,046 samples, 0.03%) + + + +anon-func-289.5 (6,263 samples, 0.20%) + + + +log (3,360 samples, 0.11%) + + + +B_div (864 samples, 0.03%) + + + +Array.idx (384 samples, 0.01%) + + + +B_sub (512 samples, 0.02%) + + + +rec (12,527 samples, 0.41%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +elemToBits (1,986 samples, 0.06%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +rec (9,149 samples, 0.30%) + + + +rec (1,123 samples, 0.04%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (3,852 samples, 0.12%) + + + +rec (10,257 samples, 0.33%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +B_div (864 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +rec (325 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,577 samples, 0.05%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-73.5 (755 samples, 0.02%) + + + +rec (1,000 samples, 0.03%) + + + +rec (3,827 samples, 0.12%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (14,563 samples, 0.47%) + + + +B_gt (320 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (717 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +opt_inject (3,744 samples, 0.12%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-435.5 (162,912 samples, 5.27%) +anon-f.. + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (800 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_gt (320 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +B_eq (320 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (3,296 samples, 0.11%) + + + +rec (9,217 samples, 0.30%) + + + +anon-func-265.5 (3,919 samples, 0.13%) + + + +anon-func-229.5 (4,369 samples, 0.14%) + + + +rec (12,600 samples, 0.41%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-161.5 (660 samples, 0.02%) + + + +opt_inject (270 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (12,816 samples, 0.41%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (670 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (11,792 samples, 0.38%) + + + +elemMul (7,776 samples, 0.25%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-244.5 (44,972 samples, 1.45%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (3,624 samples, 0.12%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-229.5 (279 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-300.5 (293 samples, 0.01%) + + + +rec (307 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-44.5 (414 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +foldr (1,108 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +rec (943 samples, 0.03%) + + + +B_eq (320 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +B_add (350 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (5,851 samples, 0.19%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +B_add (800 samples, 0.03%) + + + +elemMul (312 samples, 0.01%) + + + +opt_inject (270 samples, 0.01%) + + + +rec (5,554 samples, 0.18%) + + + +anon-func-161.5 (32,919 samples, 1.06%) + + + +rec (737 samples, 0.02%) + + + +rec (3,654 samples, 0.12%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (645 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (9,597 samples, 0.31%) + + + +rec (892 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (844 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +go (2,919 samples, 0.09%) + + + +padLeft (527 samples, 0.02%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (11,494 samples, 0.37%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (1,561 samples, 0.05%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (508 samples, 0.02%) + + + +B_sub (352 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (1,641 samples, 0.05%) + + + +B_rem (800 samples, 0.03%) + + + +rec (1,252 samples, 0.04%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_rem (800 samples, 0.03%) + + + +encode (27,211 samples, 0.88%) + + + +B_div (864 samples, 0.03%) + + + +scale (999 samples, 0.03%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (3,574 samples, 0.12%) + + + +rec (1,314 samples, 0.04%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-38.11 (1,812,240 samples, 58.60%) +anon-func-38.11 + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (1,040 samples, 0.03%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-244.5 (39,508 samples, 1.28%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-494.5 (440 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +opt_inject (1,152 samples, 0.04%) + + + +B_add (400 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (1,601 samples, 0.05%) + + + +rec (12,187 samples, 0.39%) + + + +rec (16,045 samples, 0.52%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (913 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (4,786 samples, 0.15%) + + + +rec (6,346 samples, 0.21%) + + + +B_gt (320 samples, 0.01%) + + + +rec (366 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +rec (670 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-435.5 (514,078 samples, 16.62%) +anon-func-435.5 + + +rec (325 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (832 samples, 0.03%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +anon-func-300.5 (818 samples, 0.03%) + + + +rec (8,029 samples, 0.26%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (653 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +Array.idx (384 samples, 0.01%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (8,013 samples, 0.26%) + + + +natToBits (843 samples, 0.03%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-229.5 (1,103 samples, 0.04%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +B_gt (320 samples, 0.01%) + + + +rec (8,227 samples, 0.27%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +polyLen (59,240 samples, 1.92%) +p.. + + +to_2_tuple (384 samples, 0.01%) + + + +elemAdd (21,406 samples, 0.69%) + + + +rec (325 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,046 samples, 0.03%) + + + +elemMul (728 samples, 0.02%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (949 samples, 0.03%) + + + +to_2_tuple (312 samples, 0.01%) + + + +rec (8,496 samples, 0.27%) + + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +anon-func-32.65 (979,532 samples, 31.67%) +anon-func-32.65 + + +rec (1,354 samples, 0.04%) + + + +rec (3,296 samples, 0.11%) + + + +rec (6,049 samples, 0.20%) + + + +anon-func-161.5 (2,074 samples, 0.07%) + + + +anon-func-161.5 (11,660 samples, 0.38%) + + + +rec (3,654 samples, 0.12%) + + + +B_add (800 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +elemToBits (1,963 samples, 0.06%) + + + +anon-func-435.5 (27,872 samples, 0.90%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +elemToBits (1,996 samples, 0.06%) + + + +opt_inject (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_rem (400 samples, 0.01%) + + + +rec (884 samples, 0.03%) + + + +rec (10,702 samples, 0.35%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-435.5 (595,164 samples, 19.24%) +anon-func-435.5 + + +anon-func-481.5 (7,798 samples, 0.25%) + + + +rec (836 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +B_div (864 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (3,621 samples, 0.12%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +next (971 samples, 0.03%) + + + +rec (1,362 samples, 0.04%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +opt_inject (288 samples, 0.01%) + + + +log (3,360 samples, 0.11%) + + + +padLeftTo (1,740 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-435.5 (378,976 samples, 12.25%) +anon-func-435.5 + + +to_2_tuple (768 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +elemFromBits (1,059 samples, 0.03%) + + + +rec (428 samples, 0.01%) + + + +B_sub (1,024 samples, 0.03%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-495.31 (300 samples, 0.01%) + + + +anon-func-161.5 (13,980 samples, 0.45%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +$loop/1 (5,485 samples, 0.18%) + + + +rec (1,816 samples, 0.06%) + + + +B_pow (768 samples, 0.02%) + + + +rec (4,555 samples, 0.15%) + + + +rec (1,252 samples, 0.04%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +rec (1,046 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +padLeftTo (1,135 samples, 0.04%) + + + +rec (1,840 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (10,306 samples, 0.33%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (3,648 samples, 0.12%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (3,319 samples, 0.11%) + + + +rec (422 samples, 0.01%) + + + +rec (12,385 samples, 0.40%) + + + +opt_inject (576 samples, 0.02%) + + + +obj_idx<0> (306 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +toListWithLength (7,302 samples, 0.24%) + + + +natToBits (568 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (384 samples, 0.01%) + + + +scale (7,888 samples, 0.26%) + + + +to_2_tuple (768 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +timingHCoords (1,142 samples, 0.04%) + + + +anon-func-435.5 (351,968 samples, 11.38%) +anon-func-435.5 + + +rec (11,296 samples, 0.37%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (9,910 samples, 0.32%) + + + +next (4,662 samples, 0.15%) + + + +anon-func-161.5 (3,106 samples, 0.10%) + + + +to_2_tuple (3,672 samples, 0.12%) + + + +rec (31,160 samples, 1.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (892 samples, 0.03%) + + + +scale (1,443 samples, 0.05%) + + + +opt_project (288 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +opt_inject (2,754 samples, 0.09%) + + + +rec (892 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +B_add (350 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-48.7 (3,047,513 samples, 98.54%) +anon-func-48.7 + + +anon-func-300.5 (578 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +alloc_size<2>_tag<9> (338 samples, 0.01%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (634 samples, 0.02%) + + + +anon-func-229.5 (13,455 samples, 0.44%) + + + +B_mul (432 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (2,708 samples, 0.09%) + + + +rec (1,601 samples, 0.05%) + + + +rec (1,824 samples, 0.06%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (18,446 samples, 0.60%) + + + +rec (3,312 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (468 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (12,040 samples, 0.39%) + + + +padLeft (325 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-481.5 (23,174 samples, 0.75%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (804 samples, 0.03%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-481.5 (7,798 samples, 0.25%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (422 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (4,255 samples, 0.14%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (58,376 samples, 1.89%) +rec + + +opt_project (288 samples, 0.01%) + + + +anon-func-481.5 (15,498 samples, 0.50%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (422 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +rec (3,837 samples, 0.12%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +rec (1,354 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (1,840 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (892 samples, 0.03%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (270 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +obj_idx<0> (408 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +scale (333 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-244.5 (10,582 samples, 0.34%) + + + +rec (4,564 samples, 0.15%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-30.36 (1,916,606 samples, 61.97%) +anon-func-30.36 + + +B_add (400 samples, 0.01%) + + + +rec (327 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (12,616 samples, 0.41%) + + + +rec (13,624 samples, 0.44%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +opt_inject (3,456 samples, 0.11%) + + + +rec (2,401 samples, 0.08%) + + + +anon-func-161.5 (9,550 samples, 0.31%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natFromBits (997 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +encode (3,055,839 samples, 98.81%) +encode + + +anon-func-393.5 (609 samples, 0.02%) + + + +polyLen (25,619 samples, 0.83%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +scale (888 samples, 0.03%) + + + +natToBits (1,253 samples, 0.04%) + + + +polyAdd (530,112 samples, 17.14%) +polyAdd + + +rec (1,760 samples, 0.06%) + + + +B_pow (768 samples, 0.02%) + + + +rec (2,724 samples, 0.09%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +to_2_tuple (360 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +opt_project (576 samples, 0.02%) + + + +elemToBits (1,996 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (703 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +to_2_tuple (264 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +rec (414 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (336 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +anon-func-244.5 (788,152 samples, 25.48%) +anon-func-244.5 + + +alloc_size<4>_tag<5> (270 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (1,585 samples, 0.05%) + + + +alloc_size<4>_tag<5> (2,704 samples, 0.09%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-393.5 (1,005 samples, 0.03%) + + + +anon-func-435.5 (541,086 samples, 17.50%) +anon-func-435.5 + + +anon-func-161.5 (5,858 samples, 0.19%) + + + +anon-func-115.39 (1,199 samples, 0.04%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (10,207 samples, 0.33%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (19,135 samples, 0.62%) + + + +rec (1,816 samples, 0.06%) + + + +rec (703 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +polyAdd (851,309 samples, 27.53%) +polyAdd + + +rec (422 samples, 0.01%) + + + +alog (781 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-161.5 (3,794 samples, 0.12%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +rec (653 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-265.5 (4,829 samples, 0.16%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_add (800 samples, 0.03%) + + + +rec (840 samples, 0.03%) + + + +rec (5,404 samples, 0.17%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +rec (1,585 samples, 0.05%) + + + +rec (13,870 samples, 0.45%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +obj_idx<0> (527 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemMul (1,352 samples, 0.04%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +foldr (838 samples, 0.03%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (2,700 samples, 0.09%) + + + +anon-func-435.5 (622,172 samples, 20.12%) +anon-func-435.5 + + +B_mul (432 samples, 0.01%) + + + +rec (901 samples, 0.03%) + + + +anon-func-300.5 (816 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +rec (1,131 samples, 0.04%) + + + +parse_idl_header (271 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +step (1,155 samples, 0.04%) + + + +rec (6,544 samples, 0.21%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (475 samples, 0.02%) + + + +anon-func-44.5 (690 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (943 samples, 0.03%) + + + +rec (346 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +B_div (864 samples, 0.03%) + + + +rec (2,149 samples, 0.07%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_add (400 samples, 0.01%) + + + +anon-func-161.5 (700 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (943 samples, 0.03%) + + + +anon-func-453.5 (3,676 samples, 0.12%) + + + +anon-func-300.5 (800 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-300.5 (994 samples, 0.03%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-161.5 (4,826 samples, 0.16%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +rec (414 samples, 0.01%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,561 samples, 0.05%) + + + +rec (531 samples, 0.02%) + + + +anon-func-453.5 (1,826 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +core::str::converts::from_utf8::hbc4c752be9502b18 (265 samples, 0.01%) + + + +log (3,360 samples, 0.11%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +opt_inject (576 samples, 0.02%) + + + +B_add (375 samples, 0.01%) + + + +rec (876 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +B_mul (432 samples, 0.01%) + + + +rec (4,239 samples, 0.14%) + + + +rec (2,246 samples, 0.07%) + + + +anon-func-300.5 (481 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +natFromBits (1,076 samples, 0.03%) + + + +rec (892 samples, 0.03%) + + + +B_sub (1,024 samples, 0.03%) + + + +alloc_size<4>_tag<5> (3,091 samples, 0.10%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (10,144 samples, 0.33%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,149 samples, 0.04%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +B_div (864 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-300.5 (1,165 samples, 0.04%) + + + +to_2_tuple (4,992 samples, 0.16%) + + + +rec (7,237 samples, 0.23%) + + + +elemFromBits (1,267 samples, 0.04%) + + + +rec (8,722 samples, 0.28%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (1,536 samples, 0.05%) + + + +anon-func-133.5 (2,168 samples, 0.07%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +anon-func-161.5 (4,110 samples, 0.13%) + + + +opt_inject (288 samples, 0.01%) + + + +log (3,360 samples, 0.11%) + + + +rec (10,545 samples, 0.34%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +rec (3,186 samples, 0.10%) + + + +opt_project (270 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (12,816 samples, 0.41%) + + + +anon-func-300.5 (1,127 samples, 0.04%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_inject (270 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +opt_project (576 samples, 0.02%) + + + +polyNew (4,032 samples, 0.13%) + + + +B_eq (320 samples, 0.01%) + + + +rec (1,601 samples, 0.05%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemFromBits (1,376 samples, 0.04%) + + + +rec (2,076 samples, 0.07%) + + + +rec (1,362 samples, 0.04%) + + + +anon-func-246.51 (13,472 samples, 0.44%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_gt (810 samples, 0.03%) + + + +anon-func-289.5 (683 samples, 0.02%) + + + +anon-func-481.5 (3,948 samples, 0.13%) + + + +rec (327 samples, 0.01%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +obj_idx<0> (2,601 samples, 0.08%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +B_div (864 samples, 0.03%) + + + +rec (876 samples, 0.03%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-61.36 (63,226 samples, 2.04%) +a.. + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (1,139 samples, 0.04%) + + + +natZipWith (20,160 samples, 0.65%) + + + +padLeft (527 samples, 0.02%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-494.5 (845 samples, 0.03%) + + + +anon-func-435.5 (108,896 samples, 3.52%) +ano.. + + +elemToBits (2,001 samples, 0.06%) + + + +anon-func-289.5 (683 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,679 samples, 0.05%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +alloc_size<4>_tag<5> (273 samples, 0.01%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +obj_idx<0> (442 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +parse (3,447 samples, 0.11%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-44.5 (2,944 samples, 0.10%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-161.5 (1,243 samples, 0.04%) + + + +opt_inject (576 samples, 0.02%) + + + +$lambda (3,047,689 samples, 98.54%) +$lambda + + +padLeftTo (1,094 samples, 0.04%) + + + +rec (9,415 samples, 0.30%) + + + +rec (1,247 samples, 0.04%) + + + +rec (20,284 samples, 0.66%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_eq (320 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-161.5 (110,608 samples, 3.58%) +ano.. + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +rec (3,162 samples, 0.10%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +anon-func-300.5 (703 samples, 0.02%) + + + +anon-func-44.5 (3,680 samples, 0.12%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (1,897 samples, 0.06%) + + + +anon-func-481.5 (17,411 samples, 0.56%) + + + +remember_continuation (3,747 samples, 0.12%) + + + +natFromBits (1,001 samples, 0.03%) + + + +obj_idx<0> (289 samples, 0.01%) + + + +anon-func-265.5 (13,929 samples, 0.45%) + + + +anon-func-161.5 (22,678 samples, 0.73%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +elemMul (416 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-481.5 (27,016 samples, 0.87%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +padLeftTo (1,094 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-73.5 (512 samples, 0.02%) + + + +map (333 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (1,123 samples, 0.04%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (653 samples, 0.02%) + + + +B_add (375 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +B_add (400 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +rec (11,989 samples, 0.39%) + + + +rec (374 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (13,470 samples, 0.44%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (737 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemToBits (1,996 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (4,342 samples, 0.14%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +opt_project (288 samples, 0.01%) + + + +rec (2,881 samples, 0.09%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (840 samples, 0.03%) + + + +step (4,581 samples, 0.15%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-435.5 (54,880 samples, 1.77%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (8,128 samples, 0.26%) + + + +rec (13,440 samples, 0.43%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-246.51 (19,662 samples, 0.64%) + + + +alloc_size<4>_tag<5> (1,989 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (406 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,832 samples, 0.06%) + + + +rec (1,680 samples, 0.05%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (357 samples, 0.01%) + + + +rec (11,890 samples, 0.38%) + + + +natZipWith (20,160 samples, 0.65%) + + + +rec (876 samples, 0.03%) + + + +anon-func-69.50 (456 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (1,107 samples, 0.04%) + + + +to_2_tuple (336 samples, 0.01%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +rec (4,795 samples, 0.16%) + + + +rec (1,123 samples, 0.04%) + + + +rec (366 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-481.5 (27,162 samples, 0.88%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-300.5 (919 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +B_sub (480 samples, 0.02%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +rec (1,870 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (1,196 samples, 0.04%) + + + +B_add (800 samples, 0.03%) + + + +rec (1,362 samples, 0.04%) + + + +rec (6,759 samples, 0.22%) + + + +opt_project (288 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-44.5 (276 samples, 0.01%) + + + +rec (5,653 samples, 0.18%) + + + +anon-func-289.5 (23,686 samples, 0.77%) + + + +anon-func-435.5 (216,928 samples, 7.01%) +anon-func.. + + +to_2_tuple (4,992 samples, 0.16%) + + + +rec (10,879 samples, 0.35%) + + + +rec (1,840 samples, 0.06%) + + + +anon-func-435.5 (243,936 samples, 7.89%) +anon-func-4.. + + +natToBits (983 samples, 0.03%) + + + +rec (836 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +anon-func-73.5 (674 samples, 0.02%) + + + +anon-func-62.5 (1,136 samples, 0.04%) + + + +opt_project (288 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (422 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (1,840 samples, 0.06%) + + + +B_gt (320 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +rec (1,816 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (428 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (10,055 samples, 0.33%) + + + +anon-func-161.5 (120,080 samples, 3.88%) +anon.. + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +@deserialize_go<t> (550 samples, 0.02%) + + + +rec (9,613 samples, 0.31%) + + + +anon-func-73.5 (10,281 samples, 0.33%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-244.5 (48,213 samples, 1.56%) + + + +natFromBits (1,318 samples, 0.04%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (3,431 samples, 0.11%) + + + +to_2_tuple (360 samples, 0.01%) + + + +natFromBits (1,477 samples, 0.05%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +polyMulTerm (164,985 samples, 5.33%) +polyMu.. + + +opt_inject (288 samples, 0.01%) + + + +rec (58,376 samples, 1.89%) +rec + + +natFromBits (993 samples, 0.03%) + + + +to_2_tuple (768 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +elemToBits (1,977 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +polyPadRight (32,790 samples, 1.06%) + + + +rec (1,115 samples, 0.04%) + + + +rec (3,012 samples, 0.10%) + + + +alog (1,136 samples, 0.04%) + + + +rec (2,485 samples, 0.08%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (422 samples, 0.01%) + + + +elemFromBits (1,535 samples, 0.05%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (756 samples, 0.02%) + + + +anon-func-161.5 (2,150 samples, 0.07%) + + + +obj_idx<0> (510 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +B_add (525 samples, 0.02%) + + + +to_2_tuple (360 samples, 0.01%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-161.5 (91,664 samples, 2.96%) +an.. + + +anon-func-62.5 (1,207 samples, 0.04%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +opt_inject (378 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +rec (1,355 samples, 0.04%) + + + +elemMul (520 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +can_tag_i64 (576 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +rec (5,555 samples, 0.18%) + + + +rec (11,593 samples, 0.37%) + + + +anon-func-300.5 (616 samples, 0.02%) + + + +rec (1,816 samples, 0.06%) + + + +anon-func-481.5 (25,103 samples, 0.81%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +elemFromBits (1,134 samples, 0.04%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B+sub (425 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (892 samples, 0.03%) + + + +B_div (864 samples, 0.03%) + + + +rec (3,672 samples, 0.12%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +B_mul (432 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-300.5 (301 samples, 0.01%) + + + +anon-func-453.5 (4,114 samples, 0.13%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-44.5 (2,944 samples, 0.10%) + + + +log (3,360 samples, 0.11%) + + + +rec (531 samples, 0.02%) + + + +anon-func-453.5 (1,858 samples, 0.06%) + + + +opt_inject (4,194 samples, 0.14%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (81,888 samples, 2.65%) +an.. + + +rec (325 samples, 0.01%) + + + +rec (7,995 samples, 0.26%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +rec (634 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +go (26,367 samples, 0.85%) + + + +scale (7,888 samples, 0.26%) + + + +opt_project (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +B_pow (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (737 samples, 0.02%) + + + +B_rem (400 samples, 0.01%) + + + +to_2_tuple (288 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-133.5 (19,610 samples, 0.63%) + + + +B_add (375 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +@deserialize_go<v(Version:N)> (731 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-412.5 (637 samples, 0.02%) + + + +anon-func-300.5 (939 samples, 0.03%) + + + +rec (703 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +rec (1,792 samples, 0.06%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-229.5 (794 samples, 0.03%) + + + +rec (3,296 samples, 0.11%) + + + +B_rem (800 samples, 0.03%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +elemNew (848 samples, 0.03%) + + + +toList (7,325 samples, 0.24%) + + + +anon-func-300.5 (495 samples, 0.02%) + + + +opt_project (4,194 samples, 0.14%) + + + +opt_inject (270 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +B_rem (400 samples, 0.01%) + + + +anon-func-73.5 (25,228 samples, 0.82%) + + + +B_gt (320 samples, 0.01%) + + + +rec (2,623 samples, 0.08%) + + + +rec (634 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-300.5 (915 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (1,458 samples, 0.05%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-435.5 (405,984 samples, 13.13%) +anon-func-435.5 + + +anon-func-435.5 (351,968 samples, 11.38%) +anon-func-435.5 + + +rec (5,841 samples, 0.19%) + + + +rec (737 samples, 0.02%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +opt_project (468 samples, 0.02%) + + + +rec (1,354 samples, 0.04%) + + + +rec (1,149 samples, 0.04%) + + + +B_add (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +polyZipWith (851,229 samples, 27.52%) +polyZipWith + + +rec (1,776 samples, 0.06%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (360 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (325 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (414 samples, 0.01%) + + + +rec (10,467 samples, 0.34%) + + + +B_sub (512 samples, 0.02%) + + + +rec (25,160 samples, 0.81%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-246.51 (8,420 samples, 0.27%) + + + +rec (13,375 samples, 0.43%) + + + +rec (2,254 samples, 0.07%) + + + +B_gt (320 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +opt_project (3,744 samples, 0.12%) + + + +opt_project (288 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +alog (1,136 samples, 0.04%) + + + +to_2_tuple (768 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +opt_inject (306 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +go (15,864 samples, 0.51%) + + + +revAppend (4,746 samples, 0.15%) + + + +anon-func-393.5 (12,105 samples, 0.39%) + + + +anon-func-246.51 (21,294 samples, 0.69%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (892 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (943 samples, 0.03%) + + + +anon-func-300.5 (1,030 samples, 0.03%) + + + +B+sub (425 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (1,046 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +polyLeadCoeff (386 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +rec (2,716 samples, 0.09%) + + + +rec (3,003 samples, 0.10%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-481.5 (1,456 samples, 0.05%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +B_pow (768 samples, 0.02%) + + + +rec (406 samples, 0.01%) + + + +rec (2,591 samples, 0.08%) + + + +opt_inject (576 samples, 0.02%) + + + +finderCoords (79,627 samples, 2.57%) +fi.. + + +anon-func-300.5 (713 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-265.5 (12,109 samples, 0.39%) + + + +B_mul (432 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +can_tag_i64 (3,008 samples, 0.10%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (6,990 samples, 0.23%) + + + +Array.idx (384 samples, 0.01%) + + + +to_2_tuple (336 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +opt_inject (964 samples, 0.03%) + + + +rec (422 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +rec (3,654 samples, 0.12%) + + + +rec (3,178 samples, 0.10%) + + + +rec (406 samples, 0.01%) + + + +anon-func-435.5 (432,992 samples, 14.00%) +anon-func-435.5 + + +B_sub (1,024 samples, 0.03%) + + + +rec (645 samples, 0.02%) + + + +rec (13,969 samples, 0.45%) + + + +opt_inject (576 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-300.5 (713 samples, 0.02%) + + + +to_2_tuple (504 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +rec (1,354 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (3,296 samples, 0.11%) + + + +elemAdd (21,344 samples, 0.69%) + + + +alloc_size<5>_tag<11> (270 samples, 0.01%) + + + +Array.idx_bigint (368 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-161.5 (82,192 samples, 2.66%) +an.. + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +padLeftTo (852 samples, 0.03%) + + + +natXor (20,240 samples, 0.65%) + + + +natFromBits (1,477 samples, 0.05%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-99.14 (736 samples, 0.02%) + + + +rec (1,840 samples, 0.06%) + + + +opt_project (6,768 samples, 0.22%) + + + +to_2_tuple (768 samples, 0.02%) + + + +polyOrder (53,499 samples, 1.73%) + + + +alloc_size<4>_tag<5> (1,768 samples, 0.06%) + + + +to_2_tuple (768 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +B_div (2,160 samples, 0.07%) + + + +anon-func-300.5 (1,395 samples, 0.05%) + + + +opt_project (576 samples, 0.02%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (6,654 samples, 0.22%) + + + +rec (876 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +rec (428 samples, 0.01%) + + + +rec (2,385 samples, 0.08%) + + + +rec (1,362 samples, 0.04%) + + + +rec (325 samples, 0.01%) + + + +rec (7,852 samples, 0.25%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-495.31 (400 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +text_iter_next (664 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (428 samples, 0.01%) + + + +rec (11,703 samples, 0.38%) + + + +B_rem (800 samples, 0.03%) + + + +rec (3,296 samples, 0.11%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (1,392 samples, 0.05%) + + + +B_div (864 samples, 0.03%) + + + +rec (653 samples, 0.02%) + + + +rec (11,055 samples, 0.36%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (768 samples, 0.02%) + + + +skip_leb128 (280 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_project (3,456 samples, 0.11%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-393.5 (411 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-481.5 (28,921 samples, 0.94%) + + + +B_rem (800 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (7,732 samples, 0.25%) + + + +elemAdd (21,406 samples, 0.69%) + + + +B_eq (320 samples, 0.01%) + + + +opt_project (3,744 samples, 0.12%) + + + +rec (1,046 samples, 0.03%) + + + +padLeftTo (852 samples, 0.03%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +alog (1,136 samples, 0.04%) + + + +B_add (800 samples, 0.03%) + + + +interleave (2,039,278 samples, 65.94%) +interleave + + +rec (1,601 samples, 0.05%) + + + +B_rem (800 samples, 0.03%) + + + +padLeftTo (973 samples, 0.03%) + + + +rec (325 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +rec (12,682 samples, 0.41%) + + + +alloc_size<4>_tag<5> (546 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-481.5 (21,253 samples, 0.69%) + + + +B_pow (768 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_rem (275 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_inject (3,456 samples, 0.11%) + + + +polyLen (59,240 samples, 1.92%) +p.. + + +formatHCoords (3,187 samples, 0.10%) + + + +B_div (864 samples, 0.03%) + + + +anon-func-73.5 (350 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +anon-func-44.5 (2,944 samples, 0.10%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +rec (1,354 samples, 0.04%) + + + +anon-func-265.5 (1,189 samples, 0.04%) + + + +rec (645 samples, 0.02%) + + + +to_2_tuple (183,494 samples, 5.93%) +to_2_tu.. + + +B_pow (768 samples, 0.02%) + + + +anon-func-161.5 (44,304 samples, 1.43%) + + + +generate (980,773 samples, 31.71%) +generate + + +anon-func-300.5 (1,165 samples, 0.04%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +polyLen (32,024 samples, 1.04%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +rec (4,168 samples, 0.13%) + + + +rec (2,188 samples, 0.07%) + + + +rec (2,246 samples, 0.07%) + + + +elemMul (7,776 samples, 0.25%) + + + +rec (634 samples, 0.02%) + + + +natXor (20,240 samples, 0.65%) + + + +anon-func-73.5 (31,288 samples, 1.01%) + + + +anon-func-481.5 (19,446 samples, 0.63%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (10,999 samples, 0.36%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_gt (320 samples, 0.01%) + + + +B_add (300 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (288 samples, 0.01%) + + + +anon-func-161.5 (5,514 samples, 0.18%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_mul (432 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +elemFromBits (1,134 samples, 0.04%) + + + +rec (2,900 samples, 0.09%) + + + +rec (1,123 samples, 0.04%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +rec (422 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_project (756 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,123 samples, 0.04%) + + + +opt_project (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +to_2_tuple (384 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (1,585 samples, 0.05%) + + + +anon-func-300.5 (1,395 samples, 0.05%) + + + +rec (3,060 samples, 0.10%) + + + +B_gt (320 samples, 0.01%) + + + +polyOrder (1,212 samples, 0.04%) + + + +opt_project (5,508 samples, 0.18%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +rec (422 samples, 0.01%) + + + +rec (374 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +rec (1,552 samples, 0.05%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-393.5 (13,704 samples, 0.44%) + + + +rec (892 samples, 0.03%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (3,578 samples, 0.12%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-435.5 (297,952 samples, 9.63%) +anon-func-435.5 + + +natToBytes (5,280 samples, 0.17%) + + + +opt_project (576 samples, 0.02%) + + + +rec (422 samples, 0.01%) + + + +rec (1,601 samples, 0.05%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +anon-func-435.5 (460,000 samples, 14.87%) +anon-func-435.5 + + +rec (2,683 samples, 0.09%) + + + +B_gt (320 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-404.5 (1,196 samples, 0.04%) + + + +opt_project (288 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_add (800 samples, 0.03%) + + + +opt_project (288 samples, 0.01%) + + + +rec (13,078 samples, 0.42%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (12,955 samples, 0.42%) + + + +elemAdd (21,344 samples, 0.69%) + + + +B_rem (800 samples, 0.03%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_div (864 samples, 0.03%) + + + +B_div (864 samples, 0.03%) + + + +natFromBits (1,477 samples, 0.05%) + + + +alloc_size<4>_tag<5> (1,040 samples, 0.03%) + + + +rec (7,435 samples, 0.24%) + + + +anon-func-289.5 (24,350 samples, 0.79%) + + + +rec (1,784 samples, 0.06%) + + + +can_tag_i64 (576 samples, 0.02%) + + + +anon-func-300.5 (939 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +@buffer_size<(v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t)> (322 samples, 0.01%) + + + +sleb128_decode (810 samples, 0.03%) + + + +rec (1,816 samples, 0.06%) + + + +init (2,214 samples, 0.07%) + + + +rec (7,852 samples, 0.25%) + + + +rec (1,545 samples, 0.05%) + + + +anon-func-44.5 (368 samples, 0.01%) + + + +rec (5,841 samples, 0.19%) + + + +rec (3,296 samples, 0.11%) + + + +anon-func-161.5 (5,744 samples, 0.19%) + + + +natToBytes (5,280 samples, 0.17%) + + + +opt_inject (288 samples, 0.01%) + + + +B_add (800 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +to_2_tuple (3,072 samples, 0.10%) + + + +rec (1,396 samples, 0.05%) + + + +forIn (5,019 samples, 0.16%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (10,603 samples, 0.34%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (1,920 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +B_gt (810 samples, 0.03%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +to_2_tuple (384 samples, 0.01%) + + + +go (23,448 samples, 0.76%) + + + +to_2_tuple (384 samples, 0.01%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (519 samples, 0.02%) + + + +memcpy (2,991 samples, 0.10%) + + + +to_2_tuple (768 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (5,158 samples, 0.17%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +opt_inject (3,744 samples, 0.12%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +rec (16,560 samples, 0.54%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +padLeft (325 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +anon-func-161.5 (4,138 samples, 0.13%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +opt_inject (576 samples, 0.02%) + + + +B_mul (432 samples, 0.01%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +anon-func-161.5 (2,762 samples, 0.09%) + + + +elemAdd (21,344 samples, 0.69%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-481.5 (23,288 samples, 0.75%) + + + +B_rem (400 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +anon-func-453.5 (3,708 samples, 0.12%) + + + +opt_project (576 samples, 0.02%) + + + +rec (13,078 samples, 0.42%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-161.5 (63,248 samples, 2.05%) +a.. + + +opt_inject (270 samples, 0.01%) + + + +B_add (325 samples, 0.01%) + + + +rec (20,902 samples, 0.68%) + + + +rec (1,593 samples, 0.05%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +B_div (864 samples, 0.03%) + + + +opt_inject (137,574 samples, 4.45%) +opt_i.. + + +anon-func-161.5 (698 samples, 0.02%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +B_add (375 samples, 0.01%) + + + +rec (1,664 samples, 0.05%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +rec (2,584 samples, 0.08%) + + + +rec (1,506 samples, 0.05%) + + + +B_rem (800 samples, 0.03%) + + + +anon-func-453.5 (1,834 samples, 0.06%) + + + +opt_inject (288 samples, 0.01%) + + + +B_div (864 samples, 0.03%) + + + +rec (1,585 samples, 0.05%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,784 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +rec (2,696 samples, 0.09%) + + + +anon-func-44.5 (1,472 samples, 0.05%) + + + +anon-func-289.5 (21,521 samples, 0.70%) + + + +B_gt (320 samples, 0.01%) + + + +natFromBytes (4,912 samples, 0.16%) + + + +anon-func-300.5 (398 samples, 0.01%) + + + +anon-func-229.5 (1,898 samples, 0.06%) + + + +rec (943 samples, 0.03%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-300.5 (721 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (10,900 samples, 0.35%) + + + +opt_project (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +natFromBits (1,477 samples, 0.05%) + + + +opt_project (288 samples, 0.01%) + + + +Array.idx (384 samples, 0.01%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (505 samples, 0.02%) + + + +rec (884 samples, 0.03%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-73.5 (917 samples, 0.03%) + + + +scale (1,665 samples, 0.05%) + + + +B_add (1,800 samples, 0.06%) + + + +scale (666 samples, 0.02%) + + + +rec (2,275 samples, 0.07%) + + + +rec (422 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +natToBytes (5,280 samples, 0.17%) + + + +opt_inject (576 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-481.5 (13,561 samples, 0.44%) + + + +opt_project (288 samples, 0.01%) + + + +scale (7,888 samples, 0.26%) + + + +natToBits (1,113 samples, 0.04%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +elemMul (936 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +rec (1,362 samples, 0.04%) + + + +rec (988 samples, 0.03%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (12,030 samples, 0.39%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +elemMul (7,776 samples, 0.25%) + + + +rec (645 samples, 0.02%) + + + +B_sub (1,024 samples, 0.03%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-229.5 (1,103 samples, 0.04%) + + + +anon-func-73.5 (512 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +rec (307 samples, 0.01%) + + + +anon-func-62.5 (1,824 samples, 0.06%) + + + +opt_project (576 samples, 0.02%) + + + +rec (2,246 samples, 0.07%) + + + +elemMul (832 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-161.5 (979,589 samples, 31.67%) +anon-func-161.5 + + +opt_project (576 samples, 0.02%) + + + +rec (653 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +natXor (20,302 samples, 0.66%) + + + +elemAdd (21,344 samples, 0.69%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +polyGrow (63,416 samples, 2.05%) +p.. + + +alloc_size<4>_tag<5> (754 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +natToBytes (5,280 samples, 0.17%) + + + +rec (1,346 samples, 0.04%) + + + +rec (13,985 samples, 0.45%) + + + +B_add (800 samples, 0.03%) + + + +revAppend (781,675 samples, 25.27%) +revAppend + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_inject (2,304 samples, 0.07%) + + + +rec (653 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (414 samples, 0.01%) + + + +anon-func-435.5 (5,742 samples, 0.19%) + + + +rec (9,597 samples, 0.31%) + + + +rec (1,123 samples, 0.04%) + + + +anon-func-300.5 (287 samples, 0.01%) + + + +to_2_tuple (384 samples, 0.01%) + + + +B_eq (850 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +opt_project (576 samples, 0.02%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +B_rem (800 samples, 0.03%) + + + +rec (327 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +sleb128_decode (324 samples, 0.01%) + + + +anon-func-300.5 (384 samples, 0.01%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (1,123 samples, 0.04%) + + + +rec (4,762 samples, 0.15%) + + + +obj_idx<0> (289 samples, 0.01%) + + + +rec (6,654 samples, 0.22%) + + + +rec (1,040 samples, 0.03%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +scale (7,888 samples, 0.26%) + + + +padLeftTo (1,740 samples, 0.06%) + + + +to_2_tuple (4,992 samples, 0.16%) + + + +rec (653 samples, 0.02%) + + + +natFromBits (1,477 samples, 0.05%) + + + +encode (27,264 samples, 0.88%) + + + +rec (1,577 samples, 0.05%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +rec (1,115 samples, 0.04%) + + + +to_2_tuple (360 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +B_eq (320 samples, 0.01%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +B_mul (432 samples, 0.01%) + + + +to_2_tuple (312 samples, 0.01%) + + + +anon-func-265.5 (8,469 samples, 0.27%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +rec (8,182 samples, 0.26%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natZipWith (20,160 samples, 0.65%) + + + +anon-func-453.5 (3,684 samples, 0.12%) + + + +opt_inject (288 samples, 0.01%) + + + +to_2_tuple (264 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +rec (5,555 samples, 0.18%) + + + +rec (3,654 samples, 0.12%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +opt_project (3,744 samples, 0.12%) + + + +B_pow (768 samples, 0.02%) + + + +B_eq (320 samples, 0.01%) + + + +rec (3,296 samples, 0.11%) + + + +Array.idx_bigint (736 samples, 0.02%) + + + +rec (634 samples, 0.02%) + + + +rec (892 samples, 0.03%) + + + +rec (1,840 samples, 0.06%) + + + +rec (10,009 samples, 0.32%) + + + +opt_inject (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (840 samples, 0.03%) + + + +rec (2,708 samples, 0.09%) + + + +to_2_tuple (384 samples, 0.01%) + + + +foldr (433 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +rec (3,859 samples, 0.12%) + + + +opt_project (288 samples, 0.01%) + + + +rec (13,276 samples, 0.43%) + + + +anon-func-453.5 (1,933 samples, 0.06%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +to_2_tuple (336 samples, 0.01%) + + + +anon-func-69.50 (456 samples, 0.01%) + + + +rec (7,852 samples, 0.25%) + + + +revAppend (21,282 samples, 0.69%) + + + +anon-func-161.5 (101,136 samples, 3.27%) +ano.. + + +anon-func-300.5 (301 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +opt_project (576 samples, 0.02%) + + + +anon-func-393.5 (12,120 samples, 0.39%) + + + +rec (892 samples, 0.03%) + + + +anon-func-265.5 (6,649 samples, 0.21%) + + + +opt_project (288 samples, 0.01%) + + + +natXor (20,240 samples, 0.65%) + + + +to_2_tuple (384 samples, 0.01%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (7,852 samples, 0.25%) + + + +scale (7,888 samples, 0.26%) + + + +rec (1,601 samples, 0.05%) + + + +anon-func-435.5 (5,680 samples, 0.18%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (2,852 samples, 0.09%) + + + +elemMul (624 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_gt (320 samples, 0.01%) + + + +opt_inject (576 samples, 0.02%) + + + +rec (5,455 samples, 0.18%) + + + +opt_project (2,304 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +B_eq (320 samples, 0.01%) + + + +rec (5,950 samples, 0.19%) + + + +anon-func-62.5 (2,272 samples, 0.07%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (6,841 samples, 0.22%) + + + +natToBits (1,123 samples, 0.04%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 0.01%) + + + +rec (1,306 samples, 0.04%) + + + +rec (604 samples, 0.02%) + + + +alloc_size<2>_tag<9> (416 samples, 0.01%) + + + +opt_project (288 samples, 0.01%) + + + +rec (17,590 samples, 0.57%) + + + +to_2_tuple (384 samples, 0.01%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +anon-func-481.5 (3,948 samples, 0.13%) + + + +rec (2,980 samples, 0.10%) + + + +B_sub (1,024 samples, 0.03%) + + + +B_add (800 samples, 0.03%) + + + +natZipWith (20,160 samples, 0.65%) + + + +B_add (800 samples, 0.03%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (737 samples, 0.02%) + + + +alloc_size<4>_tag<5> (416 samples, 0.01%) + + + +rec (1,371 samples, 0.04%) + + + +anon-func-229.5 (19,358 samples, 0.63%) + + + +rec (653 samples, 0.02%) + + + +rec (6,848 samples, 0.22%) + + + +opt_inject (576 samples, 0.02%) + + + +B_add (800 samples, 0.03%) + + + +anon-func-300.5 (408 samples, 0.01%) + + + +rec (5,200 samples, 0.17%) + + + +polySub (851,373 samples, 27.53%) +polySub + + +rec (1,816 samples, 0.06%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (1,354 samples, 0.04%) + + + +opt_project (2,754 samples, 0.09%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-244.5 (27,661 samples, 0.89%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (576 samples, 0.02%) + + + +anon-func-73.5 (3,424 samples, 0.11%) + + + +opt_project (972 samples, 0.03%) + + + +natXor (20,240 samples, 0.65%) + + + +elemAdd (21,344 samples, 0.69%) + + + +to_2_tuple (768 samples, 0.02%) + + + +rec (1,354 samples, 0.04%) + + + +elemAdd (21,344 samples, 0.69%) + + + +rec (2,149 samples, 0.07%) + + + +to_2_tuple (360 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +rec (1,123 samples, 0.04%) + + + +rec (1,354 samples, 0.04%) + + + +natToBytes (5,280 samples, 0.17%) + + + +B_mul (432 samples, 0.01%) + + + +to_2_tuple (1,008 samples, 0.03%) + + + +to_2_tuple (360 samples, 0.01%) + + + +opt_project (576 samples, 0.02%) + + + +to_2_tuple (768 samples, 0.02%) + + + +anon-func-44.5 (736 samples, 0.02%) + + + +natZipWith (20,160 samples, 0.65%) + + + +opt_inject (288 samples, 0.01%) + + + +anon-func-229.5 (1,618 samples, 0.05%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +to_2_tuple (384 samples, 0.01%) + + + +Nat-><Nat8> (576 samples, 0.02%) + + + +anon-func-300.5 (3,600 samples, 0.12%) + + + +B_add (9,400 samples, 0.30%) + + + +anon-func-300.5 (1,165 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +can_tag_i64 (3,008 samples, 0.10%) + + + +alloc_size<4>_tag<5> (338 samples, 0.01%) + + + +rec (1,110 samples, 0.04%) + + + +opt_project (576 samples, 0.02%) + + + +elemAdd (21,344 samples, 0.69%) + + + +anon-func-435.5 (864 samples, 0.03%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +obj_idx<0> (272 samples, 0.01%) + + + +anon-func-161.5 (1,300 samples, 0.04%) + + + +rec (1,354 samples, 0.04%) + + + +anon-func-435.5 (378,976 samples, 12.25%) +anon-func-435.5 + + +anon-func-161.5 (16,510 samples, 0.53%) + + + +anon-func-435.5 (162,912 samples, 5.27%) +anon-f.. + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (942 samples, 0.03%) + + + +next (996 samples, 0.03%) + + + +B_rem (800 samples, 0.03%) + + + +B_pow (768 samples, 0.02%) + + + +rec (1,989 samples, 0.06%) + + + +anon-func-68.41 (2,544 samples, 0.08%) + + + +opt_inject (288 samples, 0.01%) + + + +rec (14,167 samples, 0.46%) + + + +obj_idx<0> (544 samples, 0.02%) + + + +B_rem (400 samples, 0.01%) + + + +rec (18,105 samples, 0.59%) + + + +opt_project (576 samples, 0.02%) + + + +opt_inject (288 samples, 0.01%) + + + + diff --git a/flamegraphs/reversi-reverse.svg b/flamegraphs/reversi-reverse.svg new file mode 100644 index 00000000000..a8204a90ae9 --- /dev/null +++ b/flamegraphs/reversi-reverse.svg @@ -0,0 +1,3369 @@ + + + + + + + + + + + + + + +reversi.mo (reverse) + +Reset Zoom +Search + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (630 samples, 0.08%) + + + +opponent (26,571 samples, 3.58%) +opp.. + + +set_and_flip (480 samples, 0.06%) + + + +$lambda (231 samples, 0.03%) + + + +$lambda (160 samples, 0.02%) + + + +valid_moves (1,700 samples, 0.23%) + + + +board (10,096 samples, 1.36%) + + + +alloc_size<4>_tag<1> (845 samples, 0.11%) + + + +init (472 samples, 0.06%) + + + +place (432 samples, 0.06%) + + + +place (126 samples, 0.02%) + + + +board (428 samples, 0.06%) + + + +place (441 samples, 0.06%) + + + +$lambda (1,562 samples, 0.21%) + + + +flip (408 samples, 0.06%) + + + +place (3,502 samples, 0.47%) + + + +$lambda (12,224 samples, 1.65%) + + + +eventually (8,160 samples, 1.10%) + + + +place (12,540 samples, 1.69%) + + + +set_and_flip (96 samples, 0.01%) + + + +reset (85 samples, 0.01%) + + + +board (284 samples, 0.04%) + + + +board (468 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (2,298 samples, 0.31%) + + + +place (21,660 samples, 2.92%) +pl.. + + +valid_moves (9,912 samples, 1.34%) + + + +place (1,056 samples, 0.14%) + + + +set_and_flip (130 samples, 0.02%) + + + +set_and_flip (64 samples, 0.01%) + + + +render (256 samples, 0.03%) + + + +place (18,735 samples, 2.53%) +pl.. + + +set_and_flip (288 samples, 0.04%) + + + +place (64 samples, 0.01%) + + + +set_and_flip (480 samples, 0.06%) + + + +init (136 samples, 0.02%) + + + +compacting_gc (552 samples, 0.07%) + + + +reset (104 samples, 0.01%) + + + +@serialize<t> (7,168 samples, 0.97%) + + + +next (10,744 samples, 1.45%) + + + +@deserialize<III> (729 samples, 0.10%) + + + +reset (66 samples, 0.01%) + + + +valid_moves (400 samples, 0.05%) + + + +place (1,060 samples, 0.14%) + + + +next (5,056 samples, 0.68%) + + + +init (85 samples, 0.01%) + + + +$lambda (300 samples, 0.04%) + + + +$lambda (96 samples, 0.01%) + + + +init (209 samples, 0.03%) + + + +place (204 samples, 0.03%) + + + +$lambda (96 samples, 0.01%) + + + +valid_moves (800 samples, 0.11%) + + + +valid_moves (2,840 samples, 0.38%) + + + +init (70 samples, 0.01%) + + + +$lambda (275 samples, 0.04%) + + + +blob_of_principal (372 samples, 0.05%) + + + +place (198 samples, 0.03%) + + + +init (815 samples, 0.11%) + + + +$lambda (1,152 samples, 0.16%) + + + +board (3,976 samples, 0.54%) + + + +$lambda (1,672 samples, 0.23%) + + + +$lambda (9,120 samples, 1.23%) + + + +$lambda (84 samples, 0.01%) + + + +place (11,691 samples, 1.58%) + + + +@serialize<t> (231 samples, 0.03%) + + + +place (1,224 samples, 0.17%) + + + +place (918 samples, 0.12%) + + + +render (4,896 samples, 0.66%) + + + +$lambda (21,660 samples, 2.92%) +$l.. + + +init (798 samples, 0.11%) + + + +board (4,860 samples, 0.66%) + + + +render (1,152 samples, 0.16%) + + + +__set_hp (704 samples, 0.09%) + + + +text_to_buf (12,224 samples, 1.65%) + + + +init (816 samples, 0.11%) + + + +reset (63 samples, 0.01%) + + + +place (326 samples, 0.04%) + + + +$lambda (84 samples, 0.01%) + + + +valid_moves (1,136 samples, 0.15%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (472 samples, 0.06%) + + + +canister_init (552 samples, 0.07%) + + + +place (76 samples, 0.01%) + + + +$lambda (84 samples, 0.01%) + + + +$lambda (864 samples, 0.12%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (1,152 samples, 0.16%) + + + +$lambda (918 samples, 0.12%) + + + +$lambda (204 samples, 0.03%) + + + +render (3,052 samples, 0.41%) + + + +text_concat (512 samples, 0.07%) + + + +parse_idl_header (729 samples, 0.10%) + + + +place (189 samples, 0.03%) + + + +init (1,632 samples, 0.22%) + + + +$lambda (3,052 samples, 0.41%) + + + +render (8,449 samples, 1.14%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (372 samples, 0.05%) + + + +valid_moves (3,672 samples, 0.50%) + + + +alloc_size<2>_tag<9> (845 samples, 0.11%) + + + +eventually (3,200 samples, 0.43%) + + + +reset (128 samples, 0.02%) + + + +sleb128_decode (1,458 samples, 0.20%) + + + +reset (256 samples, 0.03%) + + + +render (1,368 samples, 0.18%) + + + +render (24,084 samples, 3.25%) +ren.. + + +valid_moves (126 samples, 0.02%) + + + +$lambda (5,612 samples, 0.76%) + + + +__wasm_apply_data_relocs (665 samples, 0.09%) + + + +@serialize<t> (441 samples, 0.06%) + + + +$lambda (3,971 samples, 0.54%) + + + +$lambda (31,776 samples, 4.29%) +$lambda + + +$lambda (480 samples, 0.06%) + + + +place (5,664 samples, 0.76%) + + + +$lambda (3,408 samples, 0.46%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (450 samples, 0.06%) + + + +place (204 samples, 0.03%) + + + +@deserialize<III> (192 samples, 0.03%) + + + +@deserialize_go<I> (441 samples, 0.06%) + + + +@deserialize<III> (492 samples, 0.07%) + + + +board (924 samples, 0.12%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 0.05%) + + + +@deserialize<III> (459 samples, 0.06%) + + + +canister_init (1,088 samples, 0.15%) + + + +place (64 samples, 0.01%) + + + +@buffer_size<t> (231 samples, 0.03%) + + + +valid_moves (67,524 samples, 9.11%) +valid_moves + + +eventually (1,190 samples, 0.16%) + + + +render (252 samples, 0.03%) + + + +place (152 samples, 0.02%) + + + +init (76 samples, 0.01%) + + + +blob_of_principal (179 samples, 0.02%) + + + +text_concat (364 samples, 0.05%) + + + +@serialize<t> (497 samples, 0.07%) + + + +init (512 samples, 0.07%) + + + +@deserialize<> (640 samples, 0.09%) + + + +render (512 samples, 0.07%) + + + +place (459 samples, 0.06%) + + + +place (81 samples, 0.01%) + + + +valid_moves (1,728 samples, 0.23%) + + + +place (1,289 samples, 0.17%) + + + +valid_moves (216 samples, 0.03%) + + + +exists (36,384 samples, 4.91%) +exists + + +$lambda (204 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,152 samples, 0.16%) + + + +init (88 samples, 0.01%) + + + +board (612 samples, 0.08%) + + + +valid_moves (1,060 samples, 0.14%) + + + +$lambda (926 samples, 0.12%) + + + +canister_init (816 samples, 0.11%) + + + +place (96 samples, 0.01%) + + + +@serialize_go<t> (420 samples, 0.06%) + + + +place (84 samples, 0.01%) + + + +place (198 samples, 0.03%) + + + +blob_of_principal (472 samples, 0.06%) + + + +place (264 samples, 0.04%) + + + +set_and_flip (360 samples, 0.05%) + + + +alloc_blob (792 samples, 0.11%) + + + +@deserialize<> (320 samples, 0.04%) + + + +trans_state5 (104 samples, 0.01%) + + + +place (951 samples, 0.13%) + + + +place (400 samples, 0.05%) + + + +@serialize_go<t> (10,180 samples, 1.37%) + + + +set_and_flip (352 samples, 0.05%) + + + +$lambda (60,348 samples, 8.14%) +$lambda + + +$lambda (67,524 samples, 9.11%) +$lambda + + +render (924 samples, 0.12%) + + + +valid_moves (2,266 samples, 0.31%) + + + +$lambda (928 samples, 0.13%) + + + +$lambda (351 samples, 0.05%) + + + +can_tag_i64 (77,872 samples, 10.50%) +can_tag_i64 + + +place (88 samples, 0.01%) + + + +canister_init (2,197 samples, 0.30%) + + + +$lambda (2,840 samples, 0.38%) + + + +init (66 samples, 0.01%) + + + +render (3,240 samples, 0.44%) + + + +valid_moves (24,072 samples, 3.25%) +val.. + + +reset (256 samples, 0.03%) + + + +reset (64 samples, 0.01%) + + + +compacting_gc (630 samples, 0.08%) + + + +place (96 samples, 0.01%) + + + +place (150 samples, 0.02%) + + + +$lambda (130 samples, 0.02%) + + + +set_and_flip (96 samples, 0.01%) + + + +compacting_gc (594 samples, 0.08%) + + + +flip (64 samples, 0.01%) + + + +$lambda (7,056 samples, 0.95%) + + + +place (2,266 samples, 0.31%) + + + +board (15,383 samples, 2.07%) +b.. + + +board (744 samples, 0.10%) + + + +canister_init (472 samples, 0.06%) + + + +canister_init (66 samples, 0.01%) + + + +valid_moves (2,472 samples, 0.33%) + + + +$lambda (1,224 samples, 0.17%) + + + +$lambda (192 samples, 0.03%) + + + +set_and_flip (456 samples, 0.06%) + + + +init (64 samples, 0.01%) + + + +valid_moves (18,735 samples, 2.53%) +va.. + + +$lambda (360 samples, 0.05%) + + + +place (192 samples, 0.03%) + + + +board (512 samples, 0.07%) + + + +valid_moves (351 samples, 0.05%) + + + +$lambda (24,084 samples, 3.25%) +$la.. + + +place (160 samples, 0.02%) + + + +$lambda (2,698 samples, 0.36%) + + + +$lambda (1,026 samples, 0.14%) + + + +place (1,026 samples, 0.14%) + + + +init (4,457 samples, 0.60%) + + + +valid_moves (1,562 samples, 0.21%) + + + +valid_moves (3,971 samples, 0.54%) + + + +valid_moves (11,190 samples, 1.51%) + + + +set_and_flip (168 samples, 0.02%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (364 samples, 0.05%) + + + +board (3,976 samples, 0.54%) + + + +eventually (6,272 samples, 0.85%) + + + +render (9,443 samples, 1.27%) + + + +board (108 samples, 0.01%) + + + +place (130 samples, 0.02%) + + + +$lambda (189 samples, 0.03%) + + + +eventually (3,840 samples, 0.52%) + + + +canister_init (748 samples, 0.10%) + + + +place (576 samples, 0.08%) + + + +render (1,152 samples, 0.16%) + + + +$lambda (5,292 samples, 0.71%) + + + +$lambda (650 samples, 0.09%) + + + +board (5,964 samples, 0.80%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (552 samples, 0.07%) + + + +link_start (665 samples, 0.09%) + + + +valid_moves (864 samples, 0.12%) + + + +$lambda (576 samples, 0.08%) + + + +set_and_flip (198 samples, 0.03%) + + + +B_sub (11,452 samples, 1.54%) + + + +place (928 samples, 0.13%) + + + +eventually (896 samples, 0.12%) + + + +B_mul (39,121 samples, 5.28%) +B_mul + + +place (459 samples, 0.06%) + + + +range (845 samples, 0.11%) + + + +$lambda (256 samples, 0.03%) + + + +place (1,648 samples, 0.22%) + + + +valid_moves (1,972 samples, 0.27%) + + + +$lambda (416 samples, 0.06%) + + + +B_ge (29,400 samples, 3.97%) +B_ge + + +leb128_encode (84 samples, 0.01%) + + + +place (9,120 samples, 1.23%) + + + +render (468 samples, 0.06%) + + + +valid_moves (13,680 samples, 1.85%) +v.. + + +set_and_flip (1,289 samples, 0.17%) + + + +idl_sub_buf_words (72 samples, 0.01%) + + + +Array.idx_bigint (26,172 samples, 3.53%) +Arr.. + + +place (31,776 samples, 4.29%) +place + + +canister_init (66 samples, 0.01%) + + + +canister_init (372 samples, 0.05%) + + + +place (1,704 samples, 0.23%) + + + +$lambda (480 samples, 0.06%) + + + +canister_init (650 samples, 0.09%) + + + +B_gt (6,970 samples, 0.94%) + + + +flip (456 samples, 0.06%) + + + +place (926 samples, 0.12%) + + + +$lambda (7,168 samples, 0.97%) + + + +render (15,383 samples, 2.07%) +r.. + + +set_and_flip (96 samples, 0.01%) + + + +B_add (48,296 samples, 6.51%) +B_add + + +board (264 samples, 0.04%) + + + +place (11,190 samples, 1.51%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,396 samples, 0.19%) + + + +$lambda (1,972 samples, 0.27%) + + + +render (4,860 samples, 0.66%) + + + +$lambda (15,383 samples, 2.07%) +$.. + + +opponent (12,504 samples, 1.69%) + + + +next (6,970 samples, 0.94%) + + + +set_and_flip (408 samples, 0.06%) + + + +$lambda (459 samples, 0.06%) + + + +exists (25,308 samples, 3.41%) +exi.. + + +board (512 samples, 0.07%) + + + +@deserialize<> (535 samples, 0.07%) + + + +place (480 samples, 0.06%) + + + +render (5,964 samples, 0.80%) + + + +board (15,588 samples, 2.10%) +b.. + + +reset (172 samples, 0.02%) + + + +canister_init (798 samples, 0.11%) + + + +place (213 samples, 0.03%) + + + +place (1,136 samples, 0.15%) + + + +set_and_flip (660 samples, 0.09%) + + + +exists (68,796 samples, 9.28%) +exists + + +blob_of_principal (66 samples, 0.01%) + + + +$lambda (748 samples, 0.10%) + + + +exists (12,650 samples, 1.71%) + + + +B_add (102,629 samples, 13.84%) +B_add + + +valid_moves (2,394 samples, 0.32%) + + + +$lambda (126 samples, 0.02%) + + + +valid_moves (864 samples, 0.12%) + + + +board (256 samples, 0.03%) + + + +place (11,328 samples, 1.53%) + + + +set_and_flip (300 samples, 0.04%) + + + +init (748 samples, 0.10%) + + + +init (179 samples, 0.02%) + + + +range (845 samples, 0.11%) + + + +$lambda (1,648 samples, 0.22%) + + + +place (26,880 samples, 3.63%) +place + + +eventually (7,040 samples, 0.95%) + + + +place (210 samples, 0.03%) + + + +valid_moves (2,840 samples, 0.38%) + + + +set_and_flip (204 samples, 0.03%) + + + +$lambda (96 samples, 0.01%) + + + +flip (160 samples, 0.02%) + + + +place (1,728 samples, 0.23%) + + + +$lambda (144 samples, 0.02%) + + + +set_and_flip (152 samples, 0.02%) + + + +memset (1,428 samples, 0.19%) + + + +init (512 samples, 0.07%) + + + +render (5,467 samples, 0.74%) + + + +$lambda (924 samples, 0.12%) + + + +@serialize<t> (420 samples, 0.06%) + + + +compacting_gc (35,063 samples, 4.73%) +compa.. + + +place (70 samples, 0.01%) + + + +reset (107 samples, 0.01%) + + + +$lambda (160 samples, 0.02%) + + + +place (13,680 samples, 1.85%) +p.. + + +is_empty (926 samples, 0.12%) + + + +set_and_flip (210 samples, 0.03%) + + + +$lambda (456 samples, 0.06%) + + + +$lambda (468 samples, 0.06%) + + + +$lambda (1,700 samples, 0.23%) + + + +board (200 samples, 0.03%) + + + +$lambda (79,212 samples, 10.68%) +$lambda + + +board (4,896 samples, 0.66%) + + + +board (288 samples, 0.04%) + + + +Array.idx_bigint (23,991 samples, 3.24%) +Arr.. + + +Array_init (3,192 samples, 0.43%) + + + +$lambda (468 samples, 0.06%) + + + +$lambda (13,680 samples, 1.85%) +$.. + + +place (24,072 samples, 3.25%) +place + + +place (99 samples, 0.01%) + + + +init (66 samples, 0.01%) + + + +place (360 samples, 0.05%) + + + +place (96 samples, 0.01%) + + + +valid_moves (2,698 samples, 0.36%) + + + +canister_init (179 samples, 0.02%) + + + +$lambda (7,242 samples, 0.98%) + + + +place (275 samples, 0.04%) + + + +$lambda (468 samples, 0.06%) + + + +opt_project (2,528 samples, 0.34%) + + + +@deserialize<> (750 samples, 0.10%) + + + +board (264 samples, 0.04%) + + + +$lambda (2,266 samples, 0.31%) + + + +place (864 samples, 0.12%) + + + +board (364 samples, 0.05%) + + + +$lambda (612 samples, 0.08%) + + + +set_and_flip (76 samples, 0.01%) + + + +board (512 samples, 0.07%) + + + +$lambda (1,060 samples, 0.14%) + + + +valid_moves (1,026 samples, 0.14%) + + + +@serialize<t> (12,224 samples, 1.65%) + + + +compacting_gc (1,152 samples, 0.16%) + + + +eventually (1,760 samples, 0.24%) + + + +$lambda (2,197 samples, 0.30%) + + + +set_and_flip (432 samples, 0.06%) + + + +@serialize_go<t> (7,168 samples, 0.97%) + + + +set_and_flip (918 samples, 0.12%) + + + +set_and_flip (792 samples, 0.11%) + + + +$lambda (5,964 samples, 0.80%) + + + +place (480 samples, 0.06%) + + + +valid_moves (26,880 samples, 3.63%) +vali.. + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (66 samples, 0.01%) + + + +$lambda (351 samples, 0.05%) + + + +place (96 samples, 0.01%) + + + +board (256 samples, 0.03%) + + + +flip (76 samples, 0.01%) + + + +$lambda (25,500 samples, 3.44%) +$la.. + + +eventually (3,040 samples, 0.41%) + + + +@deserialize<III> (951 samples, 0.13%) + + + +place (351 samples, 0.05%) + + + +$lambda (497 samples, 0.07%) + + + +parse_idl_header (1,024 samples, 0.14%) + + + +board (9,443 samples, 1.27%) + + + +valid_moves (21,660 samples, 2.92%) +va.. + + +valid_moves (351 samples, 0.05%) + + + +place (84 samples, 0.01%) + + + +init (1,484 samples, 0.20%) + + + +place (216 samples, 0.03%) + + + +valid_moves (79,212 samples, 10.68%) +valid_moves + + +place (160 samples, 0.02%) + + + +place (3,971 samples, 0.54%) + + + +place (216 samples, 0.03%) + + + +@serialize<> (63 samples, 0.01%) + + + +$lambda (420 samples, 0.06%) + + + +$lambda (1,368 samples, 0.18%) + + + +board (1,152 samples, 0.16%) + + + +$lambda (11,190 samples, 1.51%) + + + +$lambda (256 samples, 0.03%) + + + +$lambda (216 samples, 0.03%) + + + +$lambda (792 samples, 0.11%) + + + +@serialize_go<t> (189 samples, 0.03%) + + + +idl_sub_buf_init (120 samples, 0.02%) + + + +$lambda (8,449 samples, 1.14%) + + + +board (8,449 samples, 1.14%) + + + +$lambda (4,860 samples, 0.66%) + + + +flip (204 samples, 0.03%) + + + +$lambda (136 samples, 0.02%) + + + +init (2,968 samples, 0.40%) + + + +eventually (1,024 samples, 0.14%) + + + +place (800 samples, 0.11%) + + + +place (192 samples, 0.03%) + + + +render (3,976 samples, 0.54%) + + + +place (84 samples, 0.01%) + + + +board (2,304 samples, 0.31%) + + + +reset (2,197 samples, 0.30%) + + + +$lambda (12,224 samples, 1.65%) + + + +$lambda (408 samples, 0.06%) + + + +parse_idl_header (264 samples, 0.04%) + + + +eventually (1,920 samples, 0.26%) + + + +render (364 samples, 0.05%) + + + +__wasm_call_ctors (665 samples, 0.09%) + + + +place (210 samples, 0.03%) + + + +opponent (6,252 samples, 0.84%) + + + +B_mul (16,472 samples, 2.22%) +B.. + + +obj_idx<0> (1,105 samples, 0.15%) + + + +B_sub (13,088 samples, 1.77%) + + + +place (1,700 samples, 0.23%) + + + +board (240 samples, 0.03%) + + + +$lambda (2,430 samples, 0.33%) + + + +$lambda (96 samples, 0.01%) + + + +memcmp (179 samples, 0.02%) + + + +leb128_decode (1,536 samples, 0.21%) + + + +set_and_flip (84 samples, 0.01%) + + + +blob_of_principal (66 samples, 0.01%) + + + +place (408 samples, 0.06%) + + + +flip (96 samples, 0.01%) + + + +canister_init (815 samples, 0.11%) + + + +render (3,976 samples, 0.54%) + + + +$lambda (456 samples, 0.06%) + + + +next (15,316 samples, 2.07%) +n.. + + +$lambda (800 samples, 0.11%) + + + +@deserialize<> (75 samples, 0.01%) + + + +alloc_array (168 samples, 0.02%) + + + +board (600 samples, 0.08%) + + + +place (492 samples, 0.07%) + + + +init (512 samples, 0.07%) + + + +flip (152 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (450 samples, 0.06%) + + + +place (136 samples, 0.02%) + + + +text_concat (24,084 samples, 3.25%) +tex.. + + +$lambda (462 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (2,298 samples, 0.31%) + + + +init (372 samples, 0.05%) + + + +next (2,528 samples, 0.34%) + + + +$lambda (64 samples, 0.01%) + + + +$lambda (10,180 samples, 1.37%) + + + +$lambda (441 samples, 0.06%) + + + +B_lt (30,720 samples, 4.14%) +B_lt + + +place (300 samples, 0.04%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (924 samples, 0.12%) + + + +$lambda (2,304 samples, 0.31%) + + + +text_to_buf (12,644 samples, 1.71%) + + + +canister_init (256 samples, 0.03%) + + + +$lambda (3,240 samples, 0.44%) + + + +board (7,056 samples, 0.95%) + + + +@deserialize_go<I> (459 samples, 0.06%) + + + +set_and_flip (342 samples, 0.05%) + + + +init (256 samples, 0.03%) + + + +board (252 samples, 0.03%) + + + +canister_init (128 samples, 0.02%) + + + +$lambda (9,443 samples, 1.27%) + + + +exists (10,656 samples, 1.44%) + + + +init (1,300 samples, 0.18%) + + + +$lambda (12,540 samples, 1.69%) + + + +text_to_buf (7,168 samples, 0.97%) + + + +$lambda (2,394 samples, 0.32%) + + + +set_and_flip (1,224 samples, 0.17%) + + + +set_and_flip (88 samples, 0.01%) + + + +place (204 samples, 0.03%) + + + +place (408 samples, 0.06%) + + + +place (666 samples, 0.09%) + + + +init (1,496 samples, 0.20%) + + + +$lambda (459 samples, 0.06%) + + + +place (180 samples, 0.02%) + + + +B_sub (27,812 samples, 3.75%) +B_sub + + +render (288 samples, 0.04%) + + + +set_and_flip (64 samples, 0.01%) + + + +place (25,500 samples, 3.44%) +place + + +range (2,470 samples, 0.33%) + + + +eventually (1,280 samples, 0.17%) + + + +place (60,348 samples, 8.14%) +place + + +$lambda (10,180 samples, 1.37%) + + + +blob_of_principal (815 samples, 0.11%) + + + +place (177 samples, 0.02%) + + + +init (650 samples, 0.09%) + + + +$lambda (462 samples, 0.06%) + + + +$lambda (660 samples, 0.09%) + + + +place (1,562 samples, 0.21%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (594 samples, 0.08%) + + + +reset (1,484 samples, 0.20%) + + + +$lambda (9,912 samples, 1.34%) + + + +place (168 samples, 0.02%) + + + +eventually (3,200 samples, 0.43%) + + + +set_and_flip (360 samples, 0.05%) + + + +render (2,304 samples, 0.31%) + + + +alloc_size<5>_tag<11> (845 samples, 0.11%) + + + +@deserialize<III> (99 samples, 0.01%) + + + +place (2,840 samples, 0.38%) + + + +place (459 samples, 0.06%) + + + +$lambda (441 samples, 0.06%) + + + +text_to_buf (17,348 samples, 2.34%) +t.. + + +board (3,052 samples, 0.41%) + + + +set_and_flip (408 samples, 0.06%) + + + +place (144 samples, 0.02%) + + + +reset (72 samples, 0.01%) + + + +place (384 samples, 0.05%) + + + +place (3,408 samples, 0.46%) + + + +flip (88 samples, 0.01%) + + + +reset (3,897 samples, 0.53%) + + + +set_and_flip (1,056 samples, 0.14%) + + + +$lambda (816 samples, 0.11%) + + + +reset (70 samples, 0.01%) + + + +valid_moves (1,672 samples, 0.23%) + + + +text_concat (256 samples, 0.03%) + + + +set_and_flip (216 samples, 0.03%) + + + +$lambda (364 samples, 0.05%) + + + +canister_init (68 samples, 0.01%) + + + +parse_idl_header (1,027 samples, 0.14%) + + + +$lambda (24,072 samples, 3.25%) +$la.. + + +$lambda (700 samples, 0.09%) + + + +$lambda (210 samples, 0.03%) + + + +@deserialize<III> (729 samples, 0.10%) + + + +flip (96 samples, 0.01%) + + + +nat_sub (11,452 samples, 1.54%) + + + +exists (30,720 samples, 4.14%) +exists + + +B_eq (36,890 samples, 4.98%) +B_eq + + +Array.idx (26,172 samples, 3.53%) +Arr.. + + +valid_moves (700 samples, 0.09%) + + + +$lambda (5,467 samples, 0.74%) + + + +canister_init (63 samples, 0.01%) + + + +valid_moves (1,704 samples, 0.23%) + + + +valid_moves (2,430 samples, 0.33%) + + + +$lambda (88 samples, 0.01%) + + + +board (5,467 samples, 0.74%) + + + +$lambda (432 samples, 0.06%) + + + +place (79,212 samples, 10.68%) +place + + +place (660 samples, 0.09%) + + + +place (360 samples, 0.05%) + + + +$lambda (1,704 samples, 0.23%) + + + +$lambda (1,088 samples, 0.15%) + + + +set_and_flip (204 samples, 0.03%) + + + +valid_moves (459 samples, 0.06%) + + + +$lambda (168 samples, 0.02%) + + + +$lambda (3,976 samples, 0.54%) + + + +@serialize<t> (10,180 samples, 1.37%) + + + +canister_init (512 samples, 0.07%) + + + +eventually (2,176 samples, 0.29%) + + + +canister_init (95 samples, 0.01%) + + + +$lambda (76 samples, 0.01%) + + + +init (80 samples, 0.01%) + + + +flip (136 samples, 0.02%) + + + +set_and_flip (160 samples, 0.02%) + + + +place (189 samples, 0.03%) + + + +canister_init (3,887 samples, 0.52%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (450 samples, 0.06%) + + + +board (1,288 samples, 0.17%) + + + +place (5,612 samples, 0.76%) + + + +__get_hp (378 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (164 samples, 0.02%) + + + +@serialize_go<t> (12,224 samples, 1.65%) + + + +board (1,152 samples, 0.16%) + + + +set_and_flip (144 samples, 0.02%) + + + +place (444 samples, 0.06%) + + + +render (468 samples, 0.06%) + + + +exists (15,984 samples, 2.16%) +e.. + + +$lambda (256 samples, 0.03%) + + + +trans_state4 (252 samples, 0.03%) + + + +flip (352 samples, 0.05%) + + + +compacting_gc (450 samples, 0.06%) + + + +valid_moves (3,502 samples, 0.47%) + + + +board (124 samples, 0.02%) + + + +eventually (1,904 samples, 0.26%) + + + +valid_moves (31,776 samples, 4.29%) +valid.. + + +$lambda (18,735 samples, 2.53%) +$l.. + + +$lambda (231 samples, 0.03%) + + + +valid_moves (7,242 samples, 0.98%) + + + +valid_moves (6,248 samples, 0.84%) + + + +board (112 samples, 0.02%) + + + +$lambda (2,840 samples, 0.38%) + + + +all (741,376 samples, 100%) + + + +place (342 samples, 0.05%) + + + +$lambda (198 samples, 0.03%) + + + +exists (29,340 samples, 3.96%) +exists + + +$lambda (864 samples, 0.12%) + + + +valid_moves (189 samples, 0.03%) + + + +compacting_gc (1,396 samples, 0.19%) + + + +place (192 samples, 0.03%) + + + +$lambda (360 samples, 0.05%) + + + +$lambda (512 samples, 0.07%) + + + +$lambda (252 samples, 0.03%) + + + +@serialize<> (66 samples, 0.01%) + + + +valid_moves (11,328 samples, 1.53%) + + + +place (198 samples, 0.03%) + + + +$lambda (192 samples, 0.03%) + + + +$lambda (26,880 samples, 3.63%) +$lam.. + + +$lambda (497 samples, 0.07%) + + + +reset (128 samples, 0.02%) + + + +place (352 samples, 0.05%) + + + +reset (66 samples, 0.01%) + + + +place (96 samples, 0.01%) + + + +render (612 samples, 0.08%) + + + +place (2,430 samples, 0.33%) + + + +flip (192 samples, 0.03%) + + + +canister_init (66 samples, 0.01%) + + + +board (468 samples, 0.06%) + + + +$lambda (95 samples, 0.01%) + + + +is_empty (275 samples, 0.04%) + + + +reset (68 samples, 0.01%) + + + +place (384 samples, 0.05%) + + + +set_and_flip (192 samples, 0.03%) + + + +place (2,840 samples, 0.38%) + + + +$lambda (351 samples, 0.05%) + + + +place (5,292 samples, 0.71%) + + + +render (468 samples, 0.06%) + + + +valid_moves (3,408 samples, 0.46%) + + + +$lambda (400 samples, 0.05%) + + + +$lambda (612 samples, 0.08%) + + + +set_and_flip (264 samples, 0.04%) + + + +place (351 samples, 0.05%) + + + +$lambda (4,896 samples, 0.66%) + + + +render (612 samples, 0.08%) + + + +init (256 samples, 0.03%) + + + +set_and_flip (96 samples, 0.01%) + + + +@serialize<t> (189 samples, 0.03%) + + + +$lambda (1,056 samples, 0.14%) + + + +place (7,242 samples, 0.98%) + + + +$lambda (420 samples, 0.06%) + + + +valid_moves (5,612 samples, 0.76%) + + + +$lambda (85 samples, 0.01%) + + + +$lambda (6,248 samples, 0.84%) + + + +$lambda (342 samples, 0.05%) + + + +set_and_flip (192 samples, 0.03%) + + + +$lambda (1,484 samples, 0.20%) + + + +board (468 samples, 0.06%) + + + +board (612 samples, 0.08%) + + + +canister_init (1,484 samples, 0.20%) + + + +place (456 samples, 0.06%) + + + +place (456 samples, 0.06%) + + + +flip (160 samples, 0.02%) + + + +$lambda (3,976 samples, 0.54%) + + + +reset (1,088 samples, 0.15%) + + + +reset (150 samples, 0.02%) + + + +eventually (784 samples, 0.11%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (35,063 samples, 4.73%) +motok.. + + +$lambda (5,664 samples, 0.76%) + + + +Array_init (168 samples, 0.02%) + + + +$lambda (64 samples, 0.01%) + + + +place (99 samples, 0.01%) + + + +reset (95 samples, 0.01%) + + + +@deserialize<> (165 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (630 samples, 0.08%) + + + +exists (14,652 samples, 1.98%) +e.. + + +board (252 samples, 0.03%) + + + +opponent (10,941 samples, 1.48%) + + + +place (864 samples, 0.12%) + + + +place (792 samples, 0.11%) + + + +valid_moves (459 samples, 0.06%) + + + +$lambda (288 samples, 0.04%) + + + +set_and_flip (136 samples, 0.02%) + + + +@deserialize<III> (441 samples, 0.06%) + + + +render (7,056 samples, 0.95%) + + + +$lambda (68 samples, 0.01%) + + + +$lambda (152 samples, 0.02%) + + + +valid_moves (928 samples, 0.13%) + + + +$lambda (288 samples, 0.04%) + + + +@serialize_go<t> (84 samples, 0.01%) + + + +place (700 samples, 0.09%) + + + +text_concat (924 samples, 0.12%) + + + +text_concat (3,052 samples, 0.41%) + + + +place (192 samples, 0.03%) + + + +set_and_flip (204 samples, 0.03%) + + + +place (99 samples, 0.01%) + + + +valid_moves (25,500 samples, 3.44%) +val.. + + +valid_moves (351 samples, 0.05%) + + + +board (12,224 samples, 1.65%) + + + +board (132 samples, 0.02%) + + + +place (6,248 samples, 0.84%) + + + +place (67,524 samples, 9.11%) +place + + +valid_moves (9,120 samples, 1.23%) + + + +place (2,698 samples, 0.36%) + + + +set_and_flip (160 samples, 0.02%) + + + +board (1,368 samples, 0.18%) + + + +valid_moves (60,348 samples, 8.14%) +valid_moves + + +place (9,912 samples, 1.34%) + + + +range (845 samples, 0.11%) + + + +set_and_flip (96 samples, 0.01%) + + + +board (132 samples, 0.02%) + + + +$lambda (70 samples, 0.01%) + + + +flip (64 samples, 0.01%) + + + +init (1,024 samples, 0.14%) + + + +$lambda (1,289 samples, 0.17%) + + + +set_and_flip (456 samples, 0.06%) + + + +eventually (448 samples, 0.06%) + + + +board (24,084 samples, 3.25%) +board + + +motoko_rts::memory::alloc_blob::h89549146b02728af (82 samples, 0.01%) + + + +canister_init (70 samples, 0.01%) + + + +$lambda (1,728 samples, 0.23%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (2,706 samples, 0.36%) + + + +init (95 samples, 0.01%) + + + +init (170 samples, 0.02%) + + + +board (132 samples, 0.02%) + + + +place (3,672 samples, 0.50%) + + + +reset (816 samples, 0.11%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (168 samples, 0.02%) + + + +$lambda (512 samples, 0.07%) + + + +place (288 samples, 0.04%) + + + +place (2,394 samples, 0.32%) + + + +$lambda (96 samples, 0.01%) + + + +place (2,472 samples, 0.33%) + + + +$lambda (11,328 samples, 1.53%) + + + +$lambda (192 samples, 0.03%) + + + +valid_moves (12,540 samples, 1.69%) + + + +place (1,972 samples, 0.27%) + + + +board (280 samples, 0.04%) + + + +$lambda (189 samples, 0.03%) + + + +@serialize<t> (462 samples, 0.06%) + + + +set_and_flip (576 samples, 0.08%) + + + +exists (77,316 samples, 10.43%) +exists + + +memcpy (16,865 samples, 2.27%) +m.. + + +$lambda (264 samples, 0.04%) + + + +opt_inject (2,546 samples, 0.34%) + + + +board (3,240 samples, 0.44%) + + + +valid_moves (5,292 samples, 0.71%) + + + +canister_init (172 samples, 0.02%) + + + +$lambda (3,502 samples, 0.47%) + + + +init (68 samples, 0.01%) + + + +board (7,168 samples, 0.97%) + + + +canister_init (104 samples, 0.01%) + + + +reset (748 samples, 0.10%) + + + +$lambda (408 samples, 0.06%) + + + +reset (512 samples, 0.07%) + + + +@serialize<> (72 samples, 0.01%) + + + +valid_moves (5,664 samples, 0.76%) + + + +$lambda (189 samples, 0.03%) + + + +$lambda (216 samples, 0.03%) + + + +$lambda (1,136 samples, 0.15%) + + + +place (351 samples, 0.05%) + + + +$lambda (7,168 samples, 0.97%) + + + +$lambda (2,472 samples, 0.33%) + + + +@serialize<t> (84 samples, 0.01%) + + + +canister_init (256 samples, 0.03%) + + + +init (2,197 samples, 0.30%) + + + +compacting_gc (2,298 samples, 0.31%) + + + +init (2,176 samples, 0.29%) + + + +bigint_sleb128_decode_word64 (459 samples, 0.06%) + + + +$lambda (3,672 samples, 0.50%) + + + +place (1,672 samples, 0.23%) + + + +place (729 samples, 0.10%) + + + +init (1,088 samples, 0.15%) + + + +@deserialize<III> (384 samples, 0.05%) + + + +$lambda (1,152 samples, 0.16%) + + + +reset (650 samples, 0.09%) + + + +place (729 samples, 0.10%) + + + +canister_init (85 samples, 0.01%) + + + +$lambda (204 samples, 0.03%) + + + +valid_moves (1,648 samples, 0.22%) + + + +set_and_flip (192 samples, 0.03%) + + + +$lambda (352 samples, 0.05%) + + + + diff --git a/flamegraphs/reversi.svg b/flamegraphs/reversi.svg new file mode 100644 index 00000000000..2324c862f9f --- /dev/null +++ b/flamegraphs/reversi.svg @@ -0,0 +1,1425 @@ + + + + + + + + + + + + + + +reversi.mo + +Reset Zoom +Search + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (172 samples, 0.02%) + + + +can_tag_i64 (11,328 samples, 1.53%) + + + +trans_state4 (112 samples, 0.02%) + + + +@buffer_size<t> (148 samples, 0.02%) + + + +B_sub (3,200 samples, 0.43%) + + + +Array_init (845 samples, 0.11%) + + + +init (8,523 samples, 1.15%) + + + +B_eq (210 samples, 0.03%) + + + +motoko_rts::text::alloc_text_blob::h9c03ea53d9f7bc09 (1,372 samples, 0.19%) + + + +can_tag_i64 (3,976 samples, 0.54%) + + + +memcpy (12,224 samples, 1.65%) + + + +Array.idx_bigint (414 samples, 0.06%) + + + +$lambda (30,924 samples, 4.17%) +$lam.. + + +motoko_rts::memory::alloc_blob::h89549146b02728af (288 samples, 0.04%) + + + +B_gt (2,430 samples, 0.33%) + + + +text_to_buf (19,392 samples, 2.62%) +te.. + + +obj_idx<0> (612 samples, 0.08%) + + + +Array.idx (816 samples, 0.11%) + + + +B_eq (18,735 samples, 2.53%) +B_eq + + +motoko_rts::memory::alloc_blob::h89549146b02728af (144 samples, 0.02%) + + + +B_add (1,600 samples, 0.22%) + + + +text_to_buf (264 samples, 0.04%) + + + +B_mul (3,834 samples, 0.52%) + + + +Array.idx (96 samples, 0.01%) + + + +B_ge (480 samples, 0.06%) + + + +B_eq (4,860 samples, 0.66%) + + + +B_add (5,400 samples, 0.73%) + + + +reset (13,901 samples, 1.88%) +r.. + + +opt_inject (1,152 samples, 0.16%) + + + +opt_project (1,152 samples, 0.16%) + + + +leb128_decode (512 samples, 0.07%) + + + +can_tag_i64 (192 samples, 0.03%) + + + +can_tag_i64 (1,672 samples, 0.23%) + + + +text_to_buf (29,728 samples, 4.01%) +text.. + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (18,932 samples, 2.55%) +mo.. + + +B_add (300 samples, 0.04%) + + + +Array.idx_bigint (69 samples, 0.01%) + + + +Array.idx_bigint (1,564 samples, 0.21%) + + + +can_tag_i64 (192 samples, 0.03%) + + + +alloc_array (141 samples, 0.02%) + + + +nat_sub (252 samples, 0.03%) + + + +memset (104 samples, 0.01%) + + + +Array.idx_bigint (26,220 samples, 3.54%) +Arr.. + + +opponent (3,600 samples, 0.49%) + + + +alloc_blob (114 samples, 0.02%) + + + +B_mul (108 samples, 0.01%) + + + +__set_hp (512 samples, 0.07%) + + + +memcpy (552 samples, 0.07%) + + + +trans_state4 (84 samples, 0.01%) + + + +alloc_blob (304 samples, 0.04%) + + + +B_add (7,200 samples, 0.97%) + + + +B_add (1,800 samples, 0.24%) + + + +B_mul (648 samples, 0.09%) + + + +parse_idl_header (1,084 samples, 0.15%) + + + +can_tag_i64 (96 samples, 0.01%) + + + +next (3,990 samples, 0.54%) + + + +Array.idx_bigint (184 samples, 0.02%) + + + +B_add (600 samples, 0.08%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (384 samples, 0.05%) + + + +Array.idx_bigint (4,738 samples, 0.64%) + + + +Array.idx (2,472 samples, 0.33%) + + + +B_ge (160 samples, 0.02%) + + + +$lambda (8,530 samples, 1.15%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (200 samples, 0.03%) + + + +Array.idx_bigint (1,564 samples, 0.21%) + + + +opponent (50,976 samples, 6.88%) +opponent + + +link_start (707 samples, 0.10%) + + + +B_eq (11,190 samples, 1.51%) + + + +exists (280,218 samples, 37.80%) +exists + + +nat_sub (9,912 samples, 1.34%) + + + +Array.idx (1,704 samples, 0.23%) + + + +@buffer_size<t> (111 samples, 0.01%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (128 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (120 samples, 0.02%) + + + +can_tag_i64 (64 samples, 0.01%) + + + +opponent (432 samples, 0.06%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.01%) + + + +B_gt (650 samples, 0.09%) + + + +B_lt (26,880 samples, 3.63%) +B_lt + + +Array.idx_bigint (11,431 samples, 1.54%) + + + +@serialize<> (229 samples, 0.03%) + + + +memset (444 samples, 0.06%) + + + +bigint_sleb128_decode_word64 (459 samples, 0.06%) + + + +Array.idx_bigint (3,266 samples, 0.44%) + + + +can_tag_i64 (9,120 samples, 1.23%) + + + +Array.idx (13,680 samples, 1.85%) +A.. + + +B_sub (384 samples, 0.05%) + + + +B_mul (216 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (1,288 samples, 0.17%) + + + +B_add (1,600 samples, 0.22%) + + + +$lambda (527,624 samples, 71.17%) +$lambda + + +B_lt (2,840 samples, 0.38%) + + + +B_mul (30,780 samples, 4.15%) +B_mul + + +B_sub (45,312 samples, 6.11%) +B_sub + + +can_tag_i64 (432 samples, 0.06%) + + + +@deserialize<III> (4,650 samples, 0.63%) + + + +exists (3,892 samples, 0.52%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (120 samples, 0.02%) + + + +can_tag_i64 (3,976 samples, 0.54%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (4,501 samples, 0.61%) + + + +@deserialize<> (513 samples, 0.07%) + + + +B_eq (130 samples, 0.02%) + + + +can_tag_i64 (216 samples, 0.03%) + + + +B_gt (3,240 samples, 0.44%) + + + +canister_init (16,667 samples, 2.25%) +c.. + + +can_tag_i64 (1,648 samples, 0.22%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (216 samples, 0.03%) + + + +B_ge (360 samples, 0.05%) + + + +memcpy (213 samples, 0.03%) + + + +B_mul (13,419 samples, 1.81%) +B.. + + +exists (30,738 samples, 4.15%) +exists + + +B_lt (160 samples, 0.02%) + + + +text_concat (29,276 samples, 3.95%) +text.. + + +nat_sub (168 samples, 0.02%) + + + +B_sub (160 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (108 samples, 0.01%) + + + +leb128_decode (256 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (13,785 samples, 1.86%) +m.. + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::ha72b7d8bb8fa3d93 (150 samples, 0.02%) + + + +Array_init (2,535 samples, 0.34%) + + + +alloc_size<2>_tag<9> (351 samples, 0.05%) + + + +B_add (12,425 samples, 1.68%) + + + +nat_sub (700 samples, 0.09%) + + + +opt_project (256 samples, 0.03%) + + + +B_add (2,900 samples, 0.39%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.01%) + + + +board (163,562 samples, 22.06%) +board + + +opt_project (256 samples, 0.03%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (512 samples, 0.07%) + + + +can_tag_i64 (1,136 samples, 0.15%) + + + +blob_of_principal (2,083 samples, 0.28%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (1,008 samples, 0.14%) + + + +motoko_rts::memory::alloc_array::haa7cdeb7ecf340fc (135 samples, 0.02%) + + + +B_sub (768 samples, 0.10%) + + + +alloc_size<2>_tag<9> (468 samples, 0.06%) + + + +@serialize<t> (1,134 samples, 0.15%) + + + +$lambda (1,161 samples, 0.16%) + + + +B_mul (81 samples, 0.01%) + + + +compacting_gc (18,936 samples, 2.55%) +co.. + + +memset (104 samples, 0.01%) + + + +memcpy (240 samples, 0.03%) + + + +all (741,376 samples, 100%) + + + +opt_project (864 samples, 0.12%) + + + +leb128_decode (64 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (360 samples, 0.05%) + + + +B_sub (256 samples, 0.03%) + + + +B_mul (135 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.01%) + + + +Array.idx_bigint (552 samples, 0.07%) + + + +B_mul (5,643 samples, 0.76%) + + + +init (11,572 samples, 1.56%) + + + +B_lt (480 samples, 0.06%) + + + +B_add (5,150 samples, 0.69%) + + + +B_mul (486 samples, 0.07%) + + + +B_add (75 samples, 0.01%) + + + +motoko_rts::types::block_size::ha8bfcd1b78b6bc84 (128 samples, 0.02%) + + + +alloc_blob (228 samples, 0.03%) + + + +B_gt (650 samples, 0.09%) + + + +can_tag_i64 (512 samples, 0.07%) + + + +B_ge (2,840 samples, 0.38%) + + + +compacting_gc (13,788 samples, 1.86%) +c.. + + +can_tag_i64 (1,728 samples, 0.23%) + + + +range (2,079 samples, 0.28%) + + + +valid_moves (508,309 samples, 68.56%) +valid_moves + + +parse_idl_header (271 samples, 0.04%) + + + +range (77 samples, 0.01%) + + + +$lambda (142,102 samples, 19.17%) +$lambda + + +B_mul (81 samples, 0.01%) + + + +eventually (5,284 samples, 0.71%) + + + +alloc_size<4>_tag<1> (468 samples, 0.06%) + + + +B_eq (1,060 samples, 0.14%) + + + +can_tag_i64 (800 samples, 0.11%) + + + +opt_inject (256 samples, 0.03%) + + + +nat_sub (189 samples, 0.03%) + + + +B_add (100 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (666 samples, 0.09%) + + + +flip (2,976 samples, 0.40%) + + + +compacting_gc (4,502 samples, 0.61%) + + + +B_add (10,650 samples, 1.44%) + + + +B_add (75 samples, 0.01%) + + + +can_tag_i64 (144 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_object::h3e7e6e626ab2d749 (480 samples, 0.06%) + + + +Array.idx_bigint (92 samples, 0.01%) + + + +B_sub (1,152 samples, 0.16%) + + + +leb128_decode (192 samples, 0.03%) + + + +opt_inject (256 samples, 0.03%) + + + +sleb128_decode (729 samples, 0.10%) + + + +nat_sub (84 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (5,043 samples, 0.68%) + + + +alloc_blob (76 samples, 0.01%) + + + +can_tag_i64 (576 samples, 0.08%) + + + +is_empty (1,201 samples, 0.16%) + + + +__wasm_apply_data_relocs (665 samples, 0.09%) + + + +eventually (42,850 samples, 5.78%) +eventua.. + + +can_tag_i64 (2,304 samples, 0.31%) + + + +can_tag_i64 (192 samples, 0.03%) + + + +range (77 samples, 0.01%) + + + +@deserialize<> (2,052 samples, 0.28%) + + + +Array.idx (216 samples, 0.03%) + + + +B_add (99,300 samples, 13.39%) +B_add + + +Array.idx_bigint (69 samples, 0.01%) + + + +can_tag_i64 (64 samples, 0.01%) + + + +__wasm_call_ctors (666 samples, 0.09%) + + + +memset (744 samples, 0.10%) + + + +idl_sub_buf_init (76 samples, 0.01%) + + + +obj_idx<0> (459 samples, 0.06%) + + + +B_lt (360 samples, 0.05%) + + + +leb128_decode (128 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.01%) + + + +leb128_decode (384 samples, 0.05%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::he72fc0ccc1fe71c4 (172 samples, 0.02%) + + + +Array.idx (5,964 samples, 0.80%) + + + +can_tag_i64 (96 samples, 0.01%) + + + +memcpy (72 samples, 0.01%) + + + +next (3,990 samples, 0.54%) + + + +B_eq (70 samples, 0.01%) + + + +alloc_size<5>_tag<11> (351 samples, 0.05%) + + + +next (13,986 samples, 1.89%) +n.. + + +motoko_rts::memory::alloc_blob::h89549146b02728af (108 samples, 0.01%) + + + +motoko_rts::principal_id::enc_stash::h33aae6b770b75b52 (372 samples, 0.05%) + + + +can_tag_i64 (512 samples, 0.07%) + + + +can_tag_i64 (928 samples, 0.13%) + + + +opponent (108 samples, 0.01%) + + + +render (111,130 samples, 14.99%) +render + + +opponent (288 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (144 samples, 0.02%) + + + +place (546,539 samples, 73.72%) +place + + +init (8,523 samples, 1.15%) + + + +opt_inject (864 samples, 0.12%) + + + +set_and_flip (16,164 samples, 2.18%) +s.. + + +can_tag_i64 (31,776 samples, 4.29%) +can_t.. + + +B_sub (96 samples, 0.01%) + + + +can_tag_i64 (288 samples, 0.04%) + + + +B_sub (160 samples, 0.02%) + + + +@serialize_go<t> (393 samples, 0.05%) + + + +B_add (1,350 samples, 0.18%) + + + +can_tag_i64 (3,408 samples, 0.46%) + + + +next (18,648 samples, 2.52%) +next + + +B_mul (135 samples, 0.02%) + + + +__get_hp (256 samples, 0.03%) + + + +can_tag_i64 (96 samples, 0.01%) + + + +Array.idx (816 samples, 0.11%) + + + +@serialize_go<t> (29,900 samples, 4.03%) +@ser.. + + +opponent (864 samples, 0.12%) + + + +parse_idl_header (1,713 samples, 0.23%) + + + +alloc_blob (152 samples, 0.02%) + + + +range (2,772 samples, 0.37%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (216 samples, 0.03%) + + + +alloc_size<5>_tag<11> (468 samples, 0.06%) + + + +exists (1,732 samples, 0.23%) + + + +sleb128_decode (729 samples, 0.10%) + + + +B_add (100 samples, 0.01%) + + + +B_eq (300 samples, 0.04%) + + + +memcpy (180 samples, 0.02%) + + + +@deserialize_go<I> (900 samples, 0.12%) + + + +Array.idx (288 samples, 0.04%) + + + +memcpy (3,052 samples, 0.41%) + + + +compacting_gc (5,044 samples, 0.68%) + + + +memcmp (179 samples, 0.02%) + + + +B_ge (25,500 samples, 3.44%) +B_ge + + +alloc_size<4>_tag<1> (351 samples, 0.05%) + + + +B_eq (275 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (288 samples, 0.04%) + + + +B_add (300 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::h89549146b02728af (72 samples, 0.01%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (949 samples, 0.13%) + + + +exists (5,226 samples, 0.70%) + + + +@serialize<t> (30,888 samples, 4.17%) +@ser.. + + +memcpy (284 samples, 0.04%) + + + +B_sub (864 samples, 0.12%) + + + + diff --git a/flamegraphs/sha256-reverse.svg b/flamegraphs/sha256-reverse.svg new file mode 100644 index 00000000000..b2a8d398aa9 --- /dev/null +++ b/flamegraphs/sha256-reverse.svg @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + +sha256.mo (reverse) + +Reset Zoom +Search + + + +go (7,502 samples, 0.16%) + + + +canister_init (815 samples, 0.02%) + + + +link_start (665 samples, 0.01%) + + + +anon-func-97.43 (8,184 samples, 0.17%) + + + +Array_tabulate (3,557,443 samples, 74.66%) +Array_tabulate + + +canister_init (683 samples, 0.01%) + + + +tabulate (1,179,648 samples, 24.76%) +tabulate + + +go (5,456 samples, 0.11%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (472 samples, 0.01%) + + + +init (798 samples, 0.02%) + + + +write (7,502 samples, 0.16%) + + + +sha256 (18,468 samples, 0.39%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (683 samples, 0.01%) + + + +blob_of_principal (815 samples, 0.02%) + + + +sha256 (7,502 samples, 0.16%) + + + +Digest (798 samples, 0.02%) + + + +go (3,538,975 samples, 74.27%) +go + + +Array_tabulate (7,502 samples, 0.16%) + + + +init (815 samples, 0.02%) + + + +tabulate (3,557,443 samples, 74.66%) +tabulate + + +tabulate (8,184 samples, 0.17%) + + + +sha256 (798 samples, 0.02%) + + + +Array_tabulate (1,179,648 samples, 24.76%) +Array_tabulate + + +intToNat8Wrap (1,179,648 samples, 24.76%) +intToNat8Wrap + + +$lambda (798 samples, 0.02%) + + + +anon-func-97.43 (5,456 samples, 0.11%) + + + +__wasm_apply_data_relocs (665 samples, 0.01%) + + + +write (8,184 samples, 0.17%) + + + +$lambda (3,538,975 samples, 74.27%) +$lambda + + +go (1,179,648 samples, 24.76%) +go + + +$lambda (1,179,648 samples, 24.76%) +$lambda + + +$lambda (5,456 samples, 0.11%) + + + +$lambda (18,468 samples, 0.39%) + + + +tabulate (5,456 samples, 0.11%) + + + +write (5,456 samples, 0.11%) + + + +Array_tabulate (8,184 samples, 0.17%) + + + +canister_init (472 samples, 0.01%) + + + +all (4,765,173 samples, 100%) + + + +go (8,184 samples, 0.17%) + + + +go (798 samples, 0.02%) + + + +sha256 (8,184 samples, 0.17%) + + + +Array_tabulate (5,456 samples, 0.11%) + + + +tabulate (7,502 samples, 0.16%) + + + +Array_init (924 samples, 0.02%) + + + +$lambda (7,502 samples, 0.16%) + + + +__wasm_call_ctors (665 samples, 0.01%) + + + +init (472 samples, 0.01%) + + + +$lambda (8,184 samples, 0.17%) + + + +compacting_gc (683 samples, 0.01%) + + + +write (18,468 samples, 0.39%) + + + +anon-func-97.43 (7,502 samples, 0.16%) + + + +go (18,468 samples, 0.39%) + + + +blob_of_principal (472 samples, 0.01%) + + + +Array.idx_bigint (8,388 samples, 0.18%) + + + +Array.idx (8,388 samples, 0.18%) + + + +Array.idx_bigint (7,689 samples, 0.16%) + + + +sha256 (5,456 samples, 0.11%) + + + + diff --git a/flamegraphs/sha256.svg b/flamegraphs/sha256.svg new file mode 100644 index 00000000000..4f8e1fbcc5a --- /dev/null +++ b/flamegraphs/sha256.svg @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + +sha256.mo + +Reset Zoom +Search + + + +thaw (759 samples, 0.02%) + + + +init (2,162 samples, 0.05%) + + + +@deserialize<> (513 samples, 0.01%) + + + +compacting_gc (1,109 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h72afc21d4eca1cd2 (1,108 samples, 0.02%) + + + +sha256 (41,789 samples, 0.88%) + + + +all (4,765,173 samples, 100%) + + + +Array_tabulate (4,718,707 samples, 99.02%) +Array_tabulate + + +__wasm_call_ctors (666 samples, 0.01%) + + + +Digest (1,847 samples, 0.04%) + + + +motoko_rts::principal_id::principal_of_blob::h899613e1db0b21a5 (949 samples, 0.02%) + + + +intToNat8Wrap (1,179,648 samples, 24.76%) +intToNat8Wrap + + +tabulate (4,718,711 samples, 99.02%) +tabulate + + +__wasm_apply_data_relocs (665 samples, 0.01%) + + + +go (4,761,144 samples, 99.92%) +go + + +$lambda (4,760,541 samples, 99.90%) +$lambda + + +canister_init (3,322 samples, 0.07%) + + + +write (39,905 samples, 0.84%) + + + +blob_of_principal (2,083 samples, 0.04%) + + + +link_start (707 samples, 0.01%) + + + +init (849 samples, 0.02%) + + + +anon-func-97.43 (21,142 samples, 0.44%) + + + +Array.idx (8,184 samples, 0.17%) + + + +Array_tabulate (39,694 samples, 0.83%) + + + +tabulate (39,698 samples, 0.83%) + + + +Array_init (845 samples, 0.02%) + + + +Array.idx_bigint (15,686 samples, 0.33%) + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000000..57cd7af3e43 --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + + + + + + Motoko build reports + + + +

Motoko build reports

+ .
+ |-- base-doc
+ |-- coverage
+ |-- docs
+ | |-- html
+ | | `-- motoko.html
+ | `-- overview-slides.html
+ `-- flamegraphs
+

+ +5 directories, 2 files + +

+
+

+ tree v2.0.4 (c) 1996 - 2022 by Steve Baker and Thomas Moore
+ HTML output hacked and copyleft (c) 1998 by Francesc Rocher
+ JSON output hacked and copyleft (c) 2014 by Florian Sesser
+ Charsets / OS/2 support (c) 2001 by Kyosuke Tokoro +

+ +